170

如果一个单词在英语词典中,我想检查一个 Python 程序。

我相信 nltk wordnet 接口可能是要走的路,但我不知道如何将它用于如此简单的任务。

def is_english_word(word):
    pass # how to I implement is_english_word?

is_english_word(token.lower())

将来,我可能想检查一个单词的单数形式是否在字典中(例如,属性-> 属性-> 英文单词)。我将如何实现这一目标?

4

11 回答 11

253

为了(更多)功能和灵活性,请使用专用的拼写检查库,例如PyEnchant. 有一个教程,或者你可以直接潜入:

>>> import enchant
>>> d = enchant.Dict("en_US")
>>> d.check("Hello")
True
>>> d.check("Helo")
False
>>> d.suggest("Helo")
['He lo', 'He-lo', 'Hello', 'Helot', 'Help', 'Halo', 'Hell', 'Held', 'Helm', 'Hero', "He'll"]
>>>

PyEnchant附带一些字典(en_GB、en_US、de_DE、fr_FR),但如果您想要更多语言,可以使用任何OpenOffice 的。

似乎有一个名为 的多元化库inflect,但我不知道它是否有任何好处。

于 2010-09-24T16:26:11.297 回答
68

它不适用于 WordNet,因为 WordNet 不包含所有英文单词。另一种基于NLTK没有附魔的可能性是NLTK的单词语料库

>>> from nltk.corpus import words
>>> "would" in words.words()
True
>>> "could" in words.words()
True
>>> "should" in words.words()
True
>>> "I" in words.words()
True
>>> "you" in words.words()
True
于 2014-01-28T08:38:26.433 回答
50

使用 NLTK

from nltk.corpus import wordnet

if not wordnet.synsets(word_to_test):
  #Not an English Word
else:
  #English Word

如果您在安装 wordnet 时遇到问题或想尝试其他方法,您应该参考这篇文章。

于 2011-03-18T11:29:06.023 回答
42

使用集合来存储单词列表,因为查找它们会更快:

with open("english_words.txt") as word_file:
    english_words = set(word.strip().lower() for word in word_file)

def is_english_word(word):
    return word.lower() in english_words

print is_english_word("ham")  # should be true if you have a good english_words.txt

为了回答问题的第二部分,复数已经在一个很好的单词列表中,但是如果您出于某种原因想从列表中明确排除这些,您确实可以编写一个函数来处理它。但是英语的复数规则很棘手,我只需要在单词列表中包含复数。

至于在哪里可以找到英文单词表,我只是通过谷歌搜索“英文单词表”找到了几个。这是一个:http ://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt 如果您特别想要其中一种方言,您可以谷歌搜索英式或美式英语。

于 2010-09-24T16:12:00.430 回答
7

对于更快的基于 NLTK 的解决方案,您可以散列单词集以避免线性搜索。

from nltk.corpus import words as nltk_words
def is_english_word(word):
    # creation of this dictionary would be done outside of 
    #     the function because you only need to do it once.
    dictionary = dict.fromkeys(nltk_words.words(), None)
    try:
        x = dictionary[word]
        return True
    except KeyError:
        return False
于 2016-06-27T19:58:47.543 回答
6

适用于所有 Linux/Unix 用户

如果您的操作系统使用 Linux 内核,则有一种简单的方法可以从英/美词典中获取所有单词。在目录/usr/share/dict中,您有一个words文件。还有一个更具体的american-englishbritish-english文件。这些包含该特定语言的所有单词。您可以在每种编程语言中访问它,这就是为什么我认为您可能想知道这一点。

现在,对于特定于 python 的用户,下面的 python 代码应该将列表单词分配给每个单词的值:

import re
file = open("/usr/share/dict/words", "r")
words = re.sub("[^\w]", " ",  file.read()).split()
file.close()
    
def is_word(word):
    return word.lower() in words
 
is_word("tarts") ## Returns true
is_word("jwiefjiojrfiorj") ## Returns False

希望这可以帮助!

于 2020-04-28T12:09:38.953 回答
5

我发现有 3 个基于包的解决方案可以解决这个问题。它们是 pyenchant、wordnet 和 corpus(自定义或来自 ntlk)。Pyenchant 无法使用 py3 在 win64中轻松安装。Wordnet 不能很好地工作,因为它的语料库不完整。所以对我来说,我选择 @Sadik 回答的解决方案,并使用 'set(words.words())' 来加快速度。

第一的:

pip3 install nltk
python3

import nltk
nltk.download('words')

然后:

from nltk.corpus import words
setofwords = set(words.words())

print("hello" in setofwords)
>>True
于 2019-02-03T03:53:12.450 回答
3

使用 pyEnchant.checker 拼写检查器:

from enchant.checker import SpellChecker

def is_in_english(quote):
    d = SpellChecker("en_US")
    d.set_text(quote)
    errors = [err.word for err in d]
    return False if ((len(errors) > 4) or len(quote.split()) < 3) else True

print(is_in_english('“办理美国加州州立大学圣贝纳迪诺分校高仿成绩单Q/V2166384296加州州立大学圣贝纳迪诺分校学历学位认证'))
print(is_in_english('“Two things are infinite: the universe and human stupidity; and I\'m not sure about the universe.”'))

> False
> True
于 2017-05-04T14:16:16.293 回答
1

对于语义 Web 方法,您可以针对 RDF 格式的 WordNet 运行 sparql 查询。基本上只是使用 urllib 模块发出 GET 请求并以 JSON 格式返回结果,使用 python 'json' 模块解析。如果不是英文单词,您将不会得到任何结果。

作为另一个想法,您可以查询维基词典的 API

于 2010-09-24T17:28:58.483 回答
0

使用 nltk.corpus 代替附魔。Enchant 给出了模棱两可的结果。例如:对于基准和基准,附魔返回 true。它应该假设返回 false 作为基准。

于 2021-04-10T11:51:42.273 回答
0

你可以看到这个页面:

如何确定语言

我推荐langid

于 2021-10-12T19:50:06.773 回答