如何在Python中使用NLTK有效地查找字母列表的出现?

时间:2012-05-11 15:44:41

标签: python nltk

我可以用NLTK python2.6阅读文本语料库:

from nltk.corpus import gutenberg
for fileid in gutenberg.fileids():
    num_chars = len(gutenberg.raw(fileid)) 
    num_words = len(gutenberg.words(fileid))
    num_sents = len(gutenberg.sents(fileid))
    num_vocab = len(set([w.lower() for w in gutenberg.words(fileid)]))
    print int(num_chars/num_words), int(num_words/num_sents), int(num_words/num_vocab), fileid

现在我想通过单词和句子找到平均出现的字母,比如num_letters(whole_text,['a','bb','ccc'])。预期产出是:

a = n11 / n12,bb = n21 / n22,ccc = n31 / n32

其中n11 =单词出现,n12 =句子出现。

1 个答案:

答案 0 :(得分:2)

您可以使用正则表达式在大部分文本中查找要匹配的每个元素的所有匹配项来执行此操作:

import re
matches = ['a', 'bb', 'ccc', 'and']

#add this line into your for loop:
    num_letter_dict = dict([(match, len([seq.start() for seq in 
            re.finditer(match, gutenberg.raw(fileid))])) for match in matches])

这将创建所有匹配及其频率的字典。因此,对于第一个文本austen-emma.txt,我们得到num_letter_dict

{'a': 53669, 'and': 5257, 'ccc': 0, 'bb': 52}

从这里到单词和句子中的平均出现次数是直截了当的,分别按num_wordsnum_sents分开。

要查找包含这些元素的单词数(不计算单词中的重复数),请使用:

num_letter_in_words = dict([(match, len([word for word in gutenberg.words(fileid)
                                      if match in word])) for match in matches])
#from the same text gives:
{'a': 50043, 'and': 5257, 'ccc': 0, 'bb': 52}

举个例子:

text = 'apples pairs bannanas'
matches = ['a', 'n', 'p']
#gives:
{'a': 3, 'p': 2, 'n': 1}