首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:'unicode‘对象没有属性'wup_similarity’

AttributeError:'unicode‘对象没有属性'wup_similarity’
EN

Stack Overflow用户
提问于 2018-01-18 14:17:30
回答 1查看 1.1K关注 0票数 0

我正在使用Python2.7中的nltk模块。以下是我的代码

代码语言:javascript
复制
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 firstgroup in listsyn1:
    for secondgroup in listsyn2:
        print(firstgroup.wup_similarity(secondgroup))
        sumofsimilarity = sumofsimilarity + firstgroup.wup_similarity(secondgroup)

averageofsimilarity = sumofsimilarity/(countsyn1*countsyn2)

当我试图运行这段代码时,我得到了错误"AttributeError:'unicode‘对象没有属性'wup_similarity'“。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-19 07:24:27

相似性度量只能由Synset对象访问,而不能由Lemmalemma_names (即str类型)访问。

代码语言:javascript
复制
dog = wn.synsets('dog', 'n')[0]
paw = wn.synsets('paw', 'n')[0]

print(type(dog), type(paw), dog.wup_similarity(paw))

输出

代码语言:javascript
复制
<class 'nltk.corpus.reader.wordnet.Synset'> <class 'nltk.corpus.reader.wordnet.Synset'> 0.21052631578947367

当您获得.lemmas()并从Synset对象访问.names()属性时,您将得到str

代码语言:javascript
复制
dog = wn.synsets('dog', 'n')[0]
print(type(dog), dog)
print(type(dog.lemmas()[0]), dog.lemmas()[0])
print(type(dog.lemmas()[0].name()), dog.lemmas()[0].name())

输出

代码语言:javascript
复制
<class 'nltk.corpus.reader.wordnet.Synset'> Synset('dog.n.01')
<class 'nltk.corpus.reader.wordnet.Lemma'> Lemma('dog.n.01.dog')
<class 'str'> dog

您可以使用hasattr函数来检查哪些对象/类型可以访问某个函数或属性:

代码语言:javascript
复制
dog = wn.synsets('dog', 'n')[0]
print(hasattr(dog, 'wup_similarity'))
print(hasattr(dog.lemmas()[0], 'wup_similarity'))
print(hasattr(dog.lemmas()[0].name(), 'wup_similarity'))

输出

代码语言:javascript
复制
True
False
False

最有可能的是,您需要一个类似于https://github.com/alvations/pywsd/blob/master/pywsd/similarity.py#L76的函数,它使两个同步集的wup_similarity最大化,但请注意,有许多必要的警告,比如预柠檬化。

所以我认为这就是你想通过使用.lemma_names()来避免它的地方。也许,你可以这样做:

代码语言:javascript
复制
def ss_lnames(word):
    return set(chain(*[ss.lemma_names() for ss in wn.synsets(word, 'n')]))

dog_lnames = ss_lnames('dog')
paw_lnames = ss_lnames('paw')

for dog_name, paw_name in product(dog_lnames, paw_lnames):
    for dog_ss, paw_ss in product(wn.synsets(dog_name, 'n'), wn.synsets(paw_name, 'n')):
        print(dog_ss, paw_ss, dog_ss.wup_similarity(paw_ss))  

但最有可能的结果是不可解释和不可靠的,因为没有词义消歧在同步之前上升,在外部和内部循环中查找机器人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48323393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档