- 2.5 动词
2.5 动词
动词是用来描述事件和行动的词,例如2.3中的 fall, eat。在一个句子中,动词通常表示涉及一个或多个名词短语所指示物的关系。
表 2.3:
一些动词的句法模式
>>> wsj = nltk.corpus.treebank.tagged_words(tagset='universal')>>> word_tag_fd = nltk.FreqDist(wsj)>>> [wt[0] for (wt, _) in word_tag_fd.most_common() if wt[1] == 'VERB']['is', 'said', 'are', 'was', 'be', 'has', 'have', 'will', 'says', 'would','were', 'had', 'been', 'could', "'s", 'can', 'do', 'say', 'make', 'may','did', 'rose', 'made', 'does', 'expected', 'buy', 'take', 'get', 'might','sell', 'added', 'sold', 'help', 'including', 'should', 'reported', ...]
请注意,频率分布中计算的项目是词-标记对。由于词汇和标记是成对的,我们可以把词作作为条件,标记作为事件,使用条件-事件对的链表初始化一个条件频率分布。这让我们看到了一个给定的词的标记的频率顺序列表:
>>> cfd1 = nltk.ConditionalFreqDist(wsj)>>> cfd1['yield'].most_common()[('VERB', 28), ('NOUN', 20)]>>> cfd1['cut'].most_common()[('VERB', 25), ('NOUN', 3)]
我们可以颠倒配对的顺序,这样标记作为条件,词汇作为事件。现在我们可以看到对于一个给定的标记可能的词。我们将用《华尔街日报 》的标记集而不是通用的标记集来这样做:
>>> wsj = nltk.corpus.treebank.tagged_words()>>> cfd2 = nltk.ConditionalFreqDist((tag, word) for (word, tag) in wsj)>>> list(cfd2['VBN'])['been', 'expected', 'made', 'compared', 'based', 'priced', 'used', 'sold','named', 'designed', 'held', 'fined', 'taken', 'paid', 'traded', 'said', ...]
要弄清VBD(过去式)和VBN(过去分词)之间的区别,让我们找到可以同是VBD和VBN的词汇,看看一些它们周围的文字:
>>> [w for w in cfd1.conditions() if 'VBD' in cfd1[w] and 'VBN' in cfd1[w]]['Asked', 'accelerated', 'accepted', 'accused', 'acquired', 'added', 'adopted', ...]>>> idx1 = wsj.index(('kicked', 'VBD'))>>> wsj[idx1-4:idx1+1][('While', 'IN'), ('program', 'NN'), ('trades', 'NNS'), ('swiftly', 'RB'),('kicked', 'VBD')]>>> idx2 = wsj.index(('kicked', 'VBN'))>>> wsj[idx2-4:idx2+1][('head', 'NN'), ('of', 'IN'), ('state', 'NN'), ('has', 'VBZ'), ('kicked', 'VBN')]
在这种情况下,我们可以看到过去分词 kicked 前面是助动词 have 的形式。这是普遍真实的吗?
注意
轮到你来: 通过list(cfd2['VN'])指定一个过去分词的列表,尝试收集所有直接在列表中项目前面的词-标记对。
