python 中的二元语法,包含大量 txt 文件

Bi-grams in python with lots of txt files

我有一个包含 70,429 个文件 (296.5 mb) 的语料库。我尝试使用整个语料库来查找二元语法。我写了下面的代码;

allFiles = ""
for dirName in os.listdir(rootDirectory):
     for subDir in os.listdir(dirName):
         for fileN in os.listdir(subDir):
             FText = codecs.open(fileN, encoding="'iso8859-9'")
             PText = FText.read()
             allFiles += PText
tokens = allFiles.split()
finder = BigramCollocationFinder.from_words(tokens, window_size = 3)
finder.apply_freq_filter(2)
bigram_measures = nltk.collocations.BigramAssocMeasures()
for k,v in finder.ngram_fd.most_common(100):
    print(k,v)

有根目录,根目录下有子目录,每个子目录下有很多文件。我所做的是;

我逐一读取所有文件并将上下文添加到名为 allFiles 的字符串中。最后,我将字符串拆分为标记并调用相关的二元语法函数。问题是;

我运行一天的程序,没有得到任何结果。有没有更有效的方法在包含大量文件的语料库中查找二元语法?

任何意见和建议将不胜感激。提前致谢。

考虑使用 Python 的 "Multiprocessing" 线程池 (https://docs.python.org/2/library/multiprocessing.html) 将您的进程并行化,为语料库中的每个文件发出一个包含 {word : count} 的字典到一些共享的列表。工作池完成后,在按单词出现次数过滤之前合并词典。

通过尝试一次将庞大的语料库读入内存,您正在耗尽内存,迫使大量交换使用,并减慢一切。

NLTK提供了多种"corpus readers"可以return你的单词一个一个的,这样完整的语料库就不会同时存储在内存中。如果我正确理解您的语料库布局,这可能会起作用:

from nltk.corpus.reader import PlaintextCorpusReader
reader = PlaintextCorpusReader(rootDirectory, "*/*/*", encoding="iso8859-9")
finder = BigramCollocationFinder.from_words(reader.words(), window_size = 3)
finder.apply_freq_filter(2) # Continue processing as before
...

附录:你的方法有一个错误:你正在使用从一个文档的末尾到下一个文档的开头的三元组......你想要的是胡说八道摆脱。我推荐以下变体,它分别从每个文档中收集三元组。

document_streams = (reader.words(fname) for fname in reader.fileids())
BigramCollocationFinder.default_ws = 3
finder = BigramCollocationFinder.from_documents(document_streams)