简单统计
if __name__ == '__main__':
saying = ['After', 'all', 'is', 'said', 'and', 'done',
'more', 'is', 'said', 'than', 'done']
tokens = set(saying)
tokens = sorted(tokens)
print(tokens)
print(tokens[-2:])
因为我们经常需要在语言处理中使用频率分布,NLTK 中内置了它们。让我们使用FreqDist 寻找《白鲸记》中最常见的50 个词。尝试下面的例子,然后阅读接下来的解释
if __name__ == '__main__':
fdist1=FreqDist(text1)
print(fdist1.keys())
print(fdist1.items())
v = sorted(fdist1.items(),key=lambda jj:jj[1],reverse=True)
s = []
for i in range(len(v)):
s.append(v[i][0])
print(s)
fdist1.plot(50,cumulative=True)
细粒度的选择单词
接下来,让我们看看文本中的长词,也许它们有更多的特征和信息量。为此我们采用集
合论的一些符号。我们想要找出文本词汇表长度中超过15 个字符的词,定义这个性质为P,则P(w)为真当且仅当词w 的长度大余15 个字符。现在我们可以用(1a)中的数学集合符号表示我们感兴趣的词汇。它的含义是:此集合中所有w 都满足w 是集合V(词汇表)的一个元素且w 有性质P。
(1) a. {w | w ∈ V & P(w)}
b. [w for w in V if p(w)]
(1b)给出了对应的Python表达式。(请注意,它产生一个链表,而不是集合,这意味
着可能会有相同的元素。)观察这两个表达式它们是多么相似。让我们进行下一步,编写可
执行的Python 代码:
if __name__ == '__main__':
V = set(text1)
long_words = [w for w in V if len(w) > 15]
print(sorted(long_words))
['CIRCUMNAVIGATION', 'Physiognomically','apprehensiveness', 'cannibalistically',
'characteristically','circumnavigating', 'circumnavigation', 'circumnavigations',
'comprehensiveness','hermaphroditical', 'indiscriminately', 'indispensableness',
'irresistibleness','physiognomically', 'preternaturalness', 'responsibilities',
'simultaneousness','subterraneousness', 'supernaturalness', 'superstitiousness',
'uncomfortableness','uncompromisedness', 'undiscriminating', 'uninterpenetratingly']
对于词汇表V 中的每一个词w,我们检查len(w)是否大于15;所有其他词汇将被忽略。
让我们回到寻找文本特征词汇的任务上来。请注意,text4 中的长词反映国家主题
——constitutionally(按宪法规定的,本质地),transcontinental(横贯大陆的)——而text
5 中的长词是非正规表达方式,例如boooooooooooglyyyyyy 和yuuuuuuuuuuuummmmmmmmmmmm。我们是否已经成功的自动提取出文本的特征词汇呢?好的,这些很长的词通常是hapaxes(即唯一的),也许找长词出现的频率会更好。这样看起来更有前途,因为这样忽略了短高频词(如the)和长低频词(如antiphilosophists)。以下是聊天语料库中所有长度超过7个字符出现次数超过7次的词:
if __name__ == '__main__':
fdist1 = FreqDist(text4)
long_words = [w for w in set(text4)if len(w)> 7 and fdist1[w]> 7]
print(sorted(long_words))
注意我们是如何使用两个条件:len(w) > 7 保证词长都超过七个字母,fdist1[w]> 7
保证这些词出现超过7 次。最后,我们已成功地自动识别出与文本内容相关的高频词。这很小的一步却是一个重要的里程碑:一小块代码,处理数以万计的词,产生一些有信息量的输出。