Comment vérifier si un mot est un mot anglais avec Python?

134

Je veux vérifier dans un programme Python si un mot est dans le dictionnaire anglais.

Je pense que l'interface nltk wordnet pourrait être la solution, mais je n'ai aucune idée de 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())

À l'avenir, 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?

Barthélemy
la source

Réponses:

215

Pour (beaucoup) plus de puissance et de flexibilité, utilisez une bibliothèque de vérification orthographique dédiée comme PyEnchant. Il y a un tutoriel , ou vous pouvez simplement plonger directement:

>>> 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"]
>>>

PyEnchantest livré avec quelques dictionnaires (en_GB, en_US, de_DE, fr_FR), mais peut utiliser n'importe lequel des dictionnaires OpenOffice si vous voulez plus de langues.

Il semble y avoir une bibliothèque de pluralisation appelée inflect, mais je ne sais pas si c'est bon.

Katriel
la source
2
Merci, je ne connaissais pas PyEnchant et c'est en effet beaucoup plus utile pour le genre de vérifications que je souhaite faire.
Barthelemy
Il ne reconnaît pas <helo>? Pas un mot courant, mais je connais <helo> comme une abréviation pour <helicopter>, et je ne connais pas <Helot>. Je voulais juste souligner que la solution n'est pas universelle et qu'un projet différent peut nécessiter différents dictionnaires ou une approche totalement différente.
dmh le
15
Le package est fondamentalement impossible à installer pour moi. Super frustrant.
Monica Heddneck
9
Enchant n'est pas pris en charge pour le moment pour Python 64bit sur Windows :( github.com/rfk/pyenchant/issues/42
Ricky Boyce
9
pyenchant n'est plus maintenu. pyhunspell a une activité plus récente. Aussi /usr/share/dict/et /var/lib/dictpeut être référencé sur les configurations * nix.
pkfm
48

Cela ne fonctionnera pas bien avec WordNet, car WordNet ne contient pas tous les mots anglais. Une autre possibilité basée sur NLTK sans enchantement est le corpus de mots de 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
Sadik
la source
5
La même mention s'applique ici aussi: beaucoup plus rapide lors de la conversion en set:set(words.words())
Iulius Curt
attention car vous devez singulariser les mots pour obtenir des résultats
corrects
2
attention: des mots comme pâtes ou burger ne se trouvent pas dans cette liste
Paroksh Saxena
45

Utilisation de 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 rencontrez des difficultés pour installer wordnet ou si vous souhaitez essayer d'autres approches.

Susheel Javadi
la source
2
C'est particulièrement utile pour les utilisateurs de cygwin car l'installation d'enchant est assez problématique.
alehro
27
WordNet ne contient pas tous les mots en anglais, il n'en contient qu'un petit sous-ensemble.
justhalf
2
En plus de wordnet, il manque une tonne de mots communs tels que «voudrait» et «comment», c'est nettement plus lent que la solution de kindall.
Ryan Epp
3
de plus, wordnet.synsets ne vérifie pas simplement si un mot s'y trouve. Il tente d'abord de lemmiser. Donc, il convertit "saless" (pas un vrai mot anglais) en "ventes".
Lyndon White
c'est une méthode imparfaite pour ce faire, compte tenu du fonctionnement des synsets. mettre 'tiltes' pour voir ce que je dis
RetroCode
37

Utiliser un ensemble pour stocker la liste de mots car leur recherche 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 seraient déjà dans une bonne liste de mots, mais si vous vouliez spécifiquement les exclure de la liste pour une raison quelconque, vous pourriez en effet écrire une fonction pour le gérer. Mais les règles de pluralisation en anglais sont suffisamment délicates pour que je commence par inclure les pluriels dans la liste de mots.

Quant à savoir où trouver des listes de mots anglais, j'en ai trouvé plusieurs simplement en recherchant sur Google "liste de mots anglais". 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.

kindall
la source
9
Si vous faites english_wordsun setau lieu d'un list, is_english_wordcela fonctionnera beaucoup plus vite.
dan04
En fait, je viens de le refaire sous forme de dict, mais vous avez raison, un ensemble est encore mieux. Actualisé.
kindall
1
Vous pouvez également abandonner .xreadlines()et simplement répéter word_file.
FogleBird
3
Sous ubuntu, les packages wamericanet wbritishfournissent des listes de mots anglais américain et britannique sous forme de /usr/share/dict/*-english. L'information sur le package donne wordlist.sourceforge.net comme référence.
intuitu le
1
Je trouve un référentiel GitHub qui contient 479k mots anglais.
haolee
6

Pour une solution plus rapide basée sur NLTK, vous pouvez hacher 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
Eb Abadi
la source
2
Au lieu d'un dictionnaire, utilisez un ensemble
jhuang
4

Je trouve qu'il existe 3 solutions basées sur des packages pour résoudre le problème. Ce sont pyenchant, wordnet et corpus (auto-définis ou de ntlk). Pyenchant n'a pas pu s'installer facilement dans win64 avec py3 . Wordnet ne fonctionne pas très bien car son corpus n'est pas complet. Donc pour moi, je choisis la solution répondue par @Sadik , et j'utilise 'set (words.words ())' pour accélérer.

Première:

pip3 install nltk
python3

import nltk
nltk.download('words')

Ensuite:

from nltk.corpus import words
setofwords = set(words.words())

print("hello" in setofwords)
>>True
Jeune Yang
la source
3

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
Grizmin
la source
1
Cela retournera vrai si le texte contient plus de 3 mots et qu'il y a moins de 4 erreurs (mots non reconnus). En général, pour mon cas d'utilisation, ces paramètres fonctionnent plutôt bien.
grizmin
1

Pour une approche web sémantique, vous pouvez exécuter une requête sparql sur WordNet au format RDF . En gros, utilisez simplement le module urllib pour émettre une requête GET et renvoyer les résultats au format JSON, analyser à l'aide du module python 'json'. Si ce n'est pas un mot anglais, vous n'obtiendrez aucun résultat.

Comme autre idée, vous pouvez interroger l'API de Wiktionary .

Burkestar
la source
1

Pour tous les utilisateurs Linux / Unix

Si votre système d'exploitation utilise le noyau Linux, il existe un moyen simple d'obtenir tous les mots du dictionnaire anglais / américain. Dans le répertoire, /usr/share/dictvous avez un wordsfichier. Il y a aussi un plus spécifique american-englishetbritish-english fichier . Ceux-ci contiennent tous les mots de cette langue spécifique. Vous pouvez y accéder dans tous les langages de programmation, c'est pourquoi j'ai pensé que vous voudriez peut-être en savoir plus.

Désormais, pour les utilisateurs spécifiques à python, le code python ci-dessous doit attribuer aux mots de la liste la valeur de chaque mot:

import re
file = open("/usr/share/dict/words", "r")
words = re.sub("[^\w]", " ",  file.read()).split()

def is_word(word):
    return word.lower() in words

is_word("tarts") ## Returns true
is_word("jwiefjiojrfiorj") ## Returns False

J'espère que cela t'aides!!!

Linux4Life531
la source