web-dev-qa-db-ja.com

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

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

Nltk wordnetインターフェースが道を行くかもしれないと信じていますが、そのような単純なタスクのためにそれをどのように使用するか見当がつきません。

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

is_english_Word(token.lower())

将来的には、Wordの単数形が辞書にあるかどうかを確認できます(プロパティ->プロパティ->英語のWordなど)。どうすればそれを達成できますか?

117
Barthelemy

(はるかに)より多くのパワーと柔軟性を得るには、 PyEnchant のような専用のスペルチェックライブラリを使用します。 tutorial があります。または、すぐに飛び込むこともできます。

>>> 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 と呼ばれる複数形化ライブラリがあるように見えますが、それが良いかどうかはわかりません。

188
Katriel

NLTKの使用

from nltk.corpus import wordnet

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

Wordnetのインストールに問題がある場合、または他のアプローチを試したい場合は、 この記事 を参照してください。

40
Susheel Javadi

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
39
Sadik

セットを使用して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

質問の2番目の部分に答えるために、複数形はすでに適切なWordリストにありますが、何らかの理由でそれらをリストから明確に除外したい場合は、実際にそれを処理する関数を作成できます。しかし、英語の複数形ルールは非常に扱いにくいので、Wordリストに最初から複数形を含めるだけです。

英語の単語リストの場所については、「英語の単語リスト」をグーグルで検索してみました。以下にその1つを示します。 http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt これらの方言の1つが特に必要な場合は、イギリス英語またはアメリカ英語でGoogleを使用できます。

36
kindall

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

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
grizmin

セマンティックWebアプローチの場合、 RDF形式のWordNetに対するsparqlクエリ を実行できます。基本的にurllibモジュールを使用してGET要求を発行し、結果をJSON形式で返し、python 'json'モジュールを使用して解析します。英語の単語でない場合、結果は得られません。

別のアイデアとして、 ウィクショナリーのAPI をクエリできます。

1
burkestar