¿Cómo verificar si una palabra es una palabra inglesa con Python?

Quiero verificar en un progtwig de Python si hay una palabra en el diccionario de inglés.

Creo que la interfaz nltk wordnet podría ser el camino a seguir, pero no tengo ni idea de cómo usarla para una tarea tan simple.

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

En el futuro, es posible que desee comprobar si la forma singular de una palabra está en el diccionario (por ejemplo, propiedades -> propiedad -> palabra inglesa). ¿Cómo lograría eso?

Related of "¿Cómo verificar si una palabra es una palabra inglesa con Python?"

Para (mucho) más poder y flexibilidad, use una biblioteca dedicada de corrección ortográfica como PyEnchant . Hay un tutorial , o simplemente puedes bucear directamente en:

 >>> 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 viene con algunos diccionarios (en_GB, en_US, de_DE, fr_FR), pero puede usar cualquiera de los OpenOffice si quiere más idiomas.

Parece que hay una biblioteca de pluralización llamada inflect , pero no tengo idea de si es buena.

Utilizando NLTK :

 from nltk.corpus import wordnet if not wordnet.synsets(word_to_test): #Not an English Word else: #English Word 

Debe consultar este artículo si tiene problemas para instalar wordnet o si desea probar otros métodos.

Usar un conjunto para almacenar la lista de palabras porque buscarlas será más rápido:

 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 

Para responder a la segunda parte de la pregunta, los plurales ya estarían en una buena lista de palabras, pero si quisiera excluirlos específicamente de la lista por alguna razón, podría escribir una función para manejarla. Pero las reglas de pluralización en inglés son lo suficientemente complicadas como para incluir los plurales en la lista de palabras, para empezar.

En cuanto a dónde encontrar las listas de palabras en inglés, encontré varias solo en Google “lista de palabras en inglés”. Aquí hay uno: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt. Puede buscar Google para inglés británico o americano si desea específicamente uno de esos dialectos.

No funcionará bien con WordNet, porque WordNet no contiene todas las palabras en inglés. Otra posibilidad basada en NLTK sin encantar es el corpus de palabras 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 

Para una solución más rápida basada en NLTK, podría hacer un hash del conjunto de palabras para evitar una búsqueda lineal.

 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 

Para un enfoque de web semántica, puede ejecutar una consulta sparql contra WordNet en formato RDF . Básicamente, solo use el módulo urllib para emitir una solicitud GET y devolver los resultados en formato JSON, analice usando el módulo ‘json’ de python. Si no es la palabra inglesa no obtendrás resultados.

Como otra idea, puedes consultar la API de Wiktionary .

Con 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 

Encuentro que hay 3 soluciones basadas en paquetes para resolver el problema. Son pyenchant, wordnet y corpus (autodefinidos o de ntlk). Pyenchant no se pudo instalar fácilmente en win64 con py3 . Wordnet no funciona muy bien porque su corpus no está completo. Entonces, para mí, elijo la solución respondida por @Sadik y uso ‘set (words.words ())’ para acelerar.

Primero:

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

Entonces:

 from nltk.corpus import words if "hello" in set(words.words()) >>True