3.2 细粒度的选择词

接下来,让我们看看文本中的 词,也许它们有更多的特征和信息量。为此我们采用集合论的一些符号。我们想要找出文本词汇表长度中超过 15 个字符的词。我们定义这个性质为 P,则 P(w) 为真当且仅当词 w 的长度大余 15 个字符。现在我们可以用(1a) 中的数学集合符号表示我们感兴趣的词汇。它的含义是:此集合中所有 w 都满足 w 是集合 V V(词汇表)的一个元素且 w 有性质 P。

  1. >>> V = set(text1)
  2. >>> long_words = [w for w in V if len(w) > 15]
  3. >>> sorted(long_words)
  4. ['CIRCUMNAVIGATION', 'Physiognomically', 'apprehensiveness', 'cannibalistically',
  5. 'characteristically', 'circumnavigating', 'circumnavigation', 'circumnavigations',
  6. 'comprehensiveness', 'hermaphroditical', 'indiscriminately', 'indispensableness',
  7. 'irresistibleness', 'physiognomically', 'preternaturalness', 'responsibilities',
  8. 'simultaneousness', 'subterraneousness', 'supernaturalness', 'superstitiousness',
  9. 'uncomfortableness', 'uncompromisedness', 'undiscriminating', 'uninterpenetratingly']
  10. >>>

对于词汇表V 中的每一个词w,我们检查len(w) 是否大于 15;所有其他词汇将被忽略。我们将在后面更仔细的讨论这里的语法。

注意

轮到你来: 在 Python 解释器中尝试上面的表达式,改变文本和长度条件做一些实验。如果改变变量名,你的结果会产生什么变化吗,如使用[word for word in vocab if ...]

让我们回到寻找文本特征词汇的任务上来。请注意,text4 中的长词反映国家主题 — constitutionally, transcontinental — 而text5 中的长词反映的不是真正的内容 boooooooooooglyyyyyy 和 yuuuuuuuuuuuummmmmmmmmmmm。我们是否已经成功的自动提取出文本的特征词汇呢?好的,这些很长的词通常是 hapaxes(即唯一的),也许找出 频繁出现的 长词会更好。这样看起来更有前途,因为这样忽略了短高频词(如 the)和长低频词(如 antiphilosophists)。以下是聊天语料库中所有长度超过 7 个字符,且出现次数超过 7 次的词:

  1. >>> fdist5 = FreqDist(text5)
  2. >>> sorted(w for w in set(text5) if len(w) > 7 and fdist5[w] > 7)
  3. ['#14-19teens', '#talkcity_adults', '((((((((((', '........', 'Question',
  4. 'actually', 'anything', 'computer', 'cute.-ass', 'everyone', 'football',
  5. 'innocent', 'listening', 'remember', 'seriously', 'something', 'together',
  6. 'tomorrow', 'watching']
  7. >>>

注意我们是如何使用两个条件:len(w) > 7 保证词长都超过七个字母,fdist5[w] > 7 保证这些词出现超过 7 次。最后,我们已成功地自动识别出与文本内容相关的高频词。这很小的一步却是一个重要的里程碑:一小块代码,处理数以万计的词,产生一些有信息量的输出。