Как проверить, является ли слово английским словом с Python?
Я хочу проверить в программе Python, есть ли слово в словаре английского языка.
Я полагаю, что nltk интерфейс Wordnet мог бы быть способом пойти, но я понятия не имею, как использовать его для такой простой задачи.
def is_english_word(word):
pass # how to I implement is_english_word?
is_english_word(token.lower())
В будущем я могу захотеть проверить, присутствует ли в словаре единственная форма слова (например, свойства -> свойство -> английское слово). Как бы я этого достиг?
13 ответов
Для (гораздо) большей мощности и гибкости используйте специальную библиотеку для проверки орфографии, такую как 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
, но я понятия не имею, хорошо ли это.
Это не будет хорошо работать с 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
Используя 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 для британского или американского английского, если вам нужен именно один из этих диалектов.
Для всех пользователей Linux/Unix
Если ваша ОС использует ядро Linux, есть простой способ получить все слова из англо-американского словаря. В каталоге/usr/share/dict
у тебя есть words
файл. Есть также более конкретныйamerican-english
а также british-english
файлы. Они содержат все слова на этом конкретном языке. Вы можете получить доступ к этому на любом языке программирования, поэтому я подумал, что вы, возможно, захотите узнать об этом.
Теперь, для конкретных пользователей python, приведенный ниже код python должен назначать слова списка, чтобы иметь значение каждого отдельного слова:
import re
file = open("/usr/share/dict/words", "r")
words = re.sub("[^\w]", " ", file.read()).split()
def is_word(word):
return word.lower() in words
is_word("tarts") ## Returns true
is_word("jwiefjiojrfiorj") ## Returns False
Надеюсь это поможет!!!
Для более быстрого решения на основе 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
Я считаю, что есть 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
С 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
Для семантического веб-подхода вы можете выполнить запрос sparql к WordNet в формате RDF. В основном, просто используйте модуль urllib для выдачи запроса GET и возврата результатов в формате JSON, анализируйте с помощью модуля Python 'json'. Если это не английское слово, вы не получите результатов.
Как еще одна идея, вы можете запросить API Викисловаря.
Ни одна из вышеперечисленных библиотек не содержит всех английских слов, поэтому я импортировал CSV-файл, содержащий все английские слова, по ссылке:->https://github.com/dwyl/english-words
И просто превратил это вpandas dataframe
и сравнил их
Загрузите этот текстовый файл https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt.
затем создайте
Set
из него, используя следующий фрагмент кода Python, который загружает около 370 тыс. не буквенно-цифровых слов на английском языке
>>> with open("/PATH/TO/words_alpha.txt") as f:
>>> words = set(f.read().split('\n'))
>>> len(words)
370106
С этого момента вы можете проверить существование в постоянное время, используя
>>> word_to_check = 'baboon'
>>> word_to_check in words
True
Обратите внимание, что этот набор может быть неполным, но все же выполняет свою работу, пользователь должен выполнить проверку качества, чтобы убедиться, что он работает и для его варианта использования.
используйте nltk.corpus вместо enchant. Энчант дает неоднозначные результаты. Например: для эталона и эталона enchant возвращает true. Предполагается, что для теста будет возвращено false.