1

我可以使用 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 = 句子中的出现次数。

4

1 回答 1

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}
于 2012-05-11T17:20:57.103 回答