2.5 动词

动词是用来描述事件和行动的词,例如2.3中的 fall, eat。在一个句子中,动词通常表示涉及一个或多个名词短语所指示物的关系。

表 2.3:

一些动词的句法模式

  1. >>> wsj = nltk.corpus.treebank.tagged_words(tagset='universal')
  2. >>> word_tag_fd = nltk.FreqDist(wsj)
  3. >>> [wt[0] for (wt, _) in word_tag_fd.most_common() if wt[1] == 'VERB']
  4. ['is', 'said', 'are', 'was', 'be', 'has', 'have', 'will', 'says', 'would',
  5. 'were', 'had', 'been', 'could', "'s", 'can', 'do', 'say', 'make', 'may',
  6. 'did', 'rose', 'made', 'does', 'expected', 'buy', 'take', 'get', 'might',
  7. 'sell', 'added', 'sold', 'help', 'including', 'should', 'reported', ...]

请注意,频率分布中计算的项目是词-标记对。由于词汇和标记是成对的,我们可以把词作作为条件,标记作为事件,使用条件-事件对的链表初始化一个条件频率分布。这让我们看到了一个给定的词的标记的频率顺序列表:

  1. >>> cfd1 = nltk.ConditionalFreqDist(wsj)
  2. >>> cfd1['yield'].most_common()
  3. [('VERB', 28), ('NOUN', 20)]
  4. >>> cfd1['cut'].most_common()
  5. [('VERB', 25), ('NOUN', 3)]

我们可以颠倒配对的顺序,这样标记作为条件,词汇作为事件。现在我们可以看到对于一个给定的标记可能的词。我们将用《华尔街日报 》的标记集而不是通用的标记集来这样做:

  1. >>> wsj = nltk.corpus.treebank.tagged_words()
  2. >>> cfd2 = nltk.ConditionalFreqDist((tag, word) for (word, tag) in wsj)
  3. >>> list(cfd2['VBN'])
  4. ['been', 'expected', 'made', 'compared', 'based', 'priced', 'used', 'sold',
  5. 'named', 'designed', 'held', 'fined', 'taken', 'paid', 'traded', 'said', ...]

要弄清VBD(过去式)和VBN(过去分词)之间的区别,让我们找到可以同是VBDVBN的词汇,看看一些它们周围的文字:

  1. >>> [w for w in cfd1.conditions() if 'VBD' in cfd1[w] and 'VBN' in cfd1[w]]
  2. ['Asked', 'accelerated', 'accepted', 'accused', 'acquired', 'added', 'adopted', ...]
  3. >>> idx1 = wsj.index(('kicked', 'VBD'))
  4. >>> wsj[idx1-4:idx1+1]
  5. [('While', 'IN'), ('program', 'NN'), ('trades', 'NNS'), ('swiftly', 'RB'),
  6. ('kicked', 'VBD')]
  7. >>> idx2 = wsj.index(('kicked', 'VBN'))
  8. >>> wsj[idx2-4:idx2+1]
  9. [('head', 'NN'), ('of', 'IN'), ('state', 'NN'), ('has', 'VBZ'), ('kicked', 'VBN')]

在这种情况下,我们可以看到过去分词 kicked 前面是助动词 have 的形式。这是普遍真实的吗?

注意

轮到你来: 通过list(cfd2['VN'])指定一个过去分词的列表,尝试收集所有直接在列表中项目前面的词-标记对。