You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 2.7使用NLTK报错:'unicode'对象无'wup_similarity'属性

解决AttributeError: 'unicode' object has no attribute 'wup_similarity'问题

我来帮你搞定这个问题!你遇到的错误根源特别清晰——你把词元(lemma)的名称字符串存进了listsyn1和listsyn2,但wup_similarity()方法是WordNet里Synset(同义词集)对象独有的方法,普通字符串类型根本没有这个属性,自然会报错。

错误原因拆解

你代码里的lemma.name()返回的是一个unicode字符串(比如"dog"、"paw"),而不是具备相似度计算能力的同义词集对象。WUP相似度是基于同义词集之间的语义关系计算的,不是单纯的字符串匹配,所以不能直接拿字符串去调用这个方法。

修正方案(推荐版)

我们直接存储同义词集对象,而不是字符串,这样就能正常调用wup_similarity()了。同时还要处理一些边界情况(比如同义词集之间无法计算相似度返回None、某个词找不到同义词集的情况):

from nltk.corpus import wordnet as wn

listsyn1 = []
listsyn2 = []

# 存储'dog'的所有名词同义词集对象
for synset in wn.synsets('dog', pos=wn.NOUN):
    print synset.name()
    listsyn1.append(synset)  # 改动点:直接存Synset对象,不是字符串

# 存储'paw'的所有名词同义词集对象
for synset in wn.synsets('paw', pos=wn.NOUN):
    print synset.name()
    listsyn2.append(synset)  # 同样存Synset对象

countsyn1 = len(listsyn1)
countsyn2 = len(listsyn2)
sumofsimilarity = 0

# 遍历同义词集计算相似度
for syn1 in listsyn1:
    for syn2 in listsyn2:
        sim_score = syn1.wup_similarity(syn2)
        print(sim_score)
        # 跳过None值,避免累加错误
        if sim_score is not None:
            sumofsimilarity += sim_score

# 计算平均值前先判断分母不为0
if countsyn1 * countsyn2 > 0:
    averageofsimilarity = sumofsimilarity / (countsyn1 * countsyn2)
    print("Average WUP Similarity:", averageofsimilarity)
else:
    print("No synsets found for one or both words.")

备选方案(如果一定要存储词元名称)

如果你确实需要保留词元字符串,那可以在计算相似度时,通过字符串重新获取对应的同义词集。不过这种方式要注意异常处理,防止某个词找不到同义词集:

from nltk.corpus import wordnet as wn

listsyn1 = []
listsyn2 = []

for synset in wn.synsets('dog', pos=wn.NOUN):
    print synset.name()
    for lemma in synset.lemmas():
        listsyn1.append(lemma.name())

for synset in wn.synsets('paw', pos=wn.NOUN):
    print synset.name()
    for lemma in synset.lemmas():
        listsyn2.append(lemma.name())

countsyn1 = len(listsyn1)
countsyn2 = len(listsyn2)
sumofsimilarity = 0

for first_word in listsyn1:
    for second_word in listsyn2:
        # 获取每个词的第一个名词同义词集(可根据需求调整取哪个同义词集)
        syn1_list = wn.synsets(first_word, pos=wn.NOUN)
        syn2_list = wn.synsets(second_word, pos=wn.NOUN)
        if syn1_list and syn2_list:
            syn1 = syn1_list[0]
            syn2 = syn2_list[0]
            sim_score = syn1.wup_similarity(syn2)
            print(sim_score)
            if sim_score is not None:
                sumofsimilarity += sim_score

if countsyn1 * countsyn2 > 0:
    averageofsimilarity = sumofsimilarity / (countsyn1 * countsyn2)
    print("Average WUP Similarity:", averageofsimilarity)
else:
    print("No synsets found for one or both words.")

关键提醒

  • wup_similarity()是Synset对象的方法,只能用同义词集来调用,不能用字符串。
  • 部分同义词集之间可能无法计算相似度,会返回None,一定要做判断,否则会导致累加时出现TypeError。
  • 如果某个词没有对应的同义词集,wn.synsets()会返回空列表,直接取索引会报错,所以要先检查列表是否非空。

内容的提问来源于stack exchange,提问作者Sonali Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:37:54