web-dev-qa-db-fra.com

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

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

Je crois que l'interface nltk wordnet est peut-être la solution, mais je ne sais pas 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 souhaiterai peut-être vérifier si la forme singulière d'un mot figure dans le dictionnaire (par exemple, propriétés -> propriété -> mot anglais). Comment pourrais-je y parvenir?

117
Barthelemy

Pour (beaucoup) plus de puissance et de flexibilité, utilisez une bibliothèque dédiée à la vérification orthographique, telle que PyEnchant . Il y a un tutoriel , ou vous pouvez simplement 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 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 ou non.

188
Katriel

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.

40
Susheel Javadi

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
39
Sadik

Utiliser un jeu pour stocker la liste de mots car 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 figureraient déjà dans une bonne liste de mots, mais si vous vouliez les exclure spécifiquement de la liste pour une raison quelconque, vous pourriez bien écrire une fonction pour la 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 des mots.

Quant à savoir où trouver les listes de mots anglais, j’en ai trouvé plusieurs simplement en recherchant une liste de mots anglais. En voici un: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Vous pouvez utiliser Google pour l'anglais britannique ou américain si vous souhaitez spécifiquement utiliser l'un de ces dialectes.

36
kindall

Pour une solution plus rapide basée sur NLTK, vous pouvez déchiqueter le jeu 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
5
Eb Abadi

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
1
grizmin

Pour une approche Web sémantique, vous pouvez exécuter une requête interrogation sparql contre WordNet au format RDF .] analyser en utilisant python 'json' module. Si ce n'est pas Word anglais, vous n'obtiendrez aucun résultat.

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

1
burkestar