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)
我有一个包含 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)