Dado un gran diccionario de N frases cortas (1 o 2 términos) y una gran porción de texto, ¿puedo encontrar de manera eficiente las coincidencias para esas frases en el texto en tiempo sub-N, mientras perdono * los pequeños errores?

Su problema es la coincidencia aproximada de cadenas: http://en.wikipedia.org/wiki/App…

Aquí hay un documento sobre lo que hicimos en Google para el problema de corregir la ortografía de las URL mal escritas http://portal.acm.org/citation.c…

Básicamente, creamos un trie de URL y ejecutamos una búsqueda A * en esta estructura donde el estado en la búsqueda era el prefijo en la cadena de consulta que ya coincidía y el nodo en el trie en el que estamos. Obtenemos cuán prometedor es un estado al hacer una combinación de cuán bueno es el subárbol (tiene buenas URL), la longitud de la cadena que queda para coincidir y la distancia de edición actual. Procesamos nodos en orden de prioridad.

Puede hacer lo mismo, poner todos sus bigrams en un trie o usar un árbol de sufijos para todo el texto y luego ejecutar A * en él.

Hay otros enfoques, como indexar n-gramas (que en este caso son n subcadenas de letras de las palabras) o usar hashing sensible a la localidad (creo que eso es lo que Liron está tratando de explicar). Puede encontrar algunos documentos que analizan los enfoques para el problema en la parte inferior del artículo de wikipedia.

Parece que solo necesita un algoritmo para hacer una coincidencia difusa entre una cadena pequeña y un diccionario grande. El truco es encontrar una manera de hacerlo en un número constante de búsquedas hash. Así es como lo haría usando los trucos que conozco:

  1. Para cada una de las entradas de su diccionario N, use algunas funciones diferentes de muchos a uno para asignarlo a unos pocos “núcleos” (imágenes de funciones). Por ejemplo, si la entrada es “cuarto de libra”, una de las funciones puede ser una derivación que la asigna a “cuarto de libra”, una de las funciones puede ser un alfabetizador que la asigna a “cuarto de libra” (pone las palabras en orden alfabético para indexarlo de una manera que sea independiente del orden original de las palabras), etc. Podría ser mejor combinar un stemmer y un alfabetizador y otras operaciones de reducción del núcleo en la misma función de muchos a uno.
  2. Ahora genere un número limitado de “errores tipográficos” para todos los núcleos y almacénelos en su tabla hash. Tenga en cuenta que el conjunto de errores tipográficos de una cadena del núcleo no debería ser realmente un conjunto de errores tipográficos de esa cadena, sino más bien la imagen de la función muchos a uno de ese núcleo que obtiene si primero realiza errores tipográficos en los elementos de la cadena del núcleo. preimagen.
  3. Luego, más tarde, cuando desee ver si “cuarto de galón” coincide con algo en su diccionario, aplica las mismas (número constante de) funciones de varios a uno y realiza búsquedas rápidas de hash en las salidas.

Debe hacer que las funciones de muchos a uno sean “liberales” y asignar muchas cosas al mismo núcleo, porque siempre puede tirar coincidencias que son demasiado liberales una vez que saca la palabra del diccionario de la tabla hash por su núcleo . Simplemente agrega una etapa adicional que utiliza un algoritmo de puntuación de similitud más fino (por ejemplo, Levenshtein) en el pequeño conjunto de resultados.

Debe usar una combinación de un árbol de prefijos ( http://en.wikipedia.org/wiki/Aho …) y alguna modificación de la distancia de edición para la coincidencia de texto. Para obtener más detalles sobre cómo hacerlo, consulte http: //www-tsujii.is.su-tokyo.a… .

More Interesting

¿Cuál es el número más pequeño [matemática] N [/ matemática] tal que [matemática] N \ equiv 2 \ mod 3, [/ matemática] [matemática] N \ equiv 1 \ mod 5, [/ matemática] [matemática] N \ equiv 4 \ mod 7 [/ matemáticas]?

¿Cuál será la complejidad temporal de la relación de recurrencia T (n-1) + T (n-2) + c?

¿Es posible tener análisis predictivos utilizando motores de recomendación? En caso afirmativo, ¿cuáles son algunos de los algoritmos de análisis predictivo utilizados por los motores de recomendación?

¿Debería entrenarme para implementar estructuras de datos y algoritmos, excepto los simples programas tipo 'Hola mundo'?

Cómo resolver un problema usando C ++

Dados 2n puntos en un avión. Uno quiere dibujar n segmentos que unan pares de estos puntos, de modo que no haya dos segmentos que compartan un vértice común. ¿De cuántas maneras se puede hacer esto?

¿Qué vas a aprender y en qué proyecto vas a trabajar este verano como principiante en programación?

¿Se puede usar el algoritmo DBSCAN para determinar los límites del área geográfica?

¿Cuál es el algoritmo de seguimiento de la ubicación más cercana a algunos amigos que se encuentran en una región de cuadrícula?

¿Qué compañías necesitan algoritmos de flujo óptico fuertes?

¿Es posible realizar operaciones de alta frecuencia con la plataforma Zerodha?

Visión por computadora: ¿cuáles son los documentos de lectura obligatoria para el algoritmo de seguimiento de objetos?

¿Qué tiene más sentido estudiar como programador después de aprender algoritmos básicos?

¿Cuál sería un buen método o algoritmo para predecir el ganador de una carrera de caballos, dada una gran cantidad de información sobre las carreras de caballos?

¿Cómo es inventar tu propio algoritmo?