📜  如何在Python从NLTK WordNet获取同义词/反义词?

📅  最后修改于: 2021-04-17 01:46:20             🧑  作者: Mango

WordNet是一个大型的英语词汇数据库。名词,动词,形容词和副词被分为多组认知同义词(同义词),每组表达不同的概念。同义词集通过概念语义和词汇关系相互关联。
WordNet的结构使其成为计算语言学和自然语言处理的有用工具。

WordNet表面上类似于一个同义词库,它根据单词的含义将单词分组在一起。但是,有一些重要的区别。

  • 首先,WordNet不仅链接单词形式(字母字符串) ,而且链接特定的单词含义。结果,在网络中彼此紧邻的单词在语义上被消除了歧义。
  • 其次,WordNet标记了单词之间的语义关系,而同义词库中的单词分组除了含义相似之外没有遵循任何明确的模式。
# First, you're going to need to import wordnet:
from nltk.corpus import wordnet
  
# Then, we're going to use the term "program" to find synsets like so:
syns = wordnet.synsets("program")
  
# An example of a synset:
print(syns[0].name())
  
# Just the word:
print(syns[0].lemmas()[0].name())
  
# Definition of that first synset:
print(syns[0].definition())
  
# Examples of the word in use in sentences:
print(syns[0].examples())

输出将如下所示:
计划01
计划
一系列要执行的步骤或要实现的目标
[‘他们制定了六步计划,’他们讨论了新债券发行的计划’]

接下来,我们如何辨别单词的同义词和反义词?引理将是同义词,然后您可以使用.antonyms查找引理的反义词。因此,我们可以填充一些列表,例如:

import nltk
from nltk.corpus import wordnet
synonyms = []
antonyms = []
  
for syn in wordnet.synsets("good"):
    for l in syn.lemmas():
        synonyms.append(l.name())
        if l.antonyms():
            antonyms.append(l.antonyms()[0].name())
  
print(set(synonyms))
print(set(antonyms))

输出将是两组同义词和反义词
{“有益”,“公正”,“直立”,“彻底”,“ in_force”,“好”,“熟练”,“熟练”,“健全”,“未受破坏”,“专家”,“熟练”,“ in_effect”,“荣誉”,“熟练”,“安全”,“商品”,“可估计”,“健全”,“正确”,“可敬”,“好”,“严重”,“成熟”,“美味” ,“亲爱的”,“实践的”,“善良”,“安全”,“有效”,“未受破坏”,“可靠”,“未分解”,“诚实”,“充实”,“附近”,“ trade_good”}} “邪恶”,“邪恶”,“坏”,“坏”,“病”}

现在,让我们比较任意两个词的相似性指数

import nltk
from nltk.corpus import wordnet
# Let's compare the noun of "ship" and "boat:"
  
w1 = wordnet.synset('run.v.01') # v here denotes the tag verb
w2 = wordnet.synset('sprint.v.01')
print(w1.wup_similarity(w2))

输出:
0.857142857143

w1 = wordnet.synset('ship.n.01')
w2 = wordnet.synset('boat.n.01') # n denotes noun
print(w1.wup_similarity(w2))

输出:
0.9090909090909091