如何使用Python检查单词是否为英语单词?
我想在Python程序中检查一个单词是否在英语词典中 我相信nltk wordnet接口可能是一个不错的选择,但我不知道如何将其用于如此简单的任务如何使用Python检查单词是否为英语单词?,python,nltk,wordnet,Python,Nltk,Wordnet,我想在Python程序中检查一个单词是否在英语词典中 我相信nltk wordnet接口可能是一个不错的选择,但我不知道如何将其用于如此简单的任务 def is_english_word(word): pass # how to I implement is_english_word? is_english_word(token.lower()) 将来,我可能想检查字典中是否有单数形式的单词(例如,properties->property->english word)。如何实现这一点
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
将来,我可能想检查字典中是否有单数形式的单词(例如,properties->property->english word)。如何实现这一点?使用集合存储单词列表,因为查找单词列表会更快:
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
为了回答问题的第二部分,复数应该已经在一个很好的单词列表中,但是如果出于某种原因想要特别地从列表中排除复数,那么您确实可以编写一个函数来处理它。但是英语的复数化规则非常复杂,所以我首先要在单词列表中包含复数
至于在哪里可以找到英语单词表,我通过谷歌搜索“英语单词表”找到了几个。这里有一个:如果你特别想要英国或美国的方言,你可以在谷歌上搜索英国或美国英语。要获得(更多)的功能和灵活性,请使用专门的拼写检查库,如。有一个,或者你可以直接跳进去:
>>> 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),但如果需要更多语言,可以使用其中的任何一种
似乎有一个名为的多元化库,但我不知道它是否有用。对于语义web方法,您可以运行一个。基本上只需使用urllib模块发出GET请求并以JSON格式返回结果,使用python“JSON”模块进行解析。如果不是英语单词,你将得不到任何结果
另一个想法是,您可以使用NLTK查询。:
from nltk.corpus import wordnet
if not wordnet.synsets(word_to_test):
#Not an English Word
else:
#English Word
如果您在安装wordnet时遇到问题或想尝试其他方法,请参阅。wordnet无法正常使用,因为wordnet不包含所有英语单词。 另一种基于NLTK而不使用enchant的可能性是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
为了获得更快的基于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
使用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
从enchant.checker导入拼写检查器
def是英文的(引用):
d=拼写检查器(“en_US”)
d、 设置文本(引号)
errors=[err.word表示d中的错误]
如果((len(errors)>4)或len(quote.split())<3)为True,则返回False
印刷品(是英文的吗办理美国加州州立大学圣贝纳迪诺分校高仿成绩单Q/V2166384296加州州立大学圣贝纳迪诺分校学历学位认证'))
print(是英文(“‘两件事是无限的:宇宙和人类的愚蠢;我不确定宇宙。”))
>假的
>真的
我发现有3种基于包的解决方案可以解决这个问题。它们是pyenchant、wordnet和corpus(自定义或来自ntlk).Pyenchant无法使用py3轻松安装到win64中。Wordnet工作不太好,因为它的语料库不完整。因此,对于我来说,我选择了@Sadik回答的解决方案,并使用“set(words.words())”来加快速度
第一:
pip3 install nltk
python3
import nltk
nltk.download('words')
然后:
适用于所有Linux/Unix用户
如果您的操作系统使用Linux内核,有一种简单的方法可以从英语/美国词典中获取所有单词。在目录/usr/share/dict
中,您有一个单词文件。还有一个更具体的美式英语和英式英语文件。这些文件包含该特定目录中的所有单词语言。你可以在每种编程语言中访问它,这就是为什么我认为你可能想知道这一点
现在,对于特定于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
希望这有帮助!!!使用nltk.corpus而不是enchant。enchant会给出不明确的结果。例如:
对于基准测试和基准点,enchant正在返回true。它应该假设为基准测试返回false。如果您将英语单词
设置为集而不是列表,那么is\u英语单词
将运行得更快。实际上,我只是将其作为dict重新编辑,但您是对的,设置会更好。更新。您还可以沟渠.xreadlines()
只需反复浏览word\u文件
。在ubuntu下,软件包wamerican
和wbritish
提供了美式和英式英语单词列表,如/usr/share/dict/*-English
。软件包信息作为参考。我找到了一个包含479k英语单词的列表。谢谢,我不知道PyEnchant和它确实对我想要进行的检查更有用。它不识别?不是一个常用词,但我知道它是的缩写,我不知道。我只是想指出,解决方案不是一刀切的,不同的项目可能需要不同的字典或完全不同的方法。包是bas我无法安装。非常令人沮丧。windows上的python 64位目前不支持Enchant:(不再维护。有更近期的活动。另外,/usr/share/dict/
和/var/lib/dict
可能会在*nix设置上引用。它对cygwin用户特别有用,因为安装enchant非常麻烦。WordNet不包含英语中的每个单词,它只包含一小部分。在WordNet之上缺少大量常用词,如“would”和“how”,这显然比kindall的解决方案要慢。此外,wordnet.synsets不只是检查单词是否在其中。它尝试先检查单词。因此它将“sales”(不是真正的英语单词)转换为“sales”考虑到语法集是如何工作的,这是一种有缺陷的方法。用“tiltes”来看看我说的是什么同样的说法在这里也适用:转换为集合时要快得多:set(words.words())
小心,因为你需要对单词进行单数化以获得正确的结果注意:没有找到像意大利面或汉堡这样的单词
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