如果单词在英语词典中,我想检查Python程序。
我相信nltk wordnet界面可能是要走的路,但我不知道如何将它用于这么简单的任务。
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
将来,我可能想检查一个单词的单数形式是否在字典中(例如,属性 - >属性 - >英语单词)。我将如何实现这一目标?
答案 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内核,则有一种简单的方法可以从英语/美国词典中获取所有单词。在目录/usr/share/dict
中,您有一个words
文件。还有一个更具体的american-english
和british-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