python - spanish - wordnet online
¿Cómo verificar si una palabra es una palabra en inglés con Python? (7)
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
Quiero verificar en un programa de Python si una palabra está en el diccionario de inglés.
Creo que la interfaz de nltk wordnet podría ser el camino a seguir, pero no tengo ni idea de cómo usarlo 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, me gustaría comprobar si la forma singular de una palabra está en el diccionario (por ejemplo, propiedades -> propiedad -> palabra en inglés). ¿Cómo lo lograría?
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 (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:
>>> 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 de OpenOffice si quiere más idiomas.
Parece que hay una biblioteca de pluralización llamada inflect
, pero no tengo idea si es buena.
Para un enfoque web semántico, puede ejecutar una consulta sparql contra WordNet en formato RDF . Básicamente solo use el módulo urllib para emitir la solicitud GET y devolver los resultados en formato JSON, parse usando el módulo python ''json''. Si no es una palabra en inglés, no obtendrá ningún resultado.
Como otra idea, puedes consultar la API de Wiktionary .
Para una solución más rápida basada en NLTK, puede hash el 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
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 quisieras excluirlos específicamente de la lista por alguna razón, podrías 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 simplemente buscando en Google "lista de palabras en inglés". Aquí hay uno: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Puede buscar inglés británico o estadounidense si quiere específicamente uno de esos dialectos.
Usando 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 quiere probar otros enfoques.