Comment vérifier si un mot est un mot anglais avec Python?
je veux vérifier dans un programme Python Si un mot est dans le dictionnaire anglais.
je crois que NLTK wordnet interface pourrait être la voie à suivre, mais je n'ai aucune idée comment l'utiliser pour une tâche aussi simple.
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
dans le futur, je pourrais vouloir vérifier si la forme singulière d'un mot est dans le dictionnaire (par exemple, propriétés -> propriété -> mot anglais). Comment pourrais-je y parvenir?
7 réponses
pour (beaucoup) plus de puissance et de flexibilité, utilisez une bibliothèque dédiée spellchecking comme PyEnchant
. Il y a un tutoriel , ou vous pouvez plonger directement 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 n'importe lequel des OpenOffice ones si vous voulez plus de langues.
Il semble y avoir une pluralisation bibliothèque appelée inflect
, mais je ne sais pas si c'est bon.
utilisant NLTK :
from nltk.corpus import wordnet
if not wordnet.synsets(word_to_test):
#Not an English Word
else:
#English Word
vous devriez vous référer à cet article si vous avez de la difficulté à installer wordnet ou si vous voulez essayer d'autres approches.
en utilisant un ensemble pour stocker la liste de mots parce que les chercher 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 seconde partie de la question, les pluriels seraient déjà dans une bonne liste de mots, mais si vous vouliez exclure spécifiquement ceux de la liste pour une raison quelconque, vous pourriez en effet écrire une fonction pour la gérer. Mais les règles de pluralisation en anglais sont assez délicates pour que j'inclue les plurals dans la liste des mots pour commencer.
As pour trouver des listes de mots en anglais, j'en ai trouvé plusieurs en Googlant "English word list". En voici un: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt vous pouvez rechercher L'anglais britannique ou Américain sur Google si vous voulez spécifiquement l'un de ces dialectes.
cela ne fonctionnera pas bien avec WordNet, parce que WordNet ne contient pas tous les mots anglais. Une autre possibilité basée sur NLTK sans enchantement est les mots 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
pour une solution basée sur NLTK plus rapide, vous pouvez hachez l'ensemble de 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 lancer une requête sparql contre WordNet au format RDF . Fondamentalement, il suffit d'utiliser le module urllib pour publier la requête GET et retourner les résultats au format JSON, analyse en utilisant le module 'JSON' de python. Si ce n'est pas le mot anglais, vous n'obtiendrez aucun résultat.
comme autre idée, vous pouvez interroger API de Wiktionary .
avec pyEnchant.correcteur Correcteur d'orthographe:
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