【问题标题】:Python: Passing variables into Wordnet Synsets methods in NLTKPython:将变量传递给 NLTK 中的 Wordnet Synsets 方法
【发布时间】:2013-01-15 11:16:57
【问题描述】:

我需要从事一个需要 NLTK 的项目,所以我两周前开始学习 Python,但很难理解 Python 和 NLTK。

从 NLTK 文档中,我可以理解以下代码,如果我在下面的代码中手动添加单词 apple 和 pear,它们可以正常工作。

from nltk.corpus import wordnet as wn

apple = wn.synset('apple.n.01')
pear = wn.synset('pear.n.01')

print apple.lch_similarity(pear)

Output: 2.53897387106

但是,我需要使用 NLTK 来处理项目列表。例如,我有一个下面的项目列表,我想将 list1 中的项目与 list2 进行比较 - 例如:将 list1 中的 word1 与列表 2 中的每个单词进行比较,然后将 list1 中的 word2 与 list2 中的每个单词进行比较,直到所有单词比较 list1。

list1 = ["apple", "honey", "drinks", "flowers", "paper"]
list2 = ["pear", "shell", "movie", "fire", "tree", "candle"]

wordFromList1 = list1[0]
wordFromList2 = list2[0]

wordFromList1 = wn.synset(wordFromList1)
wordFromList2 = wn.synset(wordFromList2)    

print wordFromList1.lch_similarity(wordFromList2)

上面的代码当然会报错。谁能告诉我如何将 variable 传递给 synset 方法 [wn.synset(*pass_variable_in_here*)] 以便我可以使用双循环来获取它们的 lch_similarity 值。谢谢。

【问题讨论】:

    标签: python nltk wordnet


    【解决方案1】:

    wordnet.synset 需要一个 3-part name 形式的字符串: word.pos.nn.

    您没有为list1 中的每个单词指定pos.nn 部分,并且 list2。

    假设所有单词都是名词似乎是合理的,所以我们可以尝试 将字符串 '.n.01' 附加到 list1 和 list2 中的每个字符串:

    for word1, word2 in IT.product(list1, list2):
        wordFromList1 = wordnet.synset(word1+'.n.01')
        wordFromList2 = wordnet.synset(word2+'.n.02')
    

    但是,这不起作用。 wordnet.synset('drinks.n.01') 引发 WordNetError。

    另一方面,same doc page 表明您可以 使用synsets方法查找相似词:

    例如,wordnet.synsets('drinks') 返回列表:

    [Synset('drink.n.01'),
     Synset('drink.n.02'),
     Synset('beverage.n.01'),
     Synset('drink.n.04'),
     Synset('swallow.n.02'),
     Synset('drink.v.01'),
     Synset('drink.v.02'),
     Synset('toast.v.02'),
     Synset('drink_in.v.01'),
     Synset('drink.v.05')]
    

    所以此时,您需要考虑一下您希望程序做什么。如果您可以选择此列表中的第一项作为drinks 的代理, 那么你可以使用

    for word1, word2 in IT.product(list1, list2):
        wordFromList1 = wordnet.synsets(word1)[0]
        wordFromList2 = wordnet.synsets(word2)[0]
    

    这将导致程序如下所示:

    import nltk.corpus as corpus
    import itertools as IT
    
    wordnet = corpus.wordnet
    list1 = ["apple", "honey", "drinks", "flowers", "paper"]
    list2 = ["pear", "shell", "movie", "fire", "tree", "candle"]
    
    for word1, word2 in IT.product(list1, list2):
        # print(word1, word2)
        wordFromList1 = wordnet.synsets(word1)[0]
        wordFromList2 = wordnet.synsets(word2)[0]
        print('{w1}, {w2}: {s}'.format(
            w1 = wordFromList1.name,
            w2 = wordFromList2.name,
            s = wordFromList1.lch_similarity(wordFromList2)))
    

    产生

    apple.n.01, pear.n.01: 2.53897387106
    apple.n.01, shell.n.01: 1.07263680226
    apple.n.01, movie.n.01: 1.15267950994
    apple.n.01, fire.n.01: 1.07263680226
    ...
    

    【讨论】:

    • 非常感谢,它有效!我只学习了基本的 Python,我不知道如何将变量传递给方法调用。在发布这个问题之前,我尝试了 [+ ".n.01] 方法,但它给了我一个错误。为什么 wordnet.synsets(word1)[0] 可以代替?
    • 始终牢记(几乎)Python 中的一切都是对象。 wordnet.synsets(word1) 是 list。 list 是一个可以被索引的对象:list[0] 返回list 中的第一项。所以wordnet.synsets(word1)[0]返回一个对象,比如Synset('drink.n.01'),它和wordnet.synset('drink.n.01')是同一种对象。它是Synset 类的所谓“实例”。因此,我们没有直接定义遇到问题的wordFormList1 = wordnet.synset(...),而是通过替代路线获取Synset 实例来继续。
    猜你喜欢
    • 2023-04-07
    • 2016-04-20
    • 2022-01-07
    • 2018-07-03
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多