NLTK每个单词的最常见同义词(Wordnet)

10
有没有一种方法可以使用NLTK找到单词的最常见同义词?我想使用每个单词的最常见同义词来简化句子。
如果句子中使用的单词已经是其同义词组中最常见的单词,则不应更改该单词。
比如说,“Hi”比“Hello”更常见;“Dear”比“Valued”更常见;而“Friend”已经是其同义词组中最常见的单词。
Input: "Hello my valued friend"
Return: "Hi my dear friend"
3个回答

10

同义词很棘手,但如果你从Wordnet开始使用synset并且只想选择集合中最常见的成员,那么很简单:只需从语料库构建自己的频率列表,并查找每个synset成员以选择最大值即可。

nltk可以让你在几行代码内构建频率表。以下是基于Brown语料库的一个示例:

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

您可以这样查找单词的频率:
>>> print(freqs["valued"]) 
14

当然,您需要再做一些工作:我建议分别计算每个主要词类的单词数(WordNet提供名词(n)、动词(v)、形容词(a)和副词(r)),并使用这些词类特定的频率(在调整不同标记集符号后)来选择正确的替换。
>>> 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!非常感谢你! - 42piratas

2
同义词是自然语言处理中一个巨大而开放的领域。
在你的例子中,程序应该如何知道允许使用的同义词?一种方法是为每个单词保留一组同义词的字典。然而,由于词性的重叠,这可能会遇到问题:"dear" 是形容词,但 "valued" 可以是形容词或过去式动词。
上下文也很重要: 二元组 "亲爱的朋友" 可能比 "受重视的朋友" 更常见,但 "受重视的客户" 比 "亲爱的客户" 更常见。因此,还需要考虑给定单词的意思。
另一种方法是查看所有内容,并查看出现在类似上下文中的单词。但是,为了使其有效,您需要一个庞大的语料库,并且必须决定要使用多大的 n-gram 窗口(二元组上下文?20-元组上下文?)。
我建议你看一下WordNethttps://wordnet.princeton.edu/)的应用,它旨在帮助解决这些问题。不幸的是,我不确定你能够自己“解决”同义词的问题,但请继续寻找和提问!

编辑:我应该也包含了这个旧问题的链接:

如何从nltk WordNet Python获取同义词

以及NLTK与WordNet接口的文档:

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

我认为这些并没有回答你的问题,因为WordNet没有使用统计数据(这取决于您使用的语料库)。不过,您应该能够像上面那样应用它的同义词集。

我可以通过某个语料库创建一个包含每个词性词频的数据集,然后将其用作参考,对吗?不过我在想,我们是否已经有更简单的方法来做同样的事情了呢? - 42piratas
@Alexis 看到了你想做的事情!正如他们的回答所示,nltk.corpus中的语料库有一个tagged_words()方法,这正是你要寻找的,还有ConditionalFreqDist对象。 - Clay

0

另一个答案向您展示了如何使用同义词:

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频率的数据集,然后将其用作参考。 - 42piratas
1
正如@Clay所提到的,您也可以考虑将单词对以及单词本身存储起来。您会发现这很快就变成了一个庞大的数据库。顺便说一句,我在一天左右的时间里构思并编写了这个解决方案。并没有看起来那么令人望而生畏。 - Athena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接