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?

Barthelemy
quelle

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.

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

Susheel Javadi
quelle
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.

irgendwie
quelle
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
Eb Abadi
quelle
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
Junges Yang
quelle
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
grizmin
quelle
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 einen Semantic-Web-Ansatz können Sie eine Sparql-Abfrage für WordNet im RDF-Format ausführen . Verwenden Sie einfach das Modul urllib, um eine GET-Anforderung auszugeben und Ergebnisse im JSON-Format zurückzugeben. Analysieren Sie sie mit dem Python-Modul 'json'. Wenn es kein englisches Wort ist, erhalten Sie keine Ergebnisse.

Als weitere Idee könnten Sie die API von Wiktionary abfragen .

Burkestar
quelle
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!!!

Linux4Life531
quelle