0

我有一个包含 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. 最终,我将字符串拆分为标记并调用相关的二元组函数。问题是;

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

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

4

2 回答 2

1

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

NLTK 提供了各种“语料库阅读器”,可以一个一个地返回你的单词,从而使完整的语料库永远不会同时存储在内存中。如果我正确理解您的语料库布局,这可能会起作用:

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)
于 2016-03-13T22:30:27.960 回答
0

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

于 2016-03-13T20:12:08.920 回答