2010-08-06 14 views
5

tengo:La extracción de un conjunto de palabras con el pitón/NLTK, a continuación, comparándolo con un diccionario Inglés

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] 

que es directamente desde el manual NLTK. Lo que quiero hacer a continuación es comparar vocab con un conjunto exhaustivo de palabras en inglés, como el OED, y extraer la diferencia: el conjunto de palabras de Finnegans Wake que no han estado, y probablemente nunca lo estarán, en el OED. Soy mucho más una persona verbal que una persona orientada a las matemáticas, así que aún no he descubierto cómo hacerlo, y el manual contiene demasiados detalles sobre cosas que en realidad no quiero hacer. Sin embargo, asumo que son solo una o dos líneas más de código.

+0

Por cierto, ¿cómo formateo el python en la pregunta con resaltados, como aparecería en un editor de texto? – magnetar

+0

Sangúelo todo. Hecho automáticamente si lo resaltas y haces clic en el botón con unos y ceros sobre el editor. – katrielalex

+0

Ah, y su código no es el más eficiente ... podría hacer un uso juicioso de los iteradores para guardar los pases múltiples. – katrielalex

Respuesta

4

Si su diccionario Inglés es de hecho un conjunto (esperemos que de las palabras convertidas a mayúsculas),

set(vocab) - english_dictionary 

le da el conjunto de palabras que están en el conjunto vocab pero no en el english_dictionary uno. (Es una pena que haya convertido vocab en una lista con ese sorted, ya que necesita volver a convertirlo en un conjunto para realizar operaciones como esta diferencia de configuración).

Si su diccionario Inglés está en un formato diferente, no es realmente un conjunto o no comprendido solamente de las palabras convertidas a mayúsculas, usted tiene que decirnos lo que formato es para que seamos capaces de ayudar! -)

Editar: dada de edición de la OP muestra que tanto words (lo que se llamó anteriormente vocab) y englishwords (lo que antes llamé english_dictionary) están en las listas de datos de palabras convertidas a mayúsculas, a continuación,

newwords = set(words) - set(englishwords) 

o

newwords = set(words).difference(englishwords) 

son dos formas de expresar "el conjunto de palabras que no son palabras inglesas". El primero es un poco más conciso, el último quizás un poco más legible (ya que utiliza la palabra "diferencia" explícitamente, en lugar de un signo menos) y tal vez un poco más eficiente (ya que no transforma explícitamente la lista englishwords en una sin embargo, si la velocidad es crucial, debe verificarse mediante la medición, ya que "internamente" difference todavía necesita hacer algún tipo de operación similar a la de "transformación a conjunto".

Si está interesado en tener una lista como resultado en lugar de un conjunto, sorted(newwords) le dará una lista ordenada alfabéticamente (list(newwords) le daría una lista un poco más rápida, pero en orden totalmente arbitrario, y sospecho preferiría esperar un poco más de tiempo y obtener, a cambio, un resultado muy bien alfabetizado ;-).

+0

Enmendó ligeramente la pregunta para reflejar esta nueva información. – magnetar

+0

Eso es exactamente lo que necesitaba. Gracias, Alex! – magnetar

+0

@tsimotki, de nada.Tenga en cuenta que con su reputación actual puede "respaldar" las respuestas que desee (ya sean sus propias preguntas u otras); de hecho, es realmente extraño (para cualquier persona con suficiente reputación) aceptar una respuesta sin subirle la voz (aceptar significa que fue la el más útil para resolver su problema, no votando significa que realmente no le gustó mucho ... combinación inusual ;-). –

Cuestiones relacionadas