我有两个词,假设是computer
和tool
。
Computer
是一个具体名词,而tool
相对抽象。
我想要得到每个单词的抽象度水平,以反映这一点。
我认为最好的方法是计算每个单词的上下位词数量。
- 这可能吗?
- 有更好的方法吗?
计算机
?在WordNet中,一个单词有不同的“概念”,也称为同义词集:
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('computer')
[Synset('computer.n.01'), Synset('calculator.n.01')]
>>> wn.synsets('computer')[0].definition()
'a machine for performing calculations automatically'
>>> wn.synsets('computer')[1].definition()
'an expert at calculation (or at operating calculating machines)'
computer
无关超/下位词是概念,也是同义词集,因此它们与形式/单词无关,而是与可能由单词computer
表示的同义词集相关联。
>>> type(wn.synsets('computer')[0])
<class 'nltk.corpus.reader.wordnet.Synset'>
>>> wn.synsets('computer')[0].hypernyms()
[Synset('machine.n.01')]
>>> wn.synsets('computer')[0].hyponyms()
[Synset('analog_computer.n.01'), Synset('digital_computer.n.01'), Synset('home_computer.n.01'), Synset('node.n.08'), Synset('number_cruncher.n.02'), Synset('pari-mutuel_machine.n.01'), Synset('predictor.n.03'), Synset('server.n.03'), Synset('turing_machine.n.01'), Synset('web_site.n.01')]
根据定义,单词应该有上位词/下位词吗?还是概念应该有下位词/上位词?
好的,那么我们需要做一些假设。
我们将通过WordNet访问的一个单词的所有同义词集视为任何单词形式的"整体"概念
我们考虑给定单词的所有同义词集的所有直接上位词/下位词的总和
基于所有同义词集的上位词/下位词的数量可以由某个单词形式表示,我们推断出word X
是否比word Y
更抽象
>>> hypernym_count = lambda word: sum(len(ss.hypernyms()) for ss in wn.synsets(word))
>>> hyponym_count = lambda word: sum(len(ss.hyponyms()) for ss in wn.synsets(word))
>>> hyponym_count('computer')
14
>>> hypernym_count('computer')
2
>>> hypernym_count('tool')
8
>>> hyponym_count('tool')
32
由于(3)是您要测试的假设,因此您应该决定根据 hyponym_count
和 hypernym_count
结果推断一个单词是否更/少抽象的启发式方法。
DIRECT
超/下义词?我们只访问同义词上方/下方的一级超/下义词。这就是这里“直接”的含义。
那么如何获取同义词下面的所有下义词,请参见https://stackoverflow.com/a/42012001/610569
这取决于您自己去发现并告诉我们 =)玩得开心!
交通工具 -> 汽车 -> 四轮驱动
。交通工具的直接下义词只有汽车,但是所有汽车的下义词包括汽车和四轮驱动,请参考https://stackoverflow.com/a/42012001/610569。 - alvas