如何用Python检查单词是否是英文单词?

时间:2010-09-24 16:01:16

标签: python nltk wordnet

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

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

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

is_english_word(token.lower())

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

10 个答案:

答案 0 :(得分:182)

对于(更多)更强大的功能和灵活性,请使用专用的拼写检查库,如PyEnchant。有一个tutorial,或者你可以直接潜入:

>>> 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 ones中的任何一种。

似乎有一个名为inflect的复数库,但我不知道它是否有用。

答案 1 :(得分:39)

使用NLTK

from nltk.corpus import wordnet

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

如果您在安装wordnet时遇到问题或想尝试其他方法,请参阅this article

答案 2 :(得分:36)

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

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如果您特别想要其中一种方言,您可以使用谷歌英语或美国英语。

答案 3 :(得分:35)

它不适用于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

答案 4 :(得分:5)

对于更快的基于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

答案 5 :(得分:1)

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

另外一个想法是,您可以查询Wiktionary's API

答案 6 :(得分:1)

使用pyEnchant.checker SpellChecker:

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

答案 7 :(得分:1)

对于所有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()

def is_word(word):
    return word.lower() in words

is_word("tarts") ## Returns true
is_word("jwiefjiojrfiorj") ## Returns False

希望这会有所帮助!

答案 8 :(得分:0)

使用 nltk.corpus 而不是附魔。附魔给出了模棱两可的结果。例如 : 对于基准测试和基准测试附魔返回 true。它应该假设为基准返回 false。

答案 9 :(得分:-1)

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

第一:

pip install -U nltk
python
import nltk
nltk.download(words)

然后:

from nltk.corpus import words
if "hello" in set(words.words())
>>True