Pythonで単語が英語の単語かどうかを確認する方法


134

単語が英語の辞​​書にあるかどうかをPythonプログラムでチェックしたい。

nltk wordnetインターフェースが適切な方法であると思いますが、そのような単純なタスクでそれを使用する方法はわかりません。

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

is_english_word(token.lower())

将来的には、単語の単数形が辞書にあるかどうかを確認する必要があるかもしれません(たとえば、プロパティ->プロパティ->英語の単語)。どうすればそれを達成できますか?

回答:


215

より多くのパワーと柔軟性を得るには、などの専用のスペルチェックライブラリを使用し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
ありがとう、私はPyEnchantについて知りませんでした、そして私がしたい種類のチェックのためにそれは確かにはるかに有用です。
Barthelemy

<helo>を認識しない?一般的な言葉ではありませんが、<helo>を<helicopter>の省略形として知っています。また、<Helot>は知りません。ソリューションは万能ではなく、プロジェクトごとに異なる辞書または異なるアプローチが必要になる可能性があることを指摘したかっただけです。
dmh 2012

15
パッケージをインストールするのは基本的に不可能です。スーパーイライラ。
モニカヘドネック2017年

9
Enchantは現在、Windowsのpython 64ビットではサポートされていません:( github.com/rfk/pyenchant/issues/42
Ricky Boyce

9
pyenchantは維持されなくなりました。pyhunspellには最近の活動があります。また/usr/share/dict//var/lib/dict* nixセットアップで参照される場合もあります。
pkfm

48

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

5
同じ言及はここにも適用されます。たくさんの速いセットに変換するとき:set(words.words())
Iuliusカート

適切な結果を得るために単語を単数化する必要があるので注意してください
famargar

2
注意:パスタやハンバーガーなどの単語はこのリストにありません
Paroksh Saxena

45

NLTKの使用

from nltk.corpus import wordnet

if not wordnet.synsets(word_to_test):
  #Not an English Word
else:
  #English Word

wordnetのインストールに問題がある場合、または他の方法を試したい場合は、この記事を参照してください


2
enchantのインストールは非常に問題があるため、cygwinユーザーにとって特に便利です。
alehro

27
WordNetには英語のすべての単語が含まれているわけではなく、その一部のみが含まれています。
2013年

2
ワードネットに加えて、「would」や「how」などの一般的な単語が大量に不足しているため、これはkindallのソリューションよりも著しく低速です。
Ryan Epp

3
さらに、wordnet.synsetsは単語が含まれているかどうかをチェックするだけではありません。それは最初にlemmaizeしようとします。したがって、「saless」(実際の英語の単語ではない)を「sales」に変換します。
Lyndon White

これは、synsetがどのように機能するかを考えると、これを行うには欠陥のある方法です。'tiltes'を入力して、私が言っていることを確認します
RetroCode

37

セットを使用して単語リストを格納すると、検索が高速になります。

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

質問の2番目の部分に答えるには、複数形は既に良い単語リストにありますが、何らかの理由でリストからそれらを明確に除外したい場合は、それを処理する関数を実際に作成できます。しかし、英語の複数形化の規則は、私が最初に単語リストに複数形を含めるだけで十分にトリッキーです。

英語の単語リストを見つける場所については、グーグル検索するだけで「英語の単語リスト」をいくつか見つけました。ここに1つあります:http : //www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt これらの方言の1つを具体的に必要とする場合は、イギリス英語またはアメリカ英語でGoogleを使用できます。


9
あなたが作る場合は代わりに、その後、はるかに高速に実行されます。english_wordssetlistis_english_word
dan04

私は実際にはそれを口述としてやり直しただけですが、あなたの言う通り、セットの方がさらに優れています。更新しました。
キンドール

1
捨てて.xreadlines()、単に繰り返すこともできword_fileます。
FogleBird 2010

3
ubuntuでは、パッケージとしてwamericanwbritishアメリカ英語とイギリス英語の単語リストをとして提供します/usr/share/dict/*-english。パッケージ情報は、wordlist.sourceforge.netを参照として提供します。
2010

1
479kの英語の単語を含むGitHubリポジトリを見つけました。
haolee 2017年

6

より高速な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

2
辞書の代りに、セット使う
jhuang

4

この問題を解決するための3つのパッケージベースのソリューションがあることがわかりました。それらは、pyenchant、wordnet、およびコーパスです(自己定義またはntlkから)。Pyenchantはpy3のあるwin64に簡単にインストールできませんでした。コーパスが完全ではないため、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

3

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

1
これは、テキストが3ワードより長く、エラーが4つ(認識されないワード)未満の場合にtrueを返します。一般的に、私のユースケースでは、これらの設定はかなりうまくいきます。
グリズミン


1

すべてのLinux / Unixユーザー向け

OSが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

お役に立てれば!!!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.