Como dice el título, tengo una lista de palabras, Como stopWords = ["the", "and", "with", etc...]
y recibo texto como "Mata al zorro y el perro". Quiero que la salida como "Kill fox dog" sea muy eficiente y rápida. ¿Cómo puedo hacer esto (sé que puedo repetir utilizando un bucle, pero eso no es muy eficiente)Si tengo una lista de palabras, ¿cómo puedo verificar si string no contiene ninguna de las palabras en la lista y de manera eficiente?
Respuesta
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()):
...
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'
'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. –
@gnibbler Ok, así lo noté, gracias. Siempre feliz de aprender algo nuevo (no uso conjuntos con la frecuencia suficiente) – Levon
- Deja tus lista original de las palabras en un diccionario.
- Iterate a través de los caracteres en la cadena dada, usando espacio como delimitador para una palabra. Busque cada palabra en el diccionario.
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.
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.
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
- 1. MySQL: columna contiene Word de la lista de palabras
- 2. Forma más eficiente de encontrar si una lista grande contiene una cadena específica (Python)
- 3. Cómo filtrar de manera eficiente una cadena contra una larga lista de palabras en Python/Django?
- 4. Lista de palabras "Detener palabras" para inglés?
- 5. Python: ¿la mejor/manera eficiente de encontrar una lista de palabras en un texto?
- 6. Usando Java Regex, ¿cómo comprobar si una cadena contiene alguna de las palabras de un conjunto?
- 7. ¿Vim sustitución de una lista de palabras con otra misma lista de palabras?
- 8. ¿Mejor manera de verificar si hay elementos en la lista?
- 9. ¿Cómo comprobar si cualquier palabra en mi lista <string> contiene en el texto
- 10. ¿Cómo comprobar si las palabras de una lista contienen una cadena parcial?
- 11. ¿Cómo verificar si algunos elementos están en una lista?
- 12. ¿La mejor manera de verificar si una lista desplegable contiene un valor?
- 13. cómo comprobar si una lista contiene una lista secundaria
- 14. Compresión y búsqueda de la enorme lista de palabras
- 15. Si la cadena no contiene ninguna lista de cadenas en python
- 16. determinar si una lista contiene otras listas
- 17. Comprobar lista de palabras en otra cadena
- 18. ¿Cómo puedo verificar si una lista contiene un objeto de cierto tipo? C#
- 19. ¿Cómo puedo verificar si las coordenadas cartesianas forman un rectángulo de manera eficiente?
- 20. Calcular de manera eficiente la frecuencia de las palabras en una cadena
- 21. ¿Cómo puedo saber rápidamente si una lista contiene solo duplicados?
- 22. Manera eficiente de verificar si DataTable tiene la fila
- 23. Ruby: cómo comprobar si una cadena contiene todas las palabras de una matriz?
- 24. ¿Dónde puedo encontrar una lista de palabras de parada hebreas?
- 25. ¿Cuál es una manera fácil de decir si una lista de palabras es anagrama de la otra?
- 26. Vim resaltar una lista de palabras
- 27. Comprueba si una lista principal contiene un objeto
- 28. Encontrar las palabras más populares en una lista
- 29. Lista de palabras reservadas en Android
- 30. Algoritmo eficiente de codificación de palabras
¿Es más eficiente que hacer una expresión regular? – mlt
@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 –