Как проверить, является ли слово английским словом с Python? - PullRequest
116 голосов
/ 24 сентября 2010

Я хочу проверить в программе Python, есть ли слово в словаре английского языка.

Я полагаю, что интерфейс nltk wordnet может быть хорошим способом, но я понятия не имею, как использовать его для такой простой задачи.

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

is_english_word(token.lower())

В будущем я мог бы захотеть проверить, присутствует ли в словаре единственная форма слова (например, свойства -> свойство -> английское слово). Как бы я этого достиг?

Ответы [ 8 ]

184 голосов
/ 24 сентября 2010

Для (гораздо) большей мощности и гибкости используйте специальную библиотеку для проверки орфографии, например PyEnchant. Есть учебник , или вы можете просто погрузиться прямо в:

>>> 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 поставляется с несколькими словарями (en_GB, en_US, de_DE, fr_FR), но может использовать любой из OpenOffice , если вам нужно больше языков.

Похоже, что существует библиотека для плюрализации, называемая inflect, но я понятия не имею, хорошо ли это.

40 голосов
/ 18 марта 2011

Использование NLTK :

from nltk.corpus import wordnet

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

Вам следует обратиться к этой статье , если у вас возникают проблемы с установкой wordnet или вы хотите попробовать другие подходы.

36 голосов
/ 28 января 2014

Это не будет хорошо работать с WordNet, потому что WordNet не содержит все английские слова. Еще одна возможность, основанная на НЛТК без чар, - это слова НЛТК корпус

>>> 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
36 голосов
/ 24 сентября 2010

Использование набора для хранения списка слов, потому что поиск их будет быстрее:

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

Чтобы ответить на вторую часть вопроса, множественные числа уже были бы в хорошем списке слов, но если бы вы захотели специально исключить их из списка по какой-то причине, вы могли бы действительно написать функцию для обработки этого. Но английские правила плюрализации достаточно хитры, поэтому я бы просто включил множественное число в список слов для начала.

Что касается того, где можно найти списки английских слов, я нашел несколько, просто прибегнув к помощи "Английского списка слов". Вот один из них: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Вы можете использовать Google для британского или американского английского, если вам нужен именно один из этих диалектов.

5 голосов
/ 27 июня 2016

Для более быстрого решения на основе NLTK вы можете хэшировать набор слов, чтобы избежать линейного поиска.

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
1 голос
/ 04 мая 2017

С 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 голос
/ 24 сентября 2010

Для семантического веб-подхода вы можете выполнить запрос sparql для WordNet в формате RDF .В основном просто используйте модуль urllib для выдачи запроса GET и возврата результатов в формате JSON, анализируйте с помощью модуля Python 'json'.Если это не английское слово, вы не получите результатов.

В качестве другой идеи вы можете запросить API Викисловаря .

0 голосов
/ 03 февраля 2019

Я считаю, что есть 3 пакетных решения для решения проблемы. Это пиенчант, wordnet и корпус (самоопределяемые или из ntlk). Pyenchant не может быть легко установлен в win64 с py3 . Wordnet работает не очень хорошо, потому что его корпус не завершен. Поэтому для меня я выбираю решение, на которое ответил @ Sadik , и использую 'set (words.words ())' для ускорения.

Первый:

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

Тогда:

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