2010-08-06 2 views
5

Ich habe:Extrahieren eine Reihe von Worten mit dem Python/NLTK, dann ist es zu einem Standard-Englisch-Wörterbuch Vergleich

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 mit einer erschöpfenden Menge von englischen Wörtern, wie der OED, zu vergleichen und den Unterschied zu extrahieren - der Satz von Finnegans Wake-Wörtern, die nicht und wahrscheinlich nie in der OED sein werden. Ich bin viel mehr eine verbale Person als eine Mathematik-orientierte Person, also habe ich noch nicht herausgefunden, wie man das macht, und das Handbuch geht viel zu sehr ins Detail über Sachen, die ich eigentlich nicht machen möchte. Ich gehe davon aus, dass es nur ein oder zwei weitere Codezeilen sind.

+0

Übrigens, wie formatiere ich den Python in der Frage mit Highlights, wie es in einem Texteditor erscheinen würde? – magnetar

+0

Geben Sie alles ein. Fertig, wenn Sie es markieren und auf die Schaltfläche mit Einsen und Nullen oberhalb des Editors klicken. – katrielalex

+0

Oh, und Ihr Code ist nicht der effizienteste ... Sie könnten Iteratoren sinnvoll einsetzen, um die vielen Durchgänge zu speichern. – katrielalex

Antwort

4

Wenn Ihr Englisch-Wörterbuch ist in der Tat eine Menge (hoffentlich von kleingeschriebenen Wörter),

set(vocab) - english_dictionary 

gibt Ihnen die Menge der Wörter, die in der vocab Satz sind aber nicht in der english_dictionary ein. (Es ist schade, dass Sie vocab in eine Liste von diesem sorted gedreht haben, da Sie es wieder in ein Set verwandeln müssen, um Operationen wie diesen Unterschied durchzuführen!).

Wenn 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 für uns in der Lage sein zu helfen! -)

bearbeiten: angesichts der Bearbeitung des OP zeigt, dass sowohl words (was vorher vocab genannt wurde) und englishwords (was ich vorher english_dictionary genannt) in der Tat Listen von Kleinbuchstaben Worte sind, dann

newwords = set(words) - set(englishwords) 

oder

newwords = set(words).difference(englishwords) 

sind zwei Möglichkeiten, "die Menge der Wörter, die keine Englischwörter sind" auszudrücken. Ersteres ist etwas prägnanter, letzteres vielleicht etwas lesbarer (da es das Wort "difference" explizit anstelle eines Minuszeichens verwendet) und vielleicht ein bisschen effizienter (da es die Liste englishwords nicht explizit in a umwandelt) eingestellt - wenn die Geschwindigkeit jedoch entscheidend ist, muss dies durch Messung überprüft werden, da "intern" difference immer noch eine Art "Transformation-zum-Setzen" -ähnlichen Vorgang durchführen muss.

Wenn Sie eine Liste als Ergebnis anstelle einer Menge haben möchten, geben Sie sorted(newwords) eine alphabetisch sortierte Liste (list(newwords) würde Ihnen eine Liste ein wenig schneller, aber in völlig willkürlicher Reihenfolge, und ich vermute Sie würde lieber ein bisschen mehr Zeit warten und im Gegenzug ein schönes alphabetisches Ergebnis bekommen ;-).

+0

Die Frage wurde leicht abgeändert, um diese neuen Informationen wiederzugeben. – magnetar

+0

Genau das habe ich gebraucht. Danke, Alex! – magnetar

+0

@tsimotki, gern geschehen.Beachten Sie, dass Sie mit Ihrer derzeitigen Reputation Ihre Antworten "aufheben" können (ob zu Ihren eigenen Fragen oder zu anderen) - tatsächlich ist es wirklich seltsam (für jeden mit ausreichendem Rep), eine Antwort zu akzeptieren, ohne sie zu verbessern am meisten hilfreich, um dein Problem zu lösen, nicht upvotieren bedeutet, dass du es nicht wirklich magst ... ungewöhnliche Kombination ;-). –

Verwandte Themen