为何使用NLTK提取'good'同义词时去重逻辑失效?
问题原因分析:你的去重逻辑为啥没生效?
嘿,我一眼就瞅出问题在哪了——你的判断条件和实际存入列表的内容完全不匹配!
看你这段关键代码:
if str(l) not in synonyms: synonyms.append(l.name())
这里你检查的是Lemma对象转成的字符串(比如<Lemma('good.n.01.good')>)是否在synonyms里,但synonyms里存的却是l.name()返回的纯单词(比如'good')。这俩根本不是一回事啊!
举个实际场景:第一个good对应的Lemma对象转成字符串是<Lemma('good.n.01.good')>,你的判断会发现这个字符串不在空列表里,于是把'good'加进去。下一个good对应的Lemma对象是<Lemma('good.a.01.good')>,转成字符串又是另一个不同的内容,判断的时候还是不在列表里(列表里只有'good'),所以又把'good'加了一次,结果自然就出现重复了。
修正方案
把判断条件改成检查单词本身是否已经在列表里就行:
import nltk from nltk.corpus import wordnet synonyms = [] for syn in wordnet.synsets("good"): for l in syn.lemmas(): word = l.name() if word not in synonyms: synonyms.append(word) print(synonyms)
另外,用集合去重会更高效(集合本身就不允许重复元素),代码也更简洁:
import nltk from nltk.corpus import wordnet synonyms = set() for syn in wordnet.synsets("good"): for l in syn.lemmas(): synonyms.add(l.name()) # 转成列表(如果需要列表格式的话) synonyms = list(synonyms) print(synonyms)
这样就能得到完全去重的同义词列表啦!
内容的提问来源于stack exchange,提问作者maybeyourneighour
相关产品推荐
相关产品推荐

