使用NLTK查找整个语料库的三元组

时间:2014-09-29 02:34:01

标签: 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

提前感谢您的帮助。

2 个答案:

答案 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