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