2010-08-06 9 views
5

ho:Estrazione un insieme di parole con Python/NLTK, poi paragonandolo a un dizionario inglese standard

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] 

che è direttamente dal manuale di NLTK. Quello che voglio fare dopo è confrontare vocab in un set completo di parole inglesi, come l'OED, ed estrarre la differenza - l'insieme di parole di Finnegans Wake che non hanno, e probabilmente non lo saranno mai, nell'OED. Sono molto più una persona di natura verbale che una persona orientata alla matematica, quindi non ho ancora capito come farlo, e il manuale va in modo troppo dettagliato su cose che in realtà non voglio fare. Suppongo che siano solo una o due righe di codice, comunque.

+0

A proposito, come posso formattare il pitone nella domanda con evidenziazioni, come apparirebbe in un editor di testo? – magnetar

+0

Rientra tutto. Fatto automaticamente se lo evidenzi e fai clic sul pulsante con uno e zero sopra l'editor. – katrielalex

+0

Oh, e il tuo codice non è il più efficiente ... potresti fare un uso giudizioso degli iteratori per salvare i passaggi multipli. – katrielalex

risposta

4

Se il vostro inglese è infatti un insieme (si spera di parole cambiate in maiuscolo),

set(vocab) - english_dictionary 

ti dà l'insieme di parole che sono nel set vocab ma non nel english_dictionary uno. (È un peccato che tu abbia trasformato vocab in un elenco da quello sorted, dal momento che devi tornare in un set per eseguire operazioni come questa differenza di set!).

Se il tuo Inglese è in qualche diverso formato, non proprio un insieme o non composto solo di parole cambiate in maiuscolo, si dovrà dirci cosa che formato è per noi essere in grado di aiutare -!)

Edit: data di modifica del PO mostra che sia words (ciò che è stato in precedenza chiamato vocab) e englishwords (quello che in precedenza chiamato english_dictionary) sono negli elenchi fatto di parole cambiate in maiuscolo, quindi

newwords = set(words) - set(englishwords) 

o

newwords = set(words).difference(englishwords) 

sono due modi per esprimere "l'insieme di parole che non sono parole inglesi". Il primo è leggermente più conciso, il secondo forse un po 'più leggibile (poiché usa esplicitamente la parola "differenza" invece di un segno meno) e forse un po' più efficiente (dal momento che non trasforma esplicitamente l'elenco englishwords in un set - sebbene, se la velocità è cruciale, questo deve essere controllato mediante misurazione, dal momento che "internamente" difference ha ancora bisogno di fare una sorta di operazione "trasformazione in serie".

Se siete desiderosi di avere una lista come risultato, invece di un insieme, sorted(newwords) vi darà un elenco in ordine alfabetico (list(newwords) darebbe un elenco un po 'più veloce, ma in modo del tutto arbitrario, e si sospetta Preferisco aspettare un po 'di tempo in più e ottenere, in cambio, un risultato ben alfabetizzato ;-).

+0

Modificata leggermente la domanda per riflettere queste nuove informazioni. – magnetar

+0

Questo è esattamente ciò di cui avevo bisogno. Grazie, Alex! – magnetar

+0

@tsimotki, prego.Nota che con la tua attuale reputazione puoi "rispedire" le risposte che ti piacciono (sia alle tue stesse domande o ad altre) - anzi, è davvero strano (per chiunque abbia un rappresentante sufficiente) accettare una risposta senza svalutarla (accettare significa che era la il più utile per risolvere il tuo problema, non il upvoting significa che non ti è piaciuto molto ... combinazione insolita ;-). –

Problemi correlati