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

2025-01-14 08:50:00
admin
原创
96
摘要:问题描述:我想要用 Python 程序检查某个单词是否存在于英语词典中。我相信 nltk wordnet 接口可能是可行的方法,但我不知道如何使用它完成如此简单的任务。def is_english_word(word): pass # how to I implement is_english_wor...

问题描述:

我想要用 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

请注意,这套工具可能并不全面,但仍然可以完成工作,用户应该进行质量检查以确保它也适用于他们的用例。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用