Wordが英語の辞書にあるかどうかPythonプログラムをチェックインしたい。
Nltk wordnetインターフェースが道を行くかもしれないと信じていますが、そのような単純なタスクのためにそれをどのように使用するか見当がつきません。
def is_english_Word(word):
pass # how to I implement is_english_word?
is_english_Word(token.lower())
将来的には、Wordの単数形が辞書にあるかどうかを確認できます(プロパティ->プロパティ->英語のWordなど)。どうすればそれを達成できますか?
(はるかに)より多くのパワーと柔軟性を得るには、 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
と呼ばれる複数形化ライブラリがあるように見えますが、それが良いかどうかはわかりません。
NLTKの使用:
from nltk.corpus import wordnet
if not wordnet.synsets(Word_to_test):
#Not an English Word
else:
#English Word
Wordnetのインストールに問題がある場合、または他のアプローチを試したい場合は、 この記事 を参照してください。
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
セットを使用して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を使用できます。
より高速な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 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
セマンティックWebアプローチの場合、 RDF形式のWordNetに対するsparqlクエリ を実行できます。基本的にurllibモジュールを使用してGET要求を発行し、結果をJSON形式で返し、python 'json'モジュールを使用して解析します。英語の単語でない場合、結果は得られません。
別のアイデアとして、 ウィクショナリーのAPI をクエリできます。