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?

97
demandé sur Salvador Dali 2010-09-24 20:01:15

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.

165
répondu Katriel 2018-09-24 03:04:33

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.

34
répondu Susheel Javadi 2011-11-16 23:26:17

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.

31
répondu kindall 2010-09-24 16:28:34

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
28
répondu Sadik 2014-01-28 08:38:26

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
4
répondu Eb Abadi 2016-12-07 06:35:16

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 .

0
répondu burkestar 2017-05-23 11:55:03

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
0
répondu grizmin 2017-05-04 14:16:16