【问题标题】:Find Python NLTK Wordnet Synsets for a each item of a list查找列表中每个项目的 Python NLTK Wordnet Synsets
【发布时间】:2023-04-07 03:26:02
【问题描述】:

我一直在学习基本的 python,但我是 NLTK 的新手。我想使用 nltk 为给定的单词列表提取下义词。当我手动输入每个术语时它工作正常,但当我尝试遍历列表项时它似乎不起作用。

这行得通:

from nltk.corpus import wordnet as wn

syn_sets = wn.synsets("car")

for syn_set in syn_sets:
    print(syn_set, syn_set.lemma_names())
    print(syn_set.hyponyms())

但是我如何让 Wordnet 方法处理类似的项目列表

token = ["cat", "dog", "car"]
syn_sets = wn.synsets((*get each item from the list*))

在一个循环中?

谢谢!

【问题讨论】:

  • 对不起,我正要回答这个问题,但我不明白你在问什么:D
  • 同义词集接受synsets(lemma, pos=None, lang='en') 的参数,因此它只接受1 个引理,您需要在for 循环中迭代引理,但您究竟想在这里实现什么?
  • 一般来说,我尝试为给定列表的每个词义提取完整的下义词列表(如上)
  • 经过一番研究,我尝试 import nltk.corpus as corpus wordnet = corpus.wordnet list = ["cat", "dog", "car"] for word in list: wordFromList = wordnet. synsets(word)[0] print(wordFromList, wordFromList.lemma_names(), wordFromList.hyponyms())
  • 它确实给出了我想要的输出,但只是每个名词的第一感觉......我可以以“car.n.01”,“car.n.”的样式列出一个列表。 02" 等,但 WN 似乎不接受此输入?

标签: python python-3.x machine-learning nltk wordnet


【解决方案1】:

列出解析来拯救!

完全有可能,即使使用与以前非常相似的语法。 Python 有一个称为[list comprehension][1] 的结构,专门为这个应用程序制作。基本上,它是内联 for 循环的函数式语法,但往往是更简洁、更健壮的实现,开销略低。

例子:

tokens = ["cat", "dog", "car"]
syn_sets = [wn.synsets(token) for token in tokens]

这甚至可以很容易地扩展到稍微复杂的数据结构,例如:

split_syn_sets = [(syn_set.lemma_names(), syn_set.hyponyms()) for syn_set in syn_sets]

不确定这是否正是您正在寻找的,但它应该概括为您想要做的与此类似的任何事情。

如果有用的话,我刚才问了一个关于获取所有相关同义词集here 的问题。

【讨论】:

    【解决方案2】:

    我相信你别无选择,只能循环你的话。我将您的代码修改为有一个外循环,它似乎可以工作:

    from nltk.corpus import wordnet as wn
    
    tokens = ["cat", "dog", "car"]
    
    for token in tokens:
        syn_sets = wn.synsets(token)
        for syn_set in syn_sets:
            print(syn_set, syn_set.lemma_names())
            print(syn_set.hyponyms())
    

    这是输出:

    (Synset('cat.n.01'), [u'cat', u'true_cat'])
    [Synset('domestic_cat.n.01'), Synset('wildcat.n.03')]
    (Synset('guy.n.01'), [u'guy', u'cat', u'hombre', u'bozo'])
    [Synset('sod.n.04')]
    ...
    (Synset('cable_car.n.01'), [u'cable_car', u'car'])
    []
    

    【讨论】:

    • 列出comps哟。 Python 很少需要外部循环。
    • 谢谢@SlaterTyranus,您的回答很有趣,而且可能更有效率。我仍然觉得我的可读性更高,但是,把它放在上下文中,我对 Python 使用冒号和制表符而不是漂亮的花括号感到恼火;-)
    • 注意到了,但代码美学取决于语言。对于更经典的 OO 语言(C++、Java、PHP 等),您是完全正确的。然而,Python (Guido) 坚信函数式构造。如果你坚持一段时间,你就会习惯它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多