从大文本中提取 n 克

Ara*_*avi -2 python performance text-processing nlp bigdata

例如,我们有以下文本:

“Spark 是一个用于编写快速分布式程序的框架。Spark 解决了与 Hadoop MapReduce 类似的问题,但采用了快速的内存方法和简洁的函数式 API。......”

我需要这个文本的所有可能的部分,一字一字,然后两两,三三到五到五。像这样:

: ['Spark', 'is', 'a', 'framework', 'for', 'writing, 'fast', 'distributed', 'programs', ...]

twos : ['Spark is', 'is a', 'a framework', 'framework for', 'for writing' ...]

三:['Spark is a', 'is a framework', 'a framework for', 'framework for writing', 'for write fast', ...]

. . .

五:['Spark 是一个框架','是一个写作框架','一个快速写作的框架','一个快速分布式写作的框架',...]

请注意,要处理的文本是大文本(约 100GB)。我需要这个过程的最佳解决方案。可能应该并行处理多线程。

我不需要一次完整的列表,它可以流式传输。

Meh*_*hdi 5

首先,确保您的文件中有行,然后不用担心您可以逐行阅读(此处讨论):

with open('my100GBfile.txt') as corpus:
    for line in corpus:
        sequence = preprocess(line)
        extract_n_grams(sequence)
Run Code Online (Sandbox Code Playgroud)

假设您的语料库不需要任何特殊处理。我想您可以为您的文本找到合适的处理方法,我只希望将其放入理想的标记中:

def preprocess(string):
    # do what ever preprocessing that it needs to be done
    # e.g. convert to lowercase: string = string.lower()
    # return the sequence of tokens
    return string.split()
Run Code Online (Sandbox Code Playgroud)

我不知道你想用 n-gram 做什么。让我们假设您想将它们算作适合您记忆的语言模型(通常是这样,但我不确定 4 克和 5 克)。简单的方法是使用现成的nltk库:

from nltk.util import ngrams

lm = {n:dict() for n in range(1,6)}
def extract_n_grams(sequence):
    for n in range(1,6):
        ngram = ngrams(sentence, n)
        # now you have an n-gram you can do what ever you want
        # yield ngram
        # you can count them for your language model?
        for item in ngram:
            lm[n][item] = lm[n].get(item, 0) + 1
Run Code Online (Sandbox Code Playgroud)