2012-06-14 19 views

Respuesta

8

La mejora más imporante es a make stopWords a set. Esto significa que las búsquedas serán muy rápido

stopWords = set(["the", "and", "with", etc...]) 
" ".join(word for word in msg.split() if word not in stopWords) 

Si lo que desea saber si alguna de las palabras vacías están en el texto

if any(word in stopWords for word in msg.split()): 
    ... 
+0

¿Es más eficiente que hacer una expresión regular? – mlt

+0

@mlt, posiblemente no. El trabajo es tan diferente a esto que es difícil de adivinar. Debes escribir una respuesta usando una expresión regular –

1

Usando list comprehension:

stopWords = ["the", "and", "with"] 
msg = "kill the fox and the dog" 

' '.join([w for w in msg.split() if w not in stopWords]) 

da:

'kill fox dog' 
+1

'w no en stopWords' obtendrá más lenta que las palabras vacías se hace más largo ya que tiene que recorrer la lista para comprobar cada uno. Esta es la razón por la cual stopWords es un conjunto importante. –

+0

@gnibbler Ok, así lo noté, gracias. Siempre feliz de aprender algo nuevo (no uso conjuntos con la frecuencia suficiente) – Levon

0
  1. Deja tus lista original de las palabras en un diccionario.
  2. Iterate a través de los caracteres en la cadena dada, usando espacio como delimitador para una palabra. Busque cada palabra en el diccionario.
3

Con Python, la operación más rápida será hacer "stopwords" un conjunto en lugar de una lista y verificar directamente la membresía con "x en stopwords". Esta estructura está diseñada para ser rápida para este tipo de operaciones.

See the set documentation

0

en tus palabras vacías en un set() (como han sugerido otros), se acumulan sus otras palabras, en un conjunto de trabajo simplemente tome la diferencia de conjuntos utilizando working = working - stopWords ... tener un conjunto de trabajo con toda la stopWords filtrado de él. O solo para verificar la existencia de tales palabras usa un condicional. Por ejemplo:

#!python 
stopWords = set('the a an and'.split()) 
working = set('this is a test of the one working set dude'.split()) 
if working == working - stopWords: 
    print "The working set contains no stop words" 
else: 
    print "Actually, it does" 

En realidad, hay estructuras de datos más eficientes, tales como un trie que podrían utilizarse para grandes, relativamente densa, conjunto de palabras vacías. Puede encontrar los módulos para Python, aunque no vi ninguna extensión escrita como binaria (C) y me pregunto dónde estaría el punto de cruce entre un trie implementado en Python puro versus el uso del soporte de Python set(). (También podría ser un buen caso para Cython, sin embargo).

De hecho, veo que alguien ha abordado esa pregunta por separado aquí SO: How do I create a fixed length mutable array of python objects in cython.

En última instancia, por supuesto, debe crear la versión simple basada en conjuntos, probarla y perfilarla, luego, si es necesario, probar las variantes de trie y Cython-trie como posibles mejoras.

0

Como alternativa, puede armar su lista en una expresión regular y reemplazar las palabras de suspensión junto con los espacios circundantes por un solo espacio.

import re 
stopWords = ["the", "and", "with"] 
input = "Kill the fox and dog" 
pattern = "\\s{:s}\\s".format("\\s|\\s".join(stopWords)) 
print(pattern) 
print(re.sub(pattern, " ", input)) 

es la salida

\sthe\s|\sand\s|\swith\s 
Kill fox dog 
Cuestiones relacionadas