WordNet:迭代同义词

时间:2015-04-15 09:54:05

标签: python nltk wordnet

对于一个项目,我想测量文本中“以人为中心”的单词数量。我打算用WordNet做这件事。我从未使用它,我不太确定如何处理这项任务。我想使用WordNet来计算属于某些同义词的单词数量,例如sysnets的“human”和“person”。

我提出了以下(简单)代码:

word = 'girlfriend'
word_synsets = wn.synsets(word)[0]

hypernyms = word_synsets.hypernym_paths()[0]

for element in hypernyms:
    print element

结果:

Synset('entity.n.01')
Synset('physical_entity.n.01')
Synset('causal_agent.n.01')
Synset('person.n.01')
Synset('friend.n.01')
Synset('girlfriend.n.01')

我的第一个问题是,如何正确迭代上位词?在上面的代码中,它打印出来就好了。但是,使用'if'语句时,例如:

count_humancenteredness = 0
for element in hypernyms:
    if element == 'person':
        print 'found person hypernym'
        count_humancenteredness +=1

我得到'AttributeError:'str'对象没有属性'_name''。当一个单词确实属于“人”或“人类”同义词时,我可以使用什么方法来迭代我的单词的上位词并执行一个动作(例如增加人类中心数)。

其次,这是一种有效的方法吗?我假设迭代几个文本并迭代每个名词的上位词需要相当长的时间。也许还有另一种方法可以使用WordNet更有效地执行我的任务。

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

发送错误消息

hypernyms = word_synsets.hypernym_paths()会返回SynSet s列表。

因此

if element == 'person':

尝试将SynSet对象与字符串进行比较。 SynSet不支持这种比较。

尝试类似

的内容
target_synsets = wn.synsets('person')
if element in target_synsets:
    ...

if u'person' in element.lemma_names():
    ...

代替。

wrt效率

目前,您对输入文本中的每个单词执行hypernym查找。如你所知,这不一定有效。但是,如果速度足够快,请停在此处,不要优化未破坏的内容。

为了加快查找速度,您可以预先编译一个“人员相关”单词列表,方法是使用下面的here来解释下位词上的传递闭包。 / p>

这样的东西
person_words = set(w for s in p.closure(lambda s: s.hyponyms()) for w in s.lemma_names())

应该做的伎俩。这将返回一组〜10,000个单词,这些单词不能存储在主存储器中。

单词counter的一个简单版本就变成了

的内容
from collections import Counter

word_count = Counter()
for word in (w.lower() for w in words if w in person_words):         
    word_count[word] += 1

在将文字传递到WordNet之前,您可能还需要使用词干或其他形态缩减来预处理输入词。

答案 1 :(得分:0)

要获得synset的所有下位词,您可以使用以下function(使用NLTK 3.0.3测试,dhke的闭包技巧在此版本上不起作用):

def get_hyponyms(synset):
    hyponyms = set()
    for hyponym in synset.hyponyms():
        hyponyms |= set(get_hyponyms(hyponym))
    return hyponyms | set(synset.hyponyms())

示例:

from nltk.corpus import wordnet
food = wordnet.synset('food.n.01')
print(len(get_hyponyms(food))) # returns 1526