Ali*_*ice 5 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
Run Code Online (Sandbox Code Playgroud)
结果是:
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')
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是,如何正确迭代上位音?在上面的代码中,它们可以正常打印。但是,使用“ if”语句时,例如:
count_humancenteredness = 0
for element in hypernyms:
if element == 'person':
print 'found person hypernym'
count_humancenteredness +=1
Run Code Online (Sandbox Code Playgroud)
我得到'AttributeError:'str'对象没有属性'_name'。当单词确实属于“人”或“人”同义词时,我可以使用什么方法来迭代单词的上位词并执行操作(例如,增加以人为中心的计数)。
其次,这是一种有效的方法吗?我假设遍历多个文本并遍历每个名词的上位字母将花费一些时间。也许还有另一种使用WordNet来更有效地执行任务的方法。
谢谢你的帮助!
写错误消息
hypernyms = word_synsets.hypernym_paths()
返回 s 列表的列表SynSet
。
因此
if element == 'person':
Run Code Online (Sandbox Code Playgroud)
尝试将SynSet
对象与字符串进行比较。不支持这种比较SynSet
。
尝试类似的东西
target_synsets = wn.synsets('person')
if element in target_synsets:
...
Run Code Online (Sandbox Code Playgroud)
或者
if u'person' in element.lemma_names():
...
Run Code Online (Sandbox Code Playgroud)
反而。
工作效率
目前,您对输入文本中的每个单词进行上位词查找。正如您所注意到的,这不一定有效。但是,如果速度足够快,请在此停止并且不要优化未损坏的内容。
为了加快查找速度,您可以通过使用下位词的传递闭包来提前预编译“人员相关”单词的列表,如此处所述。
就像是
person_words = set(w for s in p.closure(lambda s: s.hyponyms()) for w in s.lemma_names())
Run Code Online (Sandbox Code Playgroud)
应该可以解决问题。这将返回一组 ~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
Run Code Online (Sandbox Code Playgroud)
不过,在将单词传递到 WordNet 之前,您可能还需要使用词干提取或其他形态缩减来预处理输入单词。