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
相关产品推荐
相关产品推荐

