184 votes

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 pense que l'interface wordnet de nltk 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 se trouve dans le dictionnaire (par exemple, propriétés -> propriété -> mot anglais). Comment pourrais-je réaliser cela ?

0 votes

Vous pouvez voir cette page : stackoverflow.com/questions/39142778/ Je recommande le langid

274voto

katrielalex Points 40655

Pour plus de puissance et de flexibilité, utilisez une bibliothèque de correction orthographique dédiée comme PyEnchant . Il y a un tutoriel ou vous pouvez vous plonger directement dedans :

>>> 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 vous pouvez utiliser n'importe lequel des dictionnaires suivants Ceux d'OpenOffice si vous voulez plus de langues.

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

2 votes

Merci, je ne connaissais pas PyEnchant et il est effectivement beaucoup plus utile pour le genre de contrôles que je veux faire.

0 votes

Il ne reconnaît pas <helo> ? Ce n'est pas un mot courant, mais je connais <helo> comme une abréviation pour <hélicoptère>, et je ne connais pas <Helot>. Je voulais juste souligner que la solution n'est pas unique et qu'un projet différent pourrait nécessiter des dictionnaires différents ou une approche totalement différente.

0 votes

Eh bien, si vous voulez un dictionnaire différent, vous pouvez toujours en brancher un à l'arrière de PyEnchant ! Notez BTW que même l'OED ne liste "helo" que comme obsolète...

71voto

Sadik Points 406

Il 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

10 votes

La même mention s'applique ici aussi : beaucoup plus rapide lorsqu'il est converti en un ensemble : set(words.words())

1 votes

Attention, vous devez singulariser les mots pour obtenir des résultats corrects.

3 votes

Attention : des mots comme "pasta" ou "burger" ne figurent pas dans cette liste.

52voto

Susheel Javadi Points 1084

Utilisation de NLTK :

from nltk.corpus import wordnet

if not wordnet.synsets(word_to_test):
  #Not an English Word
else:
  #English Word

Vous devez vous référer à cet article si vous avez des difficultés à installer wordnet ou si vous voulez essayer d'autres approches.

3 votes

C'est particulièrement utile pour les utilisateurs de cygwin car l'installation de l'enchantement est assez problématique.

31 votes

WordNet ne contient pas tous les mots de l'anglais, il n'en contient qu'un petit sous-ensemble.

2 votes

En plus du fait que wordnet manque une tonne de mots courants comme " would " et " how ", cette solution est nettement plus lente que celle de kindall.

42voto

kindall Points 60645

Utiliser un jeu pour stocker la liste de mots parce que les rechercher 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 effectivement écrire une fonction pour le faire. Mais les règles de pluralisation de l'anglais sont suffisamment compliquées 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 en tapant simplement sur Google "English word list". En voici une : http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Vous pouvez chercher sur Google l'anglais britannique ou américain si vous voulez spécifiquement l'un de ces dialectes.

9 votes

Si vous faites english_words a set au lieu d'un list alors is_english_word fonctionnera beaucoup plus vite.

0 votes

En fait, je viens de le refaire en dict mais tu as raison, un ensemble est encore mieux. Mis à jour.

1 votes

Vous pouvez aussi vous débarrasser .xreadlines() et juste itérer sur word_file .

1voto

burkestar Points 518

Pour une approche de web sémantique, vous pourriez exécuter un Requête sparql contre WordNet au format RDF . En gros, il suffit d'utiliser le module urllib pour lancer une requête GET et renvoyer les résultats au format JSON, à analyser avec le module python 'json'. Si ce n'est pas un mot anglais, vous n'obtiendrez aucun résultat.

Comme autre idée, vous pourriez interroger L'API du Wiktionnaire .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X