Tengo un gran número de frases (~ varios millones), cada una de menos de seis o siete palabras y la gran mayoría de menos de cinco, y me gustaría ver si "frasean" coinciden "entre sí". Este es un término de marketing de motor de búsqueda: básicamente, una frase coincide con B si A está contenida en B. En este momento, se almacenan en un db (postgres) y estoy realizando un join en expresiones regulares (consulte this question). Se está ejecutando de manera increíblemente lenta incluso después de probar todos los trucos básicos de optimización (indexación, etc.) y probar las sugerencias proporcionadas.
¿Hay alguna manera más fácil de hacerlo? No soy contrario a una solución que no sea DB. ¿Hay alguna razón para pensar que las expresiones regulares son excesivas y están tomando más tiempo que una solución diferente?Pruebas de frases para ver si coinciden entre sí
Respuesta
Un algoritmo ideal para hacer coincidencias de subcadenas es AhoCorsick.
Aunque tendrá que leer los datos de la base de datos para usarlos, es tremendamente rápido, en comparación con los métodos más ingenuos.
Ver here a una pregunta relacionada con el juego subcadena:
Y here para una aplicación en Java AhoCorsick:
Sería genial tener un poco más de contexto de por qué necesita ver qué frases son subconjuntos de otras: por ejemplo, parece extraño que la base de datos se construya de esa manera de todos modos: está teniendo para hacer el trabajo ahora porque la base de datos no está en un formato apropiado, por lo que tiene sentido que debe 'arreglar' la base de datos o la forma en que está construida, en su lugar.
Depende enormemente de lo que está haciendo con los datos y por qué, pero he encontrado útil en el pasado dividir las palabras en palabras sueltas y pares de palabras, y luego vincular recursos o frases a esos singles/pares.
Por ejemplo, para poner en práctica una búsqueda que he hecho:
Fuente texto:
Testing phrases to see
Entradas:
- prueba
- frases de prueba
- frases
- frases a
- a
- para ver
- ver
para ver si otra frase era similares (de acuerdo, no contenida dentro) que se rompería la otra frase de la misma manera y contar el número de frases común entre ellos.
Tiene el bonito efecto secundario de igualar la coincidencia si utilizara (por ejemplo) "ver fases para probar": porque las palabras individuales coincidirían ... pero dado que el orden es diferente, los pares no, por lo que es tomar en cuenta las frases (palabras consecutivas) al mismo tiempo, el número de coincidencias no sería tan alto, bueno para usar como 'puntaje' en la coincidencia.
Como digo que el "tipo" de cosas me ha funcionado, pero sería genial escuchar algo más de contexto/contexto, para que podamos ver si podemos encontrar una mejor solución.
Cuando tenga la 'columna limpia' de la respuesta anterior de MaasSQL, puede, dependiendo de la forma en que funcione exactamente la frase "coincidencia de frase" (no sé), ordenar esta columna según la longitud de la cadena que contiene.
Luego, asegúrese de ejecutar la consulta de comparación de forma convergente en un procedimiento en lugar de una consulta plana, recorriendo su tabla (con un cursor) y eliminando candidatos para comparar mediante declaraciones WHERE y eliminando candidatos que ya probado (completamente). Es posible que necesite una tabla temporal para hacer esto.
¿Qué quiero decir con la instrucción 'WHERE' anteriormente? Bueno, si el valor de comparación está en una columna ordenada en longitud, nunca tendrá que probar si una cadena más larga coincide dentro de una cadena más corta.
Y con la eliminación de candidatos: a partir de las cadenas más cortas, una vez que haya probado todas las cadenas de cierta longitud, podrá eliminarlas de la tabla de comparación, ya que cualquier prueba siguiente nunca obtendrá una partido.
Por supuesto, esto requiere un poco más de programación que una sola instrucción SQL. Y depende de la forma en que "coincidencia de frase" funcione exactamente.
DTS o SSIS puede ser su amigo aquí también.
- 1. Cómo determinar si dos sectores circulares se superponen entre sí
- 2. Comprobando si dos números son permutaciones entre sí?
- 3. Diferencias entre SÍ/VERDADERO?
- 4. ¿Cómo se comunican los programas entre sí?
- 5. Alternativa al `match = re.match(); si coinciden: ... 'idiom?
- 6. si las declaraciones coinciden con varios valores
- 7. Lucene - Comodines en las frases
- 8. ¿Cómo determino cuándo se pueden ver dos puntos móviles entre sí?
- 9. ¿Hay dos matrices de permutación entre sí?
- 10. Expresión regular para unir dos frases separadas
- 11. Comparando dos matrices numpy entre sí
- 12. Algoritmo para detectar y comparar frases
- 13. Dos clases que se refieren entre sí
- 14. interactivo Emacs Lisp función para intercambiar dos palabras entre sí
- 15. Usar si __name__ == '__main__': para pruebas
- 16. usando Django y trenzados entre sí
- 17. Spring Framework Conexión de JVM entre sí
- 18. ¿Cuál es la diferencia (si existe) entre Html.Partial (ver, modelo) y Html.RenderPartial (ver, modelo) en MVC2?
- 19. Objetos que se conocen entre sí
- 20. Textrank: pagerank complementario para la extracción de frases usando networkx
- 21. ¿Son buenas las frases 'si'/'para' en el estilo de Python?
- 22. ¿Scala tiene un operador de "prueba si coinciden"?
- 23. ¿Cómo comparo frases de similitud?
- 24. ¿cómo se comunican los hilos entre sí?
- 25. ¿Las uniones discriminadas se refieren entre sí?
- 26. Vim reemplazar dos palabras entre sí
- 27. Generador de frases usando Thesaurus
- 28. Estructuras que se refieren entre sí
- 29. jQuery comprobación para ver si se muestra Div
- 30. ¿Qué ventajas/desventajas tienen MSTest y NUnit comparadas entre sí?
Puede explicar qué quiere decir con "A está contenido en B" con más detalle? ¿Te refieres a la cadena exacta o palabras individuales? –
Acabo de ver su publicación vinculada. ¿Cuántos registros tiene en A y cuántos en B? –
¿Recibió la respuesta que estaba buscando? Si es así, ¿podría aceptarlo? Si no, ¿podría aclarar lo que todavía está buscando? Por lo general, mientras más información proporciones, más probabilidades hay de que alguien te pueda ayudar. – MaasSql