Extrahieren einer Reihe von Wörtern mit dem Python / NLTK, vergleicht es dann zu einem Standard-Englisch-Wörterbuch
Frage
ich habe:
from __future__ import division
import nltk, re, pprint
f = open('/home/a/Desktop/Projects/FinnegansWake/JamesJoyce-FinnegansWake.txt')
raw = f.read()
tokens = nltk.wordpunct_tokenize(raw)
text = nltk.Text(tokens)
words = [w.lower() for w in text]
f2 = open('/home/a/Desktop/Projects/FinnegansWake/catted-several-long-Russian-novels-and-the-NYT.txt')
englishraw = f2.read()
englishtokens = nltk.wordpunct_tokenize(englishraw)
englishtext = nltk.Text(englishtokens)
englishwords = [w.lower() for w in englishwords]
, die direkt aus dem NLTK Handbuch ist. Was ich als nächstes tun möchte, ist vocab
zu einer erschöpfenden Reihe von englischen Wörtern zu vergleichen, wie das OED, und extrahieren Sie den Unterschied - der Satz von Finnegans Wake Worte, die nicht haben, und wahrscheinlich wird es nie, in der OED sein. Ich bin viel mehr eine verbale Person als ein Mathe-orientierte Person, so dass ich nicht herausgefunden haben, wie das noch zu tun, und das Handbuch geht in viel zu viel Detail über Sachen, die ich eigentlich gar nicht tun wollen. Ich gehe davon aus, es ist nur noch ein oder zwei Zeilen Code, though.
Lösung
Wenn Sie Ihr Englisch-Wörterbuch ist in der Tat eine Menge (hoffentlich von kleingeschriebenen Worten),
set(vocab) - english_dictionary
gibt Ihnen die Menge der Worte, die in dem vocab
Satz sind aber nicht in der english_dictionary
ein. (Es ist schade, dass Sie vocab
in eine Liste von dieser sorted
gedreht, da Sie brauchen, um sich wieder in einen Satz Operationen wie dieser Satz Unterschied auszuführen!).
Wenn Sie Ihr Englisch-Wörterbuch in irgendeinem anderen Format ist, nicht wirklich ein Satz oder nicht nur klein geschrieben Worten besteht, müssen Sie uns sagen, was das Format ist für uns, um Hilfe zu können! -)
Bearbeiten : angesichts der Bearbeitung zeigt die OP, dass beide words
(was vorher hieß vocab
) und englishwords
(was ich vorher english_dictionary
genannt) sind in der Tat Listen von Kleinbuchstaben Worte, dann
newwords = set(words) - set(englishwords)
oder
newwords = set(words).difference(englishwords)
Sie haben zwei Möglichkeiten „um die Reihe von Wörtern, die nicht englishwords sind“ zum Ausdruck bringen. Ersteres ist etwas prägnanter, letzteres vielleicht ein bisschen besser lesbar (da er benutzt das Wort „Differenz“ explizit statt eines Minuszeichen) und vielleicht ein bisschen effizienter (da es nicht explizit die Liste englishwords
in einer Transformation set - obwohl, wenn die Geschwindigkeit entscheidend ist, diese Bedürfnisse durch Messung überprüft werden, da „intern“ difference
muss noch eine Art „Transformation-to-Set“ -ähnlichen Betrieb tun)
Wenn Sie daran interessiert, eine Liste als Ergebnis haben anstelle eines Satzes, sorted(newwords)
Sie geben eine alphabetisch sortierte Liste (list(newwords)
würde Ihnen eine Liste ein bisschen schneller, aber in völlig beliebiger Reihenfolge, und ich vermute, Sie‘ d eher eine kleine zusätzliche Menge an Zeit warten und bekommt im Gegenzug ein schön alphabetisierte Ergebnis; -).