使用NLTK查找整个语料库的卦

Jol*_*aha 2 python nltk

我正在尝试编写一个脚本,该脚本将遍历我的语料库,其中包含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)

预先感谢您的帮助。

ale*_*xis 5

一旦使用定义了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)