Wie kann ich mit Python überprüfen, ob ein Wort ein englisches Wort ist?


134

Ich möchte in einem Python-Programm einchecken, ob ein Wort im englischen Wörterbuch enthalten ist.

Ich glaube, dass die nltk wordnet-Schnittstelle der richtige Weg ist, aber ich habe keine Ahnung, wie ich sie für eine so einfache Aufgabe verwenden soll.

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

is_english_word(token.lower())

In Zukunft möchte ich vielleicht überprüfen, ob die Singularform eines Wortes im Wörterbuch enthalten ist (z. B. Eigenschaften -> Eigenschaft -> englisches Wort). Wie würde ich das erreichen?

Antworten:


215

Verwenden Sie für (viel) mehr Leistung und Flexibilität eine spezielle Rechtschreibprüfungsbibliothek wie PyEnchant. Es gibt ein Tutorial , oder Sie können einfach direkt eintauchen:

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

PyEnchantwird mit einigen Wörterbüchern geliefert (en_GB, en_US, de_DE, fr_FR), kann aber jedes der OpenOffice- Wörterbücher verwenden wenn Sie mehr Sprachen möchten.

Es scheint eine Pluralisierungsbibliothek namens zu geben inflect, aber ich habe keine Ahnung, ob es etwas Gutes ist.


2
Vielen Dank, ich wusste nichts über PyEnchant und es ist in der Tat viel nützlicher für die Art von Überprüfungen, die ich durchführen möchte.
Barthelemy

Es erkennt <helo> nicht? Kein gewöhnliches Wort, aber ich kenne <helo> als Abkürzung für <helicopter> und <Helot> nicht. Ich wollte nur darauf hinweisen, dass die Lösung nicht für alle geeignet ist und dass für ein anderes Projekt möglicherweise andere Wörterbücher oder ein anderer Ansatz erforderlich sind.
dmh

15
Das Paket ist für mich grundsätzlich nicht zu installieren. Super frustrierend.
Monica Heddneck

9
Enchant wird derzeit nicht für Python 64bit unter Windows unterstützt :( github.com/rfk/pyenchant/issues/42
Ricky Boyce

9
Pyenchant wird nicht mehr aufrechterhalten. Pyhunspell hat neuere Aktivitäten. Auch /usr/share/dict/und /var/lib/dictkann auf * nix-Setups verwiesen werden.
pkfm

48

Es funktioniert nicht gut mit WordNet, da WordNet nicht alle englischen Wörter enthält. Eine andere Möglichkeit, die auf NLTK ohne Verzauberung basiert, ist NLTKs Wortkorpus

>>> 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
Die gleiche Erwähnung gilt auch hier: viel schneller, wenn es in ein Set umgewandelt wird:set(words.words())
Iulius Curt


2
Vorsicht: Wörter wie Pasta oder Burger werden in dieser Liste nicht gefunden
Paroksh Saxena

45

Verwenden von NLTK :

from nltk.corpus import wordnet

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

Sie sollten sich auf diesen Artikel beziehen, wenn Sie Probleme bei der Installation von Wordnet haben oder andere Ansätze ausprobieren möchten.


2
Dies ist besonders nützlich für Cygwin-Benutzer, da die Installation von Enchant sehr problematisch ist.
Alehro

27
WordNet enthält nicht jedes Wort auf Englisch, sondern nur eine kleine Teilmenge davon.
halb

2
Zusätzlich zum Wordnet fehlen eine Menge gebräuchlicher Wörter wie "würde" und "wie". Dies ist merklich langsamer als die Lösung von kindall.
Ryan Epp

3
Außerdem überprüft wordnet.synsets nicht einfach, ob ein Wort darin enthalten ist. Es versucht zuerst zu lemmaisieren. Es wandelt also "saless" (kein echtes englisches Wort) in "sales" um.
Lyndon White

Dies ist eine fehlerhafte Methode, wenn man bedenkt, wie Synsets funktionieren. Setzen Sie 'Tiltes', um zu sehen, was ich sage
RetroCode

37

Verwenden eines Sets zum Speichern der Wortliste, da das Nachschlagen schneller ist:

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

Um den zweiten Teil der Frage zu beantworten, wären die Pluralformen bereits in einer guten Wortliste enthalten, aber wenn Sie diese aus irgendeinem Grund ausdrücklich von der Liste ausschließen möchten, könnten Sie tatsächlich eine Funktion schreiben, um damit umzugehen. Aber englische Pluralisierungsregeln sind so schwierig, dass ich zunächst nur die Pluralformen in die Wortliste aufnehmen würde.

Wo man englische Wortlisten findet, habe ich einige gefunden, indem ich einfach "englische Wortliste" gegoogelt habe. Hier ist eine: http://www.sil.org/linguistics/wordlists/english/wordlist/wordsEn.txt Sie können für britisches oder amerikanisches Englisch googeln, wenn Sie speziell einen dieser Dialekte möchten.


9
Wenn Sie english_wordsein setstatt eines machen list, is_english_wordläuft es viel schneller.
Dan04

Ich habe es eigentlich nur als Diktat überarbeitet, aber du hast Recht, ein Set ist noch besser. Aktualisiert.
Kindall

1
Sie können auch graben .xreadlines()und einfach wiederholen word_file.
FogleBird

3
Unter Ubuntu die Pakete wamericanund wbritishbieten amerikanische und britische englische Wortlisten als /usr/share/dict/*-english. Die Paketinformationen geben wordlist.sourceforge.net als Referenz an.
Intuition

1
Ich finde ein GitHub-Repository, das 479.000 englische Wörter enthält.
Haolee

6

Für eine schnellere NLTK-basierte Lösung können Sie die Wortmenge hashen, um eine lineare Suche zu vermeiden.

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
Verwenden Sie anstelle eines Wörterbuchs ein Set
jhuang

4

Ich finde, dass es 3 paketbasierte Lösungen gibt, um das Problem zu lösen. Sie sind Pyenchant, Wordnet und Corpus (selbst definiert oder von ntlk). Pyenchant konnte mit py3 nicht einfach in win64 installiert werden . Wordnet funktioniert nicht sehr gut, weil sein Korpus nicht vollständig ist. Also wähle ich für mich die von @Sadik beantwortete Lösung und benutze 'set (words.words ())', um zu beschleunigen.

Zuerst:

pip3 install nltk
python3

import nltk
nltk.download('words')

Dann:

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

print("hello" in setofwords)
>>True

3

Mit 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
Dies gibt true zurück, wenn der Text länger als 3 Wörter ist und weniger als 4 Fehler vorliegen (nicht erkannte Wörter). Im Allgemeinen funktionieren diese Einstellungen für meinen Anwendungsfall ziemlich gut.
Grizmin


1

Für alle Linux / Unix-Benutzer

Wenn Ihr Betriebssystem den Linux-Kernel verwendet, gibt es eine einfache Möglichkeit, alle Wörter aus dem Englisch / Amerikanischen Wörterbuch abzurufen. In dem Verzeichnis haben /usr/share/dictSie eine wordsDatei. Es gibt auch eine spezifischere american-englishund british-englishDateien. Diese enthalten alle Wörter in dieser bestimmten Sprache. Sie können in jeder Programmiersprache darauf zugreifen, weshalb ich dachte, Sie möchten vielleicht etwas darüber wissen.

Für Python-spezifische Benutzer sollte der folgende Python-Code die Listenwörter so zuweisen, dass sie den Wert jedes einzelnen Wortes haben:

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

Hoffe das hilft!!!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.