Как проверить, является ли слово английским словом с Python?
Я хочу проверить в программе Python, если слово находится в словаре английского языка.
Я считаю, что интерфейс nltk wordnet может быть способом пойти, но я понятия не имею, как использовать его для такой простой задачи.
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
в будущем я, возможно, захочу проверить, находится ли сингулярная форма слова в словаре (например, properties -> property -> english word). Как бы я этого добился?
7 ответов:
для (гораздо) большей мощности и гибкости используйте специальную библиотеку проверки орфографии, такую как
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 ones если вы хотите больше языков.там, кажется, есть библиотека плюрализации под названием
inflect
, но я понятия не имею, есть ли это хороший.
С помощью NLTK:
from nltk.corpus import wordnet if not wordnet.synsets(word_to_test): #Not an English Word else: #English Word
вы должны обратиться к в этой статье если у вас возникли проблемы с установкой wordnet или вы хотите попробовать другие подходы.
использование набора для хранения списка слов, потому что поиск их будет быстрее:
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 для британского или американского английского языка, если вы хотите конкретно один из этих диалектов.
Это не будет хорошо работать с 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
для более быстрого решения на основе 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
для семантического веб-подхода вы можете запустить запрос sparql против WordNet в формате RDF. В основном просто используйте модуль urllib для выдачи запроса GET и возврата результатов в формате JSON, разбирайте с помощью модуля python 'json'. Если это не английское слово, вы не получите никаких результатов.
Как еще одна идея, вы можете запросить API Викисловаря.
С pyEnchant.проверка орфографии:
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