【问题标题】:Extract word from a list of synsets in NLTK for Python从 NLTK for Python 中的同义词列表中提取单词
【发布时间】:2015-06-12 22:06:12
【问题描述】:

使用这个[x for x in wn.all_synsets('n')],在NLTK 的帮助下,我可以从Wordnet 中获得一个包含所有名词的allnouns 列表。

列表allnouns 看起来像这样Synset('pile.n.01'), Synset('compost_heap.n.01'), Synset('mass.n.03') 等等。现在我可以使用allnouns[2] 获取任何元素,这应该是Synset('mass.n.03')

我只想提取单词 mass 但由于某种原因,我不能将其视为字符串,如果我尝试,我尝试的所有内容都会显示 AttributeError: 'Synset' object has no attributeTypeError: 'Synset' object is not subscriptable<bound method Synset.name of Synset('mass.n.03')>使用 .name 或 .pos

【问题讨论】:

    标签: python nlp nltk list-comprehension wordnet


    【解决方案1】:

    试试这个解决方案怎么样:

    >>>> from nltk.corpus import wordnet as wn
    >>>> wn.synset('mass.n.03').name().split(".")[0]
    'mass'
    

    对于您的情况:

    >>>> allnouns = [x for x in wn.all_synsets('n')]  
    

    第 23 个索引的项目是“Synset('substance.n.07')”。现在,您可以提取其名称字段,如

    >>>> allnouns[23].name().split(".")[0]
    'substance'   #output
    

    如果您只想要列表中“名词”类别的同义词的“名称”字段,请使用:

    >>>> [x.name().split(".")[0] for x in wn.all_synsets('n')]
    

    应该正好给出你需要的结果。

    注意:在 wordnet 中,name 不是属性而是函数!

    【讨论】:

    • 好吧,我不是想得到一个单词,就像我说的那样,我会用 [x for x in wn.all_synsets('n')] 将所有名词收集在一个列表中,然后从中列表我选择一个元素,假设 allnouns[2] 恰好是 Synset('mass.n.03'),现在我想提取字符串“mass”。我之前在某处看到过你的代码,但它搜索的是一个特定的词——不是我的情况
    • 我们中的一个人做错了,因为我认为我们彼此不理解 :) 我相信你的代码运行得很好,但你错过了重点,或者我无法解释它。你从哪里得到“mass.n.03”?
    • 我有一个包含使用上述代码生成的所有名词的元素列表 - 现在我的列表如下: allnouns = Synset('pile.n.01'), Synset('compost_heap.n. 01'), Synset('mass.n.03'), Synset('dunghill.n.02'), Synset('logjam.n.02'), Synset('shock.n.08') - 怎么可能我从该列表中只得到“堆肥”或“质量”或“冲击”之类的词?我已经完成了 x = allnouns[2] 并打印它会显示“Synset('mass.n.03')” - 太好了,现在我想要提取字符串“mass”
    • 有效!我的错,你是对的 - 只需运行该死的代码! :) 这有效:[x for x in wn.all_synsets('n')][2].name().split(".")[0]
    【解决方案2】:

    使用Synset.names() 获取同义词集的规范引理名称:

    >>> from nltk.corpus import wordnet as wn
    >>> wn.synsets('mass', 'n')
    [Synset('mass.n.01'), Synset('batch.n.02'), Synset('mass.n.03'), Synset('mass.n.04'), Synset('mass.n.05'), Synset('multitude.n.03'), Synset('bulk.n.02'), Synset('mass.n.08'), Synset('mass.n.09')]
    >>> wn.synsets('mass', 'n')[0]
    Synset('mass.n.01')
    >>> wn.synsets('mass', 'n')[0].name()
    u'mass.n.01'
    >>> wn.synsets('mass', 'n')[0].name().split('.')[0]
    u'mass'
    

    但请注意,有时同义词集由多个引理组成,因此如果您使用同义词集的表面词形式,则应使用Synset.lemma_names() 访问所有引理:

    >>> wn.synsets('mass', 'n')[0].lemmas()
    [Lemma('mass.n.01.mass')]
    >>> wn.synsets('mass', 'n')[0].lemma_names()
    [u'mass']
    >>> wn.synsets('mass', 'n')[0].definition()
    u'the property of a body that causes it to have weight in a gravitational field'
    

    wn.synsets('mass', 'n')[0] 的情况下,只有 1 个引理附加到同义词集。但有时不止一个,例如

    >>> wn.synsets('mass', 'n')[1].lemma_names()
    [u'batch', u'deal', u'flock', u'good_deal', u'great_deal', u'hatful', u'heap', u'lot', u'mass', u'mess', u'mickle', u'mint', u'mountain', u'muckle', u'passel', u'peck', u'pile', u'plenty', u'pot', u'quite_a_little', u'raft', u'sight', u'slew', u'spate', u'stack', u'tidy_sum', u'wad']
    >>> wn.synsets('mass', 'n')[1].definition()
    u"(often followed by `of') a large number or amount or extent"
    

    要准确列出 wordnet 中的所有单词列表,您可以尝试:

    >>> from itertools import chain
    >>> set(chain(*[i.lemma_names() for i in wn.all_synsets('n')]))
    >>> len(set(chain(*[i.lemma_names() for i in wn.all_synsets('n')])))
    119034
    

    Making a flat list out of list of lists in Python

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2013-02-26
      • 1970-01-01
      • 2022-01-16
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多