我试图编写一个脚本,通过我的语料库查看包含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
提前感谢您的帮助。
答案 0 :(得分:4)
使用speeches
定义PlaintextCorpusReader
语料库后,您可以非常简单地获得整个语料库的三元组:
fdist = nltk.FreqDist(nltk.trigrams(speeches.words()))
但是这有一个不合需要的故障:它形成从一个文件的末尾到下一个文件的三元组。但是这样的三元组并不代表在文本中可以互相跟随的标记 - 它们完全是偶然的。你真正想要的是结合每个文件的三元组计数,你可以这样得到:
fdist = nltk.FreqDist() # Empty distribution
for filename in speeches.fileids():
fdist.update(nltk.trigrams(speeches.words(filename)))
您的fdist
现在包含累积统计信息,您可以通过各种可用方式进行检查。如,
fdist.tabulate(10)
答案 1 :(得分:1)
对于预编码的语料库API,您可以尝试使用corpus.raw()
,而不是corpus.words()
,例如。
>>> from nltk.util import ngrams
>>> from nltk.corpus import brown
>>> brown.words()
[u'The', u'Fulton', u'County', u'Grand', u'Jury', ...]
>>> trigrams = ngrams(brown.words(), 3)
>>> for i in trigrams:
... print i
正如@alexis指出的那样,上面的代码也适用于加载PlaintextCorpusReader
的自定义语料库,请参阅http://www.nltk.org/_modules/nltk/corpus/reader/plaintext.html