Pregunta

Quiero comprobar en un programa de Python si una palabra está en el diccionario Inglés.

Creo NLTK wordnet interfaz podría ser el camino a seguir, pero no tengo idea de cómo usarlo para una tarea tan sencilla.

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

is_english_word(token.lower())

En el futuro, puede ser que desee comprobar si la forma singular de la palabra está en el diccionario (por ejemplo, propiedades -> propiedades -> palabra Inglés). ¿Cómo iba a lograr eso?

¿Fue útil?

Solución

Para (mucho) más potencia y flexibilidad, utilizar una biblioteca dedicada como la corrección ortográfica PyEnchant . Hay una tutorial , o podría simplemente recta de buceo 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 un par de diccionarios (EN_GB, en_US, de_DE, fr_FR), pero se puede utilizar cualquiera de los OpenOffice los si quieres más idiomas.

No parece ser una biblioteca pluralización llamada inflect , pero no tengo idea de si se trata de ningún bien.

Otros consejos

Uso NLTK :

from nltk.corpus import wordnet

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

Se debe hacer referencia a este artículo si tiene problemas para wordnet instalación o si quieres probar otros enfoques.

No va a funcionar bien con WordNet, porque WordNet no contiene todas las palabras en inglés. Otra posibilidad en base a NLTK sin encantamiento son las palabras 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

El uso de un conjunto para almacenar la lista de palabras porque mirando hacia arriba 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ía en una buena lista de palabras, pero si quería excluir específicamente los de la lista, por alguna razón, que de hecho podría escribir una función para manejar la situación. Pero las reglas de pluralización inglés son lo suficientemente complicado que acababa de incluir los plurales en la lista de palabras para empezar.

En cuanto a dónde encontrar listas de palabras en inglés, he encontrado varios simplemente por "lista de palabras Inglés" googlear. He aquí uno: http://www.sil.org/linguistics/wordlists /english/wordlist/wordsEn.txt podría Google para británico o americano inglés si desea específicamente uno de esos dialectos.

Para una solución más rápida basada en NLTK que podría desmenuzar 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

Para un enfoque web semántica, que podría ejecutar una SPARQL consulta en WordNet en formato RDF . Básicamente sólo tiene que utilizar urllib módulo para pedir y obtener resultados de retorno tema en formato JSON, análisis sintáctico utilizando Python 'json' módulo. Si no es la palabra Inglés obtendrá ningún resultado.

Como otra idea, que podría consultar API de Wikcionario .

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

Me parece que hay 3 soluciones basadas en paquetes para resolver el problema. Son pyenchant, wordnet y corpus (autodefinida o desde ntlk). Pyenchant no podía fácilmente instalado en Win64 con el AP3 . Wordnet no funciona muy bien, ya que de corpus no es completa. Así que para mí, elijo la solución respondida por @Sadik , y el uso 'de fijación (words.words ())' para acelerar.

En primer lugar:

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

A continuación:

from nltk.corpus import words
if "hello" in set(words.words())
>>True
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top