2012-05-08 21 views
6

Supongamos que tengo una cadena text = "A compiler translates code from a source language". Quiero hacer dos cosas:¿Cómo iterar a través de una oración de cadena en Python?

  1. necesito iterar a través de cada palabra y detener el uso de la biblioteca NLTK. La función para derivar es PorterStemmer().stem_word(word). Tenemos que pasar el argumento 'palabra'. ¿Cómo puedo detener cada palabra y recuperar la oración derivada?

  2. Necesito eliminar ciertas palabras de finalización de la cadena text. La lista contiene las palabras vacías se almacena en un archivo de texto (separadas por espacios)

    stopwordsfile = open('c:/stopwordlist.txt','r+') 
    stopwordslist=stopwordsfile.read() 
    

    ¿Cómo puedo eliminar esas palabras vacías de text y obtener una nueva cadena limpiado?

+0

'por palabra en text.split (''): stemmer.stem_word (palabra) '? – birryree

+0

stemmed = for word in text.split (''): stemmer.stem_word (palabra) ¿funcionará? – ChamingaD

+1

No exactamente. Si desea una lista de los troncos, puede hacer 'stemmed = [stemmer.stem_word (w) for w in text.split ('')]'. Si quiere una oración, puede hacer 'sente = '' .join (stemmed)', que devolverá una oración de todos los tallos. Avísame si eso ayuda. – birryree

Respuesta

9

he publicado esto como un comentario, pero pensamos que también podría carne hacia fuera en una respuesta completa con una explicación:

Desea utilizar str.split() a dividir la cadena en palabras, y luego detener cada palabra:

for word in text.split(" "): 
    PorterStemmer().stem_word(word) 

Como desea obtener una cadena de todas las palabras de tallo juntos, es trivial para luego unirse a estos tallos de nuevo juntos. Para ello fácil y eficiente que utilizar str.join() y una generator expression:

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ")) 

Editar:

Para su otro problema:

with open("/path/to/file.txt") as f: 
    words = set(f) 

Aquí abrimos el archivo con the with statement (que es la mejor forma de abrir archivos, ya que se encarga de cerrarlos correctamente, incluso con excepciones, y es más legible) y leer los contenidos en un conjunto. Usamos un conjunto ya que no nos importa el orden de las palabras, o duplicados, y será más eficiente más adelante. Estoy presumiendo una palabra por línea; si este no es el caso, y están separados por coma, o espacios en blanco separados, entonces usando str.split() como lo hicimos antes (con los argumentos apropiados) es probablemente un buen plan.

stems = (PorterStemmer().stem_word(word) for word in text.split(" ")) 
" ".join(stem for stem in stems if stem not in words) 

Aquí se utiliza la cláusula if expresión de un generador de hacer caso omiso de las palabras que se encuentran en el conjunto de palabras que cargan desde un archivo. Las verificaciones de membresía en un conjunto son O (1), por lo tanto, esto debería ser relativamente eficiente.

Edición 2:

Para eliminar las palabras antes de que se derivaban, es aún más simple:

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ") if word not in words) 

La eliminación de las palabras dadas es simplemente:

filtered_words = [word for word in unfiltered_words if not in set_of_words_to_filter] 
+0

Necesito hacer otra cosa. Para eliminar palabras de parada de esa cadena. Lista de palabras vacías almacena en el archivo de texto (espacio separado) stopwordsfile = abierto ('c: /stopwordlist.txt', 'r +') stopwordslist = stopwordsfile.read() Necesito quitar esas palabras de parada de 'texto 'y limpiar una nueva cuerda. – ChamingaD

+0

@ ChamingaD Sugeriría que es un problema diferente y debería abrir una nueva pregunta. Si lo hace, será más útil para otras personas en el futuro con un problema similar, y nos resultará más fácil trabajar con él. –

+0

El problema es que tengo que esperar otros 20 minutos para iniciar una nueva consulta:/ – ChamingaD

4

que ir a través de cada palabra de la cadena: método de unión

for word in text.split(): 
    PorterStemmer().stem_word(word) 

Uso de cadena (recomendado por Lattyware) para concatenar piezas a una cadena grande.

" ".join(PorterStemmer().stem_word(word) for word in text.split(" ")) 
+2

La pregunta sí pregunta 'y obtener una sentencia derivada de nuevo' por lo que un completo la respuesta sería '" ".join (PorterStemmer(). stem_word (palabra) para la palabra en text.split (" "))'. –

Cuestiones relacionadas