为什么NLTK WordNet找不到简单的单词?

时间:2014-01-18 17:28:24

标签: python nltk wordnet

我想编写一个简单的函数,通过NLTK查看WordNet中的这个词是否“存在”。

def is_known(word):
    """return True if this word "exists" in WordNet
       (or at least in nltk.corpus.stopwords)."""
    if word.lower() in nltk.corpus.stopwords.words('english'):
        return True
    synset = wn.synsets(word)
    if len(synset) == 0:
        return False
    else:
        return True

为什么could, since, without, although之类的字会返回False?它们不会出现在WordNet中吗?有没有更好的方法来确定WN中是否存在单词(使用NLTK)?

我的第一次尝试是消除像“{1}}这样的单词的”停用词“,但仍然有一些我常见的单词(如to, if, when, then, I, you)。

2 个答案:

答案 0 :(得分:6)

WordNet不包含这些单词或类似单词。有关说明,请参阅WordNet docs

中的以下内容
Q. Why is WordNet missing: of, an, the, and, about, above, because, etc.
A. WordNet only contains "open-class words": nouns, verbs, adjectives, and adverbs. Thus, excluded words include determiners, prepositions, pronouns, conjunctions, and particles.

您也无法在WordNet的在线版本中找到这些单词。

答案 1 :(得分:0)

您可以尝试提取wordnet中的所有引理,然后检查该列表:

from nltk.corpus import wordnet as wn
from itertools import chain
all_lemmas = set(chain(*[i.lemma_names for i in wn.all_synsets()]))

def in_wordnet(word):
  return True if word in all_lemmas else False

print in_wordnet('can')
print in_wordnet('could')

<强> [OUT]:

True
False

请注意wordnet包含lemmas而不是单词。另请注意,单词/引理可以是多义的,而不是真正的含义词,例如。

I can foo bar. vs The water can is heavy