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)。我需要这个过程的最佳解决方案。可能应该并行处理多线程。
我不需要一次完整的列表,它可以流式传输。
首先,确保您的文件中有行,然后不用担心您可以逐行阅读(此处讨论):
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)