有没有办法找到NLTK最常用的单词同义词?我想使用每个单词的最常见同义词来简化句子。
如果句子中使用的单词已经是同义词组中最常用的单词,则不应更改。
让我们说“嗨”比“你好”更常见; “亲爱的”比“有价值”更常见;而“朋友”已经是其组同义词中最常见的词。
Input: "Hello my valued friend"
Return: "Hi my dear friend"
答案 0 :(得分:4)
同义词很棘手,但是如果你开始使用Wordnet中的synset并且你只想选择集合中最常见的成员,那么它非常简单:只需从语料库中构建自己的频率列表,然后查找每个用于选择最大值的synset的成员。
nltk允许您只用几行代码构建一个频率表。这是基于布朗语料库的一个:
from nltk.corpus import brown
freqs = nltk.FreqDist(w.lower() for w in brown.words())
然后,您可以查找单词的频率:
>>> print(freqs["valued"])
14
当然,你需要做更多的工作:我会分别为每个主要词性计算单词(wordnet提供n
,v
,a
,和r
,分别为noun
,verb
,adjective
和adverb
),并使用这些特定于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
答案 1 :(得分:2)
同义词是自然语言处理中一个巨大而开放的工作领域。
在您的示例中,程序如何知道允许的同义词是什么?一种方法可能是保留每个单词的同义词集的字典。但是,由于词性的重叠,这可能会遇到问题:"亲爱的"是一个形容词,但有价值的"可以是形容词或过去时动词。
语境也很重要:二重奏"亲爱的朋友"可能比有价值的朋友"更常见,但是"有价值的顾客"比亲爱的客户更常见#34;因此,也需要考虑给定单词的意义。
另一种方法可能只是查看所有内容并查看在类似上下文中出现的单词。你需要一个巨大的 语料库来实现这一目标,并且你必须决定你想要使用的 n-gram 窗口有多大(一个二元组语境?一个20克的语境?)。
我建议你看看 WordNet (https://wordnet.princeton.edu/)的应用程序,这些应用程序旨在帮助解决其中的一些问题。不幸的是,我不确定你是否会找到解决问题的方法。你自己的同义词,但继续寻找和提问!
修改:我应该将此链接包含在较旧的问题中:
How to get synonyms from nltk WordNet Python
与WordNet接口的NLTK文档:
但是,我不认为这些可以解决您的问题,因为WordNet没有使用统计信息(这取决于您使用的语料库)。但是,您应该能够在上述方法中应用其同义词。答案 2 :(得分: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帖子一样,尝试摄取大量的推文。了解你最终要处理的事情。