Как проверить, является ли слово английским словом с Python?
Я хочу проверить программу Python, если слово находится в английском словаре.
Я верю, что интерфейс nltk wordnet может быть способом, но я не знаю, как использовать его для такой простой задачи.
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
В будущем я могу проверить, есть ли в словаре единственная форма слова (например, свойства → свойство → английское слово). Как я могу это достичь?
Ответы
Ответ 1
Для (гораздо) большей мощности и гибкости используйте специальную библиотеку проверки орфографии, такую как 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
, но я не знаю, хорошо ли это.
Ответ 2
Использование NLTK:
from nltk.corpus import wordnet
if not wordnet.synsets(word_to_test):
#Not an English Word
else:
#English Word
Вы должны обратиться к этой статье, если у вас возникли проблемы с установкой wordnet или вы хотите попробовать другие подходы.
Ответ 3
Это не сработает с WordNet, потому что WordNet не содержит всех английских слов.
Другая возможность, основанная на NLTK без зачарования, - это слова 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
Ответ 4
Использование набора для хранения списка слов, потому что поиск их будет быстрее:
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
Чтобы ответить на вторую часть вопроса, множественные числа уже были бы в хорошем списке слов, но если вы хотели бы специально исключить из списка по какой-либо причине, вы действительно можете написать функцию для ее обработки. Но английские правила плюрализации достаточно сложны, и я просто включил множественные числа в список слов, чтобы начать с.
Что касается того, где найти английские списки слов, я нашел несколько просто по Google "Английский список слов". Вот один из них: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Вы можете использовать Google для английского или американского английского, если вы хотите, чтобы именно один из этих диалектов.
Ответ 5
Для более быстрого решения на основе 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
Ответ 6
Для семантического веб-подхода вы можете запустить sparql-запрос к WordNet в формате RDF. В основном просто используйте модуль urllib для выдачи запроса GET и возврата результатов в формате JSON, используя синтаксис с использованием модуля python 'json'. Если это не английское слово, вы не получите никаких результатов.
В качестве другой идеи вы можете запросить Викисловарь API.
Ответ 7
С 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
Ответ 8
Я считаю, что есть 3 пакетных решения для решения проблемы. Это пиенчант, wordnet и корпус (самоопределяемые или из ntlk). Pyenchant не может быть легко установлен в win64 с py3. Wordnet не работает очень хорошо, потому что это корпус не завершен. Поэтому для меня я выбираю решение, на которое ответил @Sadik, и использую set (words.words()) для ускорения.
Во-первых:
pip3 install nltk
python3
import nltk
nltk.download('words')
Тогда:
from nltk.corpus import words
setofwords = set(words.words())
print("hello" in set(words.words()))
>>True