2012-02-18 10 views
11

que tienen lista de Python, como a continuación¿Cómo contener palabras en la lista de Python?

documents = ["Human machine interface for lab abc computer applications", 
      "A survey of user opinion of computer system response time", 
      "The EPS user interface management system", 
      "System and human system engineering testing of EPS", 
      "Relation of user perceived response time to error measurement", 
      "The generation of random binary unordered trees", 
      "The intersection graph of paths in trees", 
      "Graph minors IV Widths of trees and well quasi ordering", 
      "Graph minors A survey"] 

ahora tengo que frenar ella (cada palabra) y obtener otra lista. Cómo puedo hacer eso ?

+1

Lo que hacer significa por "tallo"? ¿Puedes proporcionar un resultado de muestra? – cha0site

+0

Vas a necesitar definir lo que quieres decir, exactamente, por 'raíz'. ¿Podemos suponer que siempre será inglés? –

+1

¿Tal vez el paquete [stemming] (http://pypi.python.org/pypi/stemming/1.0), si está buscando palabras derivadas en inglés? – birryree

Respuesta

25
from stemming.porter2 import stem 

documents = ["Human machine interface for lab abc computer applications", 
      "A survey of user opinion of computer system response time", 
      "The EPS user interface management system", 
      "System and human system engineering testing of EPS", 
      "Relation of user perceived response time to error measurement", 
      "The generation of random binary unordered trees", 
      "The intersection graph of paths in trees", 
      "Graph minors IV Widths of trees and well quasi ordering", 
      "Graph minors A survey"] 

documents = [[stem(word) for word in sentence.split(" ")] for sentence in documents] 

Lo que estamos haciendo aquí es utilizar un list comprehension a recorrer cada cadena dentro de la lista principal, la división que en una lista de palabras. Luego recorremos esa lista, derivando cada palabra sobre la marcha, devolviendo la nueva lista de palabras derivadas.

Tenga en cuenta que no he probado esto con stemming instalado - Lo he tomado de los comentarios, y nunca lo he usado. Este es, sin embargo, el concepto básico para dividir la lista en palabras. Tenga en cuenta que esto producirá una lista de listas de palabras, manteniendo la separación original.

Si no desea que esta separación, que puede hacer:

documents = [stem(word) for sentence in documents for word in sentence.split(" ")] 

En cambio, lo que le dejará con una lista continua.

Si desea unirse a las palabras de nuevo juntos al final, que puede hacer:

documents = [" ".join(sentence) for sentence in documents] 

o hacerlo en una sola línea:

documents = [" ".join([stem(word) for word in sentence.split(" ")]) for sentence in documents] 

Dónde mantener la estructura de la oración, o

documents = " ".join(documents) 

Donde se ignora.

+0

Eso no funcionará; cada "palabra" en su lista será una lista. – DSM

+0

@DSM De hecho, obtuve el orden equivocado, corregido. –

+0

Gracias. arranca pero divide cada palabra en la lista. '['comput', 'compil', 'translat', 'sourc', 'code', 'into', 'object', 'code,', 'while', 'interpret', 'execut', ' el ',' programa '] [' A ',' compil ',' compil ',' su ',' código ',' en ',' a ',' "runable" ',' applic ',' (ej. : ',' a ',' .ex ',' file) ',' where ',' as ',' an ',' intepret ',' run ',' the ',' sourc ',' code ',' as ',' it ',' goe ']' – ChamingaD

5

Es posible que desee echarle un vistazo al NLTK (Natural Language ToolKit). Tiene un módulo nltk.stem que contiene varios diferentes talladores.

Véase también this question.

+0

Gracias :) ¿Puedo saber cómo iterar a través de toda la lista y detener todas las palabras? – ChamingaD

+1

@ChamingaD: 'words = [w para línea en documentos para w en line.split()]'. O incluso 'words = '' .join (documents) .split()' –

3

Muy bien. Por lo tanto, utilizando el paquete stemming, tendría algo como esto:

from stemming.porter2 import stem 
from itertools import chain 

def flatten(listOfLists): 
    "Flatten one level of nesting" 
    return list(chain.from_iterable(listOfLists)) 

def stemall(documents): 
    return flatten([ [ stem(word) for word in line.split(" ")] for line in documents ]) 
+0

¿Cómo puedo dejar de dividir cada palabra en la lista final? – ChamingaD

+0

Uniéndolos juntos mediante '" ".join (list_of_words)' –

1

puede utilizar NLTK:

from nltk.stem import PorterStemmer 


ps = PorterStemmer() 
final = [[ps.stem(token) for token in sentence.split(" ")] for sentence in documents] 

NLTK tiene muchas características para sistemas IR, comprobarlo

Cuestiones relacionadas