Question

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

Je crois que l'interface NLTK WordNet pourrait être le chemin à parcourir, mais je n'ai pas la moindre idée comment l'utiliser pour une tâche simple.

def is_english_word(word):
    pass # how to I implement is_english_word?

is_english_word(token.lower())

Dans l'avenir, je pourrais vouloir vérifier si la forme singulière d'un mot est dans le dictionnaire (par exemple, les propriétés -> propriété -> mot anglais). Comment puis-je obtenir cela?

Était-ce utile?

La solution

Pour (beaucoup) plus de puissance et de flexibilité, utiliser une bibliothèque spellchecking dédié comme PyEnchant . Il y a un tutoriel , ou vous pouvez tout droit plonger 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 l'une des inflect , mais je n'ai aucune idée que ce soit tout bon.

Autres conseils

Utilisation NLTK :

from nltk.corpus import wordnet

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

Vous devriez consulter cet article si vous avez WordNet d'installation du mal ou si vous voulez essayer d'autres approches.

Il ne fonctionne pas bien avec WordNet, parce que WordNet ne contient pas tous les mots anglais. Une autre possibilité basée sur NLTK sans enchanter est les paroles 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

L'utilisation d'un ensemble pour stocker la liste de mots, car les regardant 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 serait déjà une bonne liste de mots, mais si vous voulez exclure spécifiquement ceux de la liste pour une raison quelconque, vous pouvez en effet écrire une fonction pour gérer. Mais l'anglais règles sont assez délicates pluriel des noms que je venais de les inclure dans la liste pluriels des mots pour commencer.

Quant à savoir où trouver des listes de mots anglais, je l'ai trouvé plusieurs simplement par googler « mot anglais liste ». Voici un: http://www.sil.org/linguistics/wordlists /english/wordlist/wordsEn.txt vous pouvez Google pour anglais britannique ou américain, si vous voulez plus précisément l'un de ces dialectes.

Pour une solution plus rapide à base NLTK vous pouvez hachage l'ensemble des 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 exécuter un sparql requête contre WordNet au format RDF . Fondamentalement, il suffit d'utiliser urllib module pour demander la délivrance GET et les résultats de retour au format JSON, analyse syntaxique en utilisant python « json » module. Si ce n'est pas mot anglais que vous aurez aucun résultat.

Comme une autre idée, vous pouvez interroger API Wiktionnaire .

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

Je trouve qu'il ya 3 solutions par package pour résoudre le problème. Ils sont pyenchant, wordnet et corpus (auto-défini ou de ntlk). Pyenchant ne pouvait pas installé facilement dans win64 avec PY3 . Wordnet ne fonctionne pas très bien parce que corpus de n'est pas complet. Donc, pour moi, Je choisis la solution répond par @Sadik , et l'utilisation 'set (words.words ())' pour accélérer.

Tout d'abord:

pip install -U nltk
python
import nltk
nltk.download(words)

Alors:

from nltk.corpus import words
if "hello" in set(words.words())
>>True
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top