Як перевірити, чи є словом англійське слово з 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, але я не маю уявлення, чи корисна вона.


2
Дякую, я не знав про PyEnchant, і це дійсно набагато корисніше для того, який вид перевірок я хочу зробити.
Бартелемі

Він не розпізнає <helo>? Не звичайне слово, але я знаю <helo> як абревіатуру <helicopter>, і я не знаю <Helolot>. Просто хотілося зазначити, що рішення не є одним розміром, і для іншого проекту можуть знадобитися різні словники або зовсім інший підхід.
dmh

15
Пакет мені взагалі неможливо встановити. Супер засмучує.
Моніка Хеднек

9
Наразі Enchant не підтримується для python 64bit на windows :( github.com/rfk/pyenchant/isissue/42
Ricky Boyce

9
pyenchant більше не підтримується. pyhunspell має більш пізню активність. Також /usr/share/dict/і /var/lib/dictможуть посилатися на * NIX установок.
pkfm

48

Це не буде добре працювати з WordNet, оскільки WordNet не містить усіх англійських слів. Ще одна можливість, заснована на NLTK без чарів, - це слова корпусу NLTK

>>> 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())
Iulius Curt

слідкуйте за тим, як вам потрібно оформити слова, щоб отримати правильний результат
famargar

2
застереження: таких слів, як макарони або гамбургер, у цьому списку не знайдено
Paroksh Saxena

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

27
WordNet не містить кожного слова англійською мовою, він містить лише невелику його підмножину.
justhalf

2
На додаток до Wordnet не вистачає тонни загальних слів, як-от "би" і "як", це помітно повільніше, ніж рішення Goodall.
Райан Епп

3
Крім того, wordnet.synsets не просто перевіряє, чи є в ньому слово. Він намагається лемізувати перший. Таким чином, він перетворює "saless" (не справжнє англійське слово) на "sales".
Ліндон Уайт

це хибний метод зробити це, враховуючи, як працюють синсети. поставте "нахили", щоб побачити, що я говорю
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 "Список англійських слів". Ось один: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Ви можете скористатися Google для англійської чи американської англійської, якщо ви хочете спеціально один із цих діалектів.


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

1
Це повернеться істинним, якщо текст довший 3 слів і менше 4 помилок (нерозпізнані слова). Загалом для мого використання ці налаштування працюють досить добре.
grizmin

1

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

В якості іншої ідеї ви можете запитати API Вікісловника .


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

Сподіваюся, це допомагає !!!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.