Python NLTK计算WordNet wup_similarity返回None:词性差异所致?如何解决?
问题原因与解决方案
嘿,这个问题我太熟悉了!确实是形容词(a)和形容词卫星(s)的词性差异导致wup_similarity()返回None的。
为什么会返回None?
WordNet的形容词体系分成两类:
- 核心形容词(标记为
a):描述事物的基本属性 - 形容词卫星(标记为
s):依附于核心形容词,描述其衍生状态或属性
wup_similarity()在计算时会严格校验两个同义词集的词性是否完全匹配——哪怕都是形容词分支的a和s,也会被判定为不同词性,直接返回None。这就是你遇到的问题根源。
解决办法:统一词性后计算
我们可以手动将形容词卫星同义词集映射到对应的核心形容词同义词集,确保计算时词性一致。下面是修改后的代码:
import nltk from nltk.corpus import wordnet as wn def get_core_adjective_synset(synset): """将形容词卫星synset转换为对应的核心形容词synset,本身是核心则直接返回""" if synset.pos() == 's': # 遍历synset的所有lemma,寻找关联的核心形容词synset for lemma in synset.lemmas(): related_synset = lemma.synset() if related_synset.pos() == 'a': return related_synset # 找不到关联核心synset时返回原synset return synset else: return synset # 获取所有形容词类同义词集(包括核心和卫星) sl1 = wn.synsets("continuous", pos=[wn.ADJ, wn.ADJ_SAT]) sl2 = wn.synsets("ongoing", pos=[wn.ADJ, wn.ADJ_SAT]) # 遍历所有组合并计算相似度 for x in sl1: for y in sl2: x_core = get_core_adjective_synset(x) y_core = get_core_adjective_synset(y) similarity = x_core.wup_similarity(y_core) print(f"{x} | {y} | WUP相似度: {similarity}")
代码说明:
- 辅助函数:
get_core_adjective_synset会自动识别形容词卫星synset,并将其转换为对应的核心形容词synset,保证词性统一。 - 同义词集获取:通过
pos=[wn.ADJ, wn.ADJ_SAT]参数,获取目标单词的所有形容词类同义词集,避免遗漏。 - 相似度计算:基于转换后的核心synset计算
wup_similarity,就能得到有效的相似度值了。
如果你不局限于WUP相似度,也可以尝试path_similarity()或lch_similarity()——这两个方法对词性差异的容忍度更高,不过语义相似度的计算逻辑和WUP有所不同。
内容的提问来源于stack exchange,提问作者DSharma
相关产品推荐
相关产品推荐

