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

Bar*_*emy 124 python nltk wordnet

我想检查一个Python程序,如果一个单词在英语词典中.

我相信nltk wordnet界面可能是要走的路,但我不知道如何将它用于这么简单的任务.

def is_english_word(word):
    pass # how to I implement is_english_word?

is_english_word(token.lower())
Run Code Online (Sandbox Code Playgroud)

在将来,我可能想检查一个单词的单数形式是否在字典中(例如,属性 - >属性 - >英语单词).我怎么做到这一点?

Kat*_*iel 195

对于(更多)更强大的功能和灵活性,请使用专用的拼写检查库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"]
>>>
Run Code Online (Sandbox Code Playgroud)

PyEnchant附带一些词典(en_GB,en_US,de_DE,fr_FR),但如果你想要更多语言,可以使用任何OpenOffice词典.

似乎有一个叫做多元化的库inflect,但我不知道它是否有用.

  • 套餐基本上不可能为我安装.超级沮丧. (9认同)
  • 目前在Windows上的python 64bit不支持附魔:( https://github.com/rfk/pyenchant/issues/42 (8认同)
  • [pyenchant](https://github.com/rfk/pyenchant)不再维护。[pyhunspell](https://github.com/blatinier/pyhunspell)最近有活动。* nix设置也可以引用`/ usr / share / dict /`和`/ var / lib / dict`。 (5认同)
  • 谢谢,我不知道PyEnchant,它确实对我想做的那种检查更有用. (2认同)
  • [pyenchant](https://github.com/pyenchant/pyenchant) 显然已经找到了维护者(2021 年 8 月)。 (2认同)

Sad*_*dik 42

它不适用于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
Run Code Online (Sandbox Code Playgroud)

  • 同样的提法也适用于此:转换为集合时更快:set(words.words()) (3认同)
  • 注意:此列表中找不到像意大利面或汉堡这样的词 (3认同)

Sus*_*adi 40

使用NLTK:

from nltk.corpus import wordnet

if not wordnet.synsets(word_to_test):
  #Not an English Word
else:
  #English Word
Run Code Online (Sandbox Code Playgroud)

如果您在安装wordnet时遇到问题或想尝试其他方法,请参阅本文.

  • WordNet不包含英文中的每个单词,它只包含一小部分单词. (24认同)
  • 对我不起作用.`wordnet.synsets("would")`返回`[]` (4认同)
  • 此外,wordnet.synsets不会简单地检查一个单词是否在其中.它试图首先进行引理化.因此它将"无用"(不是真正的英语单词)转换为"销售". (3认同)
  • 这对于cygwin用户特别有用,因为安装附魔非常麻烦。 (2认同)
  • 在词网顶部,缺少大量常见的词(如“将”和“如何”),这比kindall的解决方案要慢得多。 (2认同)

kin*_*all 35

使用一个集来存储单词列表因为查找它们会更快:

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
Run Code Online (Sandbox Code Playgroud)

要回答问题的第二部分,复数已经在一个好的单词列表中,但如果你想出于某种原因专门从列表中排除那些,你可以写一个函数来处理它.但是英语复数规则很棘手,我只是在单词列表中包含复数.

至于在哪里找到英文单词列表,我通过谷歌搜索"英文单词列表"找到了几个.这是一个:http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt 如果你想特别使用其中一种方言,你可以谷歌英语或美国英语.

  • 如果你将`english_words`改为`set`而不是`list`,那么`is_english_word`将会运行得更快. (9认同)
  • 在ubuntu下,"wamerican"和"wbritish"包提供美国和英国英语单词列表为`/ usr/share/dict/* - english`.包信息提供http://wordlist.sourceforge.net作为参考. (3认同)

Jam*_*ood 17

对于所有 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

编辑:如果您找不到该words文件或类似的内容,请参阅下面菲尔博士的评论。

  • 这是一个很好的答案,因为它避免了为这个简单的任务安装大量的 NLP 库。唯一的注释是在您的示例中,您将文件保持打开状态 - 在“with open(...)”块中执行此操作会更好(或者在加载单词后添加 file.close() )。 (5认同)
  • 如果您的 Linux 安装上默认没有 Words 文件(*我的 Ubuntu 22.04 没有它*),那么您可以运行 ``sudo apt install wordlist``` 来查找所有相关的软件包。例如,我然后运行 ​​``sudo apt install wamerican``` 来安装美式英语单词列表 (2认同)

Eb *_*adi 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
Run Code Online (Sandbox Code Playgroud)

  • 使用集合代替字典 (2认同)

小智 5

我发现有 3 个基于包的解决方案可以解决这个问题。它们是 pyenchant、wordnet 和语料库(自定义或来自 ntlk)。Pyenchant 无法使用 py3win64 中轻松安装。Wordnet 不能很好地工作,因为它的语料库不完整。所以对我来说,我选择 @Sadik 回答的解决方案,并使用 'set(words.words())' 来加速。

第一的:

pip3 install nltk
python3

import nltk
nltk.download('words')
Run Code Online (Sandbox Code Playgroud)

然后:

from nltk.corpus import words
setofwords = set(words.words())

print("hello" in setofwords)
>>True
Run Code Online (Sandbox Code Playgroud)