Как проверить, является ли слово английским словом с помощью Python?

134

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

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

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

is_english_word(token.lower())

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

Бартелеми
источник

Ответы:

215

Для (гораздо) большей мощности и гибкости используйте специальную библиотеку для проверки орфографии, например 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, но я не знаю, хорошо ли это.

Katriel
источник
2
Спасибо, я не знал о PyEnchant, и он действительно намного полезнее для тех проверок, которые я хочу сделать.
Бартелеми
Он не узнает <helo>? Не распространенное слово, но я знаю <helo> как сокращение от <helicopter>, и я не знаю <Helot>. Просто хотел отметить, что решение не является универсальным и что для другого проекта могут потребоваться разные словари или другой подход.
dmh
15
Установить пакет у меня в принципе невозможно. Очень неприятно.
Моника Хедднек
9
Чары не поддерживаются в настоящее время для питона 64bit на окнах :( github.com/rfk/pyenchant/issues/42
Рикки Boyce
9
pyenchant больше не поддерживается. pyhunspell имеет более позднюю активность. Также /usr/share/dict/и /var/lib/dictможно ссылаться на настройки * nix.
pkfm
48

Это не будет работать с 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
Садик
источник
5
То же самое относится и к этому: намного быстрее при преобразовании в набор:set(words.words())
Юлиус Курт
будьте осторожны,
2
осторожно: такие слова, как паста или бургер, не встречаются в этом списке
Парокш Саксена
45

Используя NLTK :

from nltk.corpus import wordnet

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

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

Сушил Джавади
источник
2
Это особенно полезно для пользователей cygwin, потому что установка энчанта довольно проблематична.
Alehro 12.12.12
27
WordNet не содержит всех слов на английском языке, он содержит лишь небольшую их часть.
Половина
2
Помимо wordnet, в котором отсутствует масса общих слов, таких как «будет» и «как», это заметно медленнее, чем решение kindall.
Райан Эпп
3
более того, wordnet.synsets не просто проверяет, есть ли в нем слово. Сначала он пытается лемматизировать. Таким образом, он преобразует «saless» (не настоящее английское слово) в «продажи».
Линдон Уайт
это ошибочный метод, учитывая, как работают синсеты. поставьте 'tiltes', чтобы увидеть, что я говорю
RetroCode
37

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

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

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

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

Kindall
источник
9
Если вы вместо , то будет работать намного быстрее. english_wordssetlistis_english_word
dan04
На самом деле я просто переделал это как диктант, но вы правы, набор даже лучше. Обновлено.
kindall
1
Вы также можете отказаться от этого .xreadlines()и просто повторить word_file.
FogleBird,
3
В Ubuntu пакеты wamericanи wbritishобеспечивают американские и британские английские списки слов , как /usr/share/dict/*-english. Информация о пакете дает ссылку на wordlist.sourceforge.net .
интуитивно понятно
1
Я нахожу репозиторий GitHub, который содержит 479 тысяч английских слов.
haolee
6

Для более быстрого решения на основе 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
Эб Абади
источник
2
Вместо словаря используйте набор
jhuang
4

Я считаю, что есть 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 setofwords)
>>True
Молодой Ян
источник
3

С помощью 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
grizmin
источник
1
Это вернет true, если текст длиннее 3 слов и менее 4 ошибок (нераспознанные слова). В общем, для моего случая использования эти настройки работают очень хорошо.
grizmin
1

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

Еще одна идея - запросить API Викисловаря .

burkestar
источник
1

Для всех пользователей 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

Надеюсь это поможет!!!

Linux4Life531
источник