【问题标题】:NLTK Most common synonym (Wordnet) for each wordNLTK 每个单词最常见的同义词 (Wordnet)
【发布时间】:2016-11-09 01:04:07
【问题描述】:

有没有办法使用 NLTK 找到单词的最常见同义词?我想使用它上每个单词的最常见同义词来简化一个句子。

如果句子中使用的单词已经是其同义词组中最常用的单词,则不应更改它。

假设“Hi”比“Hello”更常见; “Dear”比“Valued”更常见;而“朋友”已经是其组 os 同义词中最常见的词。

Input: "Hello my valued friend"
Return: "Hi my dear friend"

【问题讨论】:

    标签: python python-2.7 python-3.x nltk


    【解决方案1】:

    同义词很棘手,但如果您从 Wordnet 中的同义词集开始,并且只想选择集中最常见的成员,这非常简单:只需从语料库中构建您自己的频率列表,然后查找每个synset 的成员来选择最大值。

    nltk 让您只需几行代码即可构建频率表。这是基于布朗语料库的一个:

    from nltk.corpus import brown
    freqs = nltk.FreqDist(w.lower() for w in brown.words())
    

    然后您可以像这样查找单词的频率:

    >>> print(freqs["valued"]) 
    14
    

    当然你需要做更多的工作:我会分别计算每个主要词性的单词(wordnet 提供 nvar,resp .nounverbadjectiveadverb),并使用这些特定于 POS 的频率(在针对不同的标签集符号进行调整后)来选择正确的替代品。

    >>> freq2 = nltk.ConditionalFreqDist((tag, wrd.lower()) for wrd, tag in 
            brown.tagged_words(tagset="universal"))
    
    >>> print(freq2["ADJ"]["valued"])
    0
    >>> print(freq2["ADJ"]["dear"])
    45
    

    【讨论】:

    • 这正是我所想的,@alexis!非常感谢!
    【解决方案2】:

    同义词是自然语言处理中一个巨大而开放的工作领域。

    在您的示例中,程序应该如何知道允许的同义词是什么?一种方法可能是为每个单词保留同义词集的字典。但是,由于词性的重叠,这可能会遇到问题:“dear”是形容词,但“valued”可以是形容词或过去时动词。

    上下文也很重要:二元组“亲爱的朋友”可能比“尊贵的朋友”更常见,但“尊贵的客户”比“亲爱的客户”更常见。因此,给定单词的意义也需要考虑在内。

    另一种方法可能是查看所有内容,看看哪些词出现在相似的上下文中。你需要一个 巨大的 语料库 才能有效,而且你必须决定要使用多大的 n-grams 窗口(一个二元上下文?一个 20 克上下文?)。

    我建议您查看 WordNet (https://wordnet.princeton.edu/) 的应用程序,该应用程序旨在帮助解决其中的一些问题。不幸的是,我不确定您是否会找到自己“解决”同义词的方法,但请继续寻找并提出问题!

    编辑:我也应该将此链接包含到一个较旧的问题中:

    How to get synonyms from nltk WordNet Python

    还有关于其与 WordNet 接口的 NLTK 文档:

    http://www.nltk.org/howto/wordnet.html

    但是,我认为这些不能解决您的问题,因为 WordNet 没有使用统计信息(取决于您使用的语料库)。不过,您应该能够以上述方法应用其同义词。

    【讨论】:

    • 我可以通过POS在某个语料库中创建一个每个单词出现频率的数据集,然后将其用作参考,对吗?不过,我想知道,如果我们还没有更简单的方法来做同样的事情。
    • @Alexis 看到了你想要做什么!正如他们的回答所示,nltk.corpus 中的语料库具有您正在寻找的 tagged_words() 方法以及 ConditionalFreqDist 对象。
    【解决方案3】:

    另一个答案告诉你如何使用同义词:

    wn.synsets('small')
    [Synset('small.n.01'),
     Synset('small.n.02'),
     Synset('small.a.01'),
     Synset('minor.s.10'),
     Synset('little.s.03'),
     Synset('small.s.04'),
     Synset('humble.s.01'),
     Synset('little.s.07'),
     Synset('little.s.05'),
     Synset('small.s.08'),
     Synset('modest.s.02'),
     Synset('belittled.s.01'),
     Synset('small.r.01')]
    

    您现在知道如何获取单词的所有同义词了。这不是困难的部分。困难的部分是确定最常见的同义词是什么。这个问题高度依赖领域。最常见的同义词在哪里?在文学?普通话?在技​​术方面?

    和你一样,我想了解英语是如何使用的。我从 (Project Gutenberg) 下载了 15,000 本书,并处理了所有这些书的单词和字母对频率。摄入这么大的语料库后,我可以看到哪些词最常用。不过,就像我上面所说的,这取决于您要处理的内容。如果它类似于 Twitter 帖子,请尝试摄取大量推文。从最终必须处理的内容中学习。

    【讨论】:

    • 谢谢你,@Ares。正如我在另一个答案中提到的那样,如果我们还没有一种简单的方法来做到这一点,我就会徘徊,但显然我们没有。我可能会从某个语料库中创建一个具有单词频率/POS 频率的数据集,然后将其用作参考。
    • 正如@Clay 提到的,您还可以考虑存储单词对以及单词本身。你会发现这很快就变成了一个庞大的数据库。 FWIW,我在一天左右的时间里构思并编写了这个解决方案。不像看起来那么令人生畏。
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2013-08-30
    • 2013-02-26
    • 2017-04-18
    • 2015-08-16
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多