如何用 Python 检查一个单词是否是英文单词?
- 2025-01-14 08:50:00
- admin 原创
- 96
问题描述:
我想要用 Python 程序检查某个单词是否存在于英语词典中。
我相信 nltk wordnet 接口可能是可行的方法,但我不知道如何使用它完成如此简单的任务。
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
将来,我可能想检查某个单词的单数形式是否在字典中(例如,属性 -> 属性 -> 英文单词)。我该如何实现?
解决方案 1:
为了获得 (更多) 功能和灵活性,请使用专用的拼写检查库,例如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
,但我不知道它是否有用。
解决方案 2:
它与 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
解决方案 3:
使用NLTK:
from nltk.corpus import wordnet
if not wordnet.synsets(word_to_test):
#Not an English Word
else:
#English Word
如果您在安装 wordnet 时遇到困难或者想尝试其他方法,您应该参考这篇文章。
解决方案 4:
使用集合来存储单词列表,因为查找它们会更快:
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 如果您想要其中一种方言,您可以谷歌搜索英式英语或美式英语。
解决方案 5:
对于所有 Linux/Unix 用户
如果您的操作系统使用 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()
file.close()
def is_word(word):
return word.lower() in words
is_word("tarts") ## Returns true
is_word("jwiefjiojrfiorj") ## Returns False
希望这有帮助!
编辑:如果您找不到该words
文件或类似内容,请参阅下面菲尔博士的评论。
解决方案 6:
我发现有 3 个基于包的解决方案可以解决这个问题。它们是 pyenchant、wordnet 和 corpus(自定义或来自 ntlk)。Pyenchant 无法在win64 上使用 py3轻松安装。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
解决方案 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
解决方案 8:
使用 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
解决方案 9:
以上库都不包含所有英文单词,因此我从链接导入了一个包含所有英文单词的 csv 文件:-->
https://github.com/dwyl/english-words
然后简单地把它变成一个pandas dataframe
并进行比较
解决方案 10:
对于语义网方法,您可以对 RDF 格式的 WordNet 运行 sparql 查询。基本上只需使用 urllib 模块发出 GET 请求并以 JSON 格式返回结果,使用 python“json”模块进行解析。如果不是英文单词,您将得不到任何结果。
另一个想法是,您可以查询Wiktionary 的 API。
解决方案 11:
使用 nltk.corpus 而不是 enchant。Enchant 给出的结果不明确。例如:对于 benchmark 和 benchmark-mark enchant 返回 true。它应该假设对于 benchmark 返回 false。
解决方案 12:
下载此 txt 文件https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt
然后Set
使用以下 Python 代码片段创建一个,该代码片段加载约 370k 个非字母数字英文单词
>>> with open("/PATH/TO/words_alpha.txt") as f:
>>> words = set(f.read().split('
'))
>>> len(words)
370106
从现在开始,你可以使用以下方法在恒定时间内检查是否存在
>>> word_to_check = 'baboon'
>>> word_to_check in words
True
请注意,这套工具可能并不全面,但仍然可以完成工作,用户应该进行质量检查以确保它也适用于他们的用例。