WordNet:迭代同义词集

5

我想测量文本中“以人为中心”的词汇量,用于一个项目。我计划使用WordNet来完成这个任务。我从未使用过它,也不太确定如何着手解决这个问题。我想使用WordNet来计算属于某些同义词集的单词数量,例如“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' object has no attribute '_name''。我该使用哪个方法来遍历单词的上位词(hypernyms)并在单词确实属于“人”或“人类”同义词集时执行某些操作(例如增加人类中心性计数)。
其次,这是否是有效的方法?我假设在多个文本上迭代并遍历每个名词的上位词将需要相当长的时间...也许有另一种方法可以更有效地使用WordNet来执行我的任务。
谢谢您的帮助!
2个回答

4

关于错误消息

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():
    ...

相反地。

关于效率

目前,您对输入文本中的每个单词进行超义词查找。正如您所指出的那样,这不一定是高效的。但是,如果这足够快,请在此停止并不要优化无需修复的内容。

为了加快查找速度,您可以预先编译一个"与人相关"的单词列表,利用传递闭包通过下位词来解释,详情请参见此处

类似于

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之前,您可能还需要使用词干提取或其他形态学缩减对输入单词进行预处理。


0

要获取一个同义词集的所有下义词,您可以使用以下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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接