Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python检查单词是否为英语单词?_Python_Nltk_Wordnet - Fatal编程技术网

如何使用Python检查单词是否为英语单词?

如何使用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)。如何实现这一点

我想在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)。如何实现这一点?

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

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