Comment vérifier si un mot est un mot anglais avec Python?
Question
Je veux vérifier dans un programme Python si un mot est dans le dictionnaire anglais.
Je crois que l'interface NLTK WordNet pourrait être le chemin à parcourir, mais je n'ai pas la moindre idée comment l'utiliser pour une tâche simple.
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
Dans l'avenir, je pourrais vouloir vérifier si la forme singulière d'un mot est dans le dictionnaire (par exemple, les propriétés -> propriété -> mot anglais). Comment puis-je obtenir cela?
La solution
Pour (beaucoup) plus de puissance et de flexibilité, utiliser une bibliothèque spellchecking dédié comme PyEnchant
. Il y a un tutoriel , ou vous pouvez tout droit plonger dans:
>>> 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
est livré avec quelques dictionnaires (en_GB, en_US, de_DE,) fr_FR, mais peut utiliser l'une des inflect
, mais je n'ai aucune idée que ce soit tout bon.
Autres conseils
Utilisation NLTK :
from nltk.corpus import wordnet
if not wordnet.synsets(word_to_test):
#Not an English Word
else:
#English Word
Vous devriez consulter cet article si vous avez WordNet d'installation du mal ou si vous voulez essayer d'autres approches.
Il ne fonctionne pas bien avec WordNet, parce que WordNet ne contient pas tous les mots anglais. Une autre possibilité basée sur NLTK sans enchanter est les paroles de NLTK corpus
>>> 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
L'utilisation d'un ensemble pour stocker la liste de mots, car les regardant sera plus rapide:
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
Pour répondre à la deuxième partie de la question, les pluriels serait déjà une bonne liste de mots, mais si vous voulez exclure spécifiquement ceux de la liste pour une raison quelconque, vous pouvez en effet écrire une fonction pour gérer. Mais l'anglais règles sont assez délicates pluriel des noms que je venais de les inclure dans la liste pluriels des mots pour commencer.
Quant à savoir où trouver des listes de mots anglais, je l'ai trouvé plusieurs simplement par googler « mot anglais liste ». Voici un: http://www.sil.org/linguistics/wordlists /english/wordlist/wordsEn.txt vous pouvez Google pour anglais britannique ou américain, si vous voulez plus précisément l'un de ces dialectes.
Pour une solution plus rapide à base NLTK vous pouvez hachage l'ensemble des mots pour éviter une recherche linéaire.
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
Pour une approche Web sémantique, vous pouvez exécuter un sparql requête contre WordNet au format RDF . Fondamentalement, il suffit d'utiliser urllib module pour demander la délivrance GET et les résultats de retour au format JSON, analyse syntaxique en utilisant python « json » module. Si ce n'est pas mot anglais que vous aurez aucun résultat.
Comme une autre idée, vous pouvez interroger API Wiktionnaire .
Avec 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
Je trouve qu'il ya 3 solutions par package pour résoudre le problème. Ils sont pyenchant, wordnet et corpus (auto-défini ou de ntlk). Pyenchant ne pouvait pas installé facilement dans win64 avec PY3 . Wordnet ne fonctionne pas très bien parce que corpus de n'est pas complet. Donc, pour moi, Je choisis la solution répond par @Sadik , et l'utilisation 'set (words.words ())' pour accélérer.
Tout d'abord:
pip install -U nltk
python
import nltk
nltk.download(words)
Alors:
from nltk.corpus import words
if "hello" in set(words.words())
>>True