【问题标题】:AttributeError: 'unicode' object has no attribute 'wup_similarity'AttributeError:“unicode”对象没有属性“wup_similarity”
【发布时间】:2018-01-19 15:24:27
【问题描述】:

我正在使用 Python 2.7 中的 nltk 模块。以下是我的代码

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' object has no attribute 'wup_similarity'”。谢谢你的帮助。

【问题讨论】:

  • 就像错误所说的那样,firstgroup 是一个 unicode 字符串,而不是定义 wup_similarity 的任何对象的实例。这是因为您通过附加 lemma.name() 来填充 listsyn1,这可能会返回一个字符串。
  • 知道了@DanielRoseman 非常感谢。

标签: python unicode nltk wordnet


【解决方案1】:

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

dog = wn.synsets('dog', 'n')[0]
paw = wn.synsets('paw', 'n')[0]

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

[出]:

<class 'nltk.corpus.reader.wordnet.Synset'> <class 'nltk.corpus.reader.wordnet.Synset'> 0.21052631578947367

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

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())

[出]:

<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 函数来检查哪些对象/类型可以访问某个函数或属性:

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'))

[出]:

True
False
False

很可能,您想要一个与 https://github.com/alvations/pywsd/blob/master/pywsd/similarity.py#L76 类似的函数,该函数在两个同义词集之间最大化 wup_similarity,但请注意,有许多警告,例如必要的预词形化。

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

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))  

但很可能结果是无法解释和不可靠的,因为在外部和内部循环中的 synset 查找 bot 之前没有词义消歧。

【讨论】:

  • 是的,我确实发现了我在名称上使用 wup_similarity 而不是同义词集的错误。感谢您提供有关改进结果的更多信息。我同意结果出乎意料。
猜你喜欢
  • 2016-01-05
  • 2017-05-19
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 2018-07-15
相关资源
最近更新 更多