对于一个项目,我想衡量文本中“以人为本”的单词的数量。我计划使用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来更有效地执行任务的方法。

谢谢你的帮助!

最佳答案

wrt错误消息
hypernyms = word_synsets.hypernym_paths()返回SynSet列表的列表。

因此

if element == 'person':

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

尝试类似的东西
target_synsets = wn.synsets('person')
if element in target_synsets:
    ...

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

反而。

wrt效率

当前,您对输入文本中的每个单词都进行上位查询。如您所述,这不一定有效。但是,如果这足够快,请在此处停止,不要对未损坏的内容进行优化。

为了加快查找速度,您可以通过使用下位词的可传递闭包来预先预编译“与人相关”的单词列表,如here所述。

就像是
person_words = set(w for s in p.closure(lambda s: s.hyponyms()) for w in s.lemma_names())

应该做到的。这将返回一组〜10,000字,这些字在存储在主存储器中不会太多。

然后,单词计数器的简单版本就变成了
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之前,您可能还需要使用词干或其他形态学缩减对输入的单词进行预处理。

关于python - WordNet:遍历同义词集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29647068/

10-13 02:26