Jak sprawdzić, czy słowo jest słowem angielskim w Pythonie?


134

Chcę sprawdzić w programie w języku Python, czy słowo jest w słowniku języka angielskiego.

Wydaje mi się, że najlepszym rozwiązaniem może być interfejs nltk wordnet, ale nie mam pojęcia, jak go używać do tak prostego zadania.

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

is_english_word(token.lower())

W przyszłości mógłbym chcieć sprawdzić, czy w słowniku znajduje się forma liczby pojedynczej słowa (np. Właściwości -> właściwość -> angielskie słowo). Jak miałbym to osiągnąć?

Odpowiedzi:


215

Aby uzyskać (znacznie) większą moc i elastyczność, użyj dedykowanej biblioteki do sprawdzania pisowni, takiej jak PyEnchant. Jest samouczek lub możesz po prostu zanurkować od razu:

>>> 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"]
>>>

PyEnchantzawiera kilka słowników (en_GB, en_US, de_DE, fr_FR), ale możesz użyć dowolnego z OpenOffice, jeśli chcesz mieć więcej języków.

Wygląda na to, że istnieje biblioteka pluralizacyjna inflect, ale nie mam pojęcia, czy jest dobra.


2
Dziękuję, nie wiedziałem o PyEnchant i rzeczywiście jest o wiele bardziej przydatny do tego rodzaju kontroli, które chcę przeprowadzać.
Barthelemy,

Nie rozpoznaje <helo>? Niezbyt popularne słowo, ale znam <helo> jako skrót od <helicopter> i nie znam <Helot>. Chciałem tylko zwrócić uwagę, że rozwiązanie nie jest uniwersalne i że inny projekt może wymagać innych słowników lub zupełnie innego podejścia.
dmh

15
Pakiet jest w zasadzie niemożliwy do zainstalowania dla mnie. Super frustrujące.
Monica Heddneck

9
Enchant nie jest obecnie obsługiwany dla Pythona 64- bitowego w systemie
Ricky Boyce,

9
pyenchant nie jest już utrzymywany. Pyhunspell ma nowszą aktywność. Również /usr/share/dict/i /var/lib/dictmoże być przywoływany w konfiguracjach * nix.
pkfm

48

Nie będzie działać dobrze z WordNet, ponieważ WordNet nie zawiera wszystkich angielskich słów. Inną możliwością opartą na NLTK bez zaklęcia jest korpus słów 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
Ta sama wzmianka dotyczy również tutaj: o wiele szybciej po konwersji do zestawu:set(words.words())
Iulius Curt

uważaj, ponieważ musisz wyróżniać słowa, aby uzyskać właściwe wyniki
famargar

2
UWAGA: słowa takie jak makaron lub hamburgera nie znajdują się na tej liście
Paroksh Saxena

45

Korzystanie z NLTK :

from nltk.corpus import wordnet

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

Powinieneś zapoznać się z tym artykułem, jeśli masz problemy z instalacją wordnet lub chcesz wypróbować inne metody.


2
Jest to szczególnie przydatne dla użytkowników cygwin, ponieważ instalacja zaklęcia jest dość problematyczna.
alehro

27
WordNet nie zawiera wszystkich słów w języku angielskim, zawiera tylko niewielki ich podzbiór.
justhalf

2
Oprócz tego, że w wordnet brakuje wielu popularnych słów, takich jak „chciałbym” i „jak”, jest to zauważalnie wolniejsze niż rozwiązanie Kindall.
Ryan Epp

3
ponadto wordnet.synsets nie sprawdza po prostu, czy jest w nim słowo. Najpierw próbuje lematyzować. Dlatego konwertuje „saless” (nie prawdziwe angielskie słowo) na „sprzedaż”.
Lyndon White,

to jest wadliwa metoda zrobienia tego, biorąc pod uwagę, jak działają synchronizacje. wstaw „tiltes”, aby zobaczyć, o czym mówię
RetroCode

37

Używanie zestawu do przechowywania listy słów, ponieważ wyszukiwanie ich będzie szybsze:

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

Odpowiadając na drugą część pytania, liczba mnoga byłaby już na dobrej liście słów, ale jeśli z jakiegoś powodu chcesz konkretnie wykluczyć je z listy, możesz rzeczywiście napisać funkcję, która je obsłuży. Ale angielskie zasady dotyczące liczby mnogiej są na tyle trudne, że na początek umieściłbym liczbę mnogą na liście słów.

Jeśli chodzi o listę angielskich słów, znalazłem kilka po prostu wpisując w Google „listę angielskich słów”. Oto jeden z nich: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Możesz użyć Google dla brytyjskiego lub amerykańskiego angielskiego, jeśli chcesz konkretnie jeden z tych dialektów.


9
Jeśli zrobisz english_wordsa setzamiast a list, is_english_wordbędzie działać znacznie szybciej.
dan04,

Właściwie przerobiłem to jako dyktando, ale masz rację, zestaw jest jeszcze lepszy. Zaktualizowano.
kindall

1
Możesz także porzucić .xreadlines()i po prostu iterować word_file.
FogleBird

3
W ramach ubuntu pakiety wamericani wbritishlisty słów w amerykańskim i brytyjskim języku angielskim jako /usr/share/dict/*-english. Informacje o pakiecie zawierają słowolist.sourceforge.net jako odniesienie.
intuicyjny

1
Znajduję repozytorium GitHub zawierające 479 tys. Angielskich słów.
haolee

6

Aby uzyskać szybsze rozwiązanie oparte na NLTK, możesz zaszyfrować zestaw słów, aby uniknąć wyszukiwania liniowego.

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
Zamiast słownika użyj zestawu
jhuang

4

Uważam, że istnieją 3 rozwiązania pakietowe umożliwiające rozwiązanie problemu. Są to pyenchant, wordnet i corpus (zdefiniowane samodzielnie lub z NTLK). Pyenchant nie mógł łatwo zainstalować w win64 z py3 . Wordnet nie działa zbyt dobrze, ponieważ jego korpus nie jest kompletny. Więc dla mnie wybieram rozwiązanie, na które odpowiada @Sadik i używam 'set (words.words ())', aby przyspieszyć.

Pierwszy:

pip3 install nltk
python3

import nltk
nltk.download('words')

Następnie:

from nltk.corpus import words
setofwords = set(words.words())

print("hello" in setofwords)
>>True

3

Dzięki 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
Zwróci to prawdę, jeśli tekst jest dłuższy niż 3 słowa i jest mniej niż 4 błędy (nierozpoznane słowa). Ogólnie w moim przypadku te ustawienia działają całkiem nieźle.
grizmin


1

Dla wszystkich użytkowników Linux / Unix

Jeśli Twój system operacyjny korzysta z jądra Linuksa, istnieje prosty sposób na pobranie wszystkich słów ze słownika angielsko / amerykańskiego. W katalogu /usr/share/dictmasz wordsplik. Jest też bardziej szczegółowy american-englishi british-englishpliki. Zawierają wszystkie słowa w tym konkretnym języku. Możesz uzyskać dostęp do tego w każdym języku programowania, dlatego pomyślałem, że możesz chcieć o tym wiedzieć.

Teraz, dla konkretnych użytkowników Pythona, poniższy kod Pythona powinien przypisać słowom listy wartość każdego słowa:

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

Mam nadzieję że to pomoże!!!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.