2012-05-18 18 views
5

que tengo un conjunto de términos de búsqueda como [+ perro - "Jack russels" + "fox terrier"], [+ gato + persa - tabby]. Estos pueden ser bastante largos con quizás 30 términos secundarios que componen cada término.análisis de un gran cantidad de texto basado en un juego constante de términos de búsqueda

ahora tengo algunas noticias en línea artículos extractos tales como ["Mi fox terrier es el perro más lindo del mundo ..."] y ["¿Alguien ha visto a mi gato persa perdido? Desapareció ... "]. No son demasiado largos, tal vez 500 caracteres como máximo cada uno.

En los motores de búsqueda tradicionales se espera una gran cantidad de artículos preprocesados ​​en índices, lo que permite aceleraciones al buscar 'términos de búsqueda', utilizando la teoría de conjuntos/lógica booleana para reducir artículos a solo los que coinciden las frases. En esta situación, sin embargo, el orden de mis términos de búsqueda es ~ 10^5, y me gustaría poder procesar un solo artículo a la vez, para ver TODOS los conjuntos de términos de búsqueda con los que coincida el artículo (es decir, todos los términos + están en el texto y ninguno de los - términos).

Tengo una posible solución utilizando dos mapas (uno para las frases secundarias positivas, uno para las frases secundarias negativas), pero no creo que sea muy eficiente.

El primer premio sería una biblioteca que resuelve este problema, el segundo premio es un empujón en la dirección correcta para resolver esto.

Saludos cordiales,

+0

¿Puedes explicar por qué quieres hacer esto? Puede haber una solución mejor ... – beerbajay

+0

¿Cuál es tu problema? ¿Qué hiciste hasta ahora? –

+0

Usted podría estar interesado en http://stackoverflow.com/questions/5695826/compound-queries-with-redis - el enfoque que utilicé para eso pareció funcionar bien para mí. Redis es eficiente en el uso de memoria mínima, por lo que puede ser una opción. –

Respuesta

1

Suponiendo que todos los sub-términos positivos para un partido:

poner todas las sub-términos de sus términos de búsqueda en una tabla hash. El sub-término es la clave, el valor es un puntero a la estructura de datos del término de búsqueda completo (que debe incluir una identificación única y un mapa de sub-términos para un booleano).

Además, al procesar una noticia, cree un mapa de "candidatos", indexado por el término id. Cada estructura candidata tiene un puntero al término definición, un conjunto que contiene los sub-términos vistos y un indicador "rechazado".

Revise las palabras del artículo de noticias.

Para cada golpe, busque la entrada del candidato. Si no está allí, crea y agrega uno vacío.

Si se establece el indicador de rechazo de candidato, ha terminado.

De lo contrario, busque el subtítulo del término estructura de datos. Si es negativo, configure la bandera rechazada. Si es positivo, agregue el término parcial al conjunto de sub-términos vistos.

Al final, itere sobre los candidatos. Todos los candidatos que no son rechazados y donde el tamaño del conjunto visto es igual al número de sub-términos positivos de ese término son sus éxitos.

Implementación: https://docs.google.com/document/d/1boieLJboLTy7X2NH1Grybik4ERTpDtFVggjZeEDQH74/edit

Runtime es O (n * m) donde n es el número de palabras en el artículo y m es el número máximo de términos que comparten la misma sub-plazo (espera que sea relativamente pequeña) .

+0

De hecho, pasé algún tiempo este fin de semana sobre este problema y obtuve una solución similar. Creo que una optimización de memoria que hice fue asegurar que cada palabra en el artículo fuera única (usando un hashmap 'visto'); y luego, en lugar de usar conjuntos para candidatos, podría usar un byte. – Noxville

+0

Gran trabajo, ¡muchas gracias! – Noxville

+0

¿Un byte que identifica la palabra en el artículo? ¿O usarlo como un poco establecido para codificar visto? Por cierto: es posible que desee utilizar String.intern() al leer los filtros si no lo hace. –

0

En primer lugar, creo que hacer una Suffix Tree del documento hace que la búsqueda mucho más rápido ya que se necesita para construir una vez, pero se pueden utilizar tantas veces como la longitud de la consulta es.

En segundo lugar, necesita repetir todos los términos de búsqueda (ambos + y - unos) para asegurarse de que la respuesta es sí (es decir, el documento coincide con la consulta). Sin embargo, para una respuesta "no", ¡no! Si la respuesta es no, entonces el orden de coincidencia de los términos de búsqueda con el documento realmente importa. Esa es una orden que puede darle un "no" más rápido que otra orden. Ahora la pregunta es "¿Cuál es el orden óptimo para obtener un NO rápido?". Realmente depende de la aplicación, pero un buen punto de partida es que los términos de palabras múltiples como "gato grande rojo" se repiten con menos frecuencia en los documentos en comparación con términos cortos como "gato" y viceversa. Por lo tanto, vaya con + "Loo ooo ooo ooo ooo ong" y - términos "cortos" primero. Se requieren

+0

Cada documento solo se analizará una vez para ver coincidencias de "términos de búsqueda": el preprocesamiento no servirá de nada. – Noxville

Cuestiones relacionadas