我正在尝试编写一个脚本,该脚本将遍历我的语料库,其中包含93,000个txt文件,并找到存在于它们中的所有字母的频率分布(因此不是单独的频率分布,而是整个语料库的一个频率分布)。我已经了解到它可以对语料库中的单个文件进行频率分配,但是根本不具备进一步获取知识的技能。这是代码:
import nltk
import re
from nltk.corpus.reader.plaintext import PlaintextCorpusReader
from nltk import FreqDist
corpus_root = '/Users/jolijttamanaha/Python/CRspeeches'
speeches = PlaintextCorpusReader(corpus_root, '.*\.txt')
print "Finished importing corpus"
f = speeches.open('Mr. THOMPSON of Pennsylvania.2010-12-07.2014sep17_at_233337.txt')
raw = f.read()
tokens = nltk.word_tokenize(raw)
tgs = nltk.trigrams(tokens)
fdist = nltk.FreqDist(tgs)
for k,v in fdist.items():
print k,v
Run Code Online (Sandbox Code Playgroud)
预先感谢您的帮助。
一旦使用定义了speeches语料库PlaintextCorpusReader,就可以非常简单地获得整个语料库的卦:
fdist = nltk.FreqDist(nltk.trigrams(speeches.words()))
Run Code Online (Sandbox Code Playgroud)
但这有一个不希望的故障:它形成了从一个文件的末尾到下一个文件的三字母组。但是,此类三字母组合并不表示可以在文本中彼此跟随的标记-它们完全是偶然的。您真正想要的是将每个文件的三字母组合计数组合起来,您可以像这样获得:
fdist = nltk.FreqDist() # Empty distribution
for filename in speeches.fileids():
fdist.update(nltk.trigrams(speeches.words(filename)))
Run Code Online (Sandbox Code Playgroud)
您fdist现在包含累积统计,您可以在各种可用的方式检查。例如,
fdist.tabulate(10)
Run Code Online (Sandbox Code Playgroud)