Red de conocimiento informático - Aprendizaje de programación - Coincidencia exacta de frases del segmentador de palabras en chino ES (resuelva el problema de la concordancia incompleta)

Coincidencia exacta de frases del segmentador de palabras en chino ES (resuelva el problema de la concordancia incompleta)

Después de estudiar varios tesauros como el tesauro IK, el tesauro ansj y el tesauro mmsg, descubrimos que el tesauro IK tiene el mejor efecto. Por ejemplo:

En el ejemplo anterior, IK y Mmsg usan la misma biblioteca de vocabulario, mientras que ansj, IK y Mmsg usan bibliotecas de vocabulario diferentes y la palabra detener no está configurada.

El diccionario chino de este artículo es el diccionario IK.

La idea principal es poner todas las palabras en el diccionario para que cuando se use ik_max_word para indexar los datos, se puedan indexar tanto palabras como caracteres. Luego use ik_smart para encontrar la frase, porque los datos de ik_smart son un subconjunto de ik_max_word, si la frase que está buscando aparece en el texto original, definitivamente podrá encontrarla. Más tarde, descubrí que al usar ik_smart splitter y exo, no se encontró ninguna oración (match_phrase). Obviamente se trata de un subconjunto. El sitio web oficial explica match_phrase de la siguiente manera:

Lo que significa es que cuando usas match_phrase para encontrar una oración, la posición de la palabra separada por el separador léxico de búsqueda es la misma que la posición de la palabra establecida por el índice. Por ejemplo:

Como se puede ver en el contenido anterior, ik_smart divide la oración en dos palabras, feliz y agradecido, con las posiciones 1 y 2 respectivamente, mientras que ik_max_word divide las posiciones de índice de las palabras feliz y agradecido. Para 1 y 4 respectivamente, esto no coincide en la vista de match_phrase, por lo que no puede buscar ni encontrar todos los datos en la frase de palabras dividida por ik_smart.

Bien, como ik_smart no puede encontrarlo, usaré ik_max_word para encontrarlo. Usando el ejemplo anterior, cuando busque "feliz", encontrará que usar ik_max_word no le brinda tantos resultados como usar el índice de palabras estándar. El motivo es el mismo que el anterior:

Al construir el índice, las posiciones de feliz, rápido y alegría son 1, 2 y 4 respectivamente, y el orden de las palabras en la búsqueda es 1. 2 y 3, por lo que match_phrase piensa que no coinciden, por lo que no se obtuvo este resultado.

Me encontré con un problema y estaba buscando una solución en línea. Leí varios blogs y todos señalaron el problema de coincidencia de match_phrase. Hay dos soluciones:

Todo el mundo está familiarizado con la segmentación de palabras estándar y, para los caracteres chinos, es una segmentación de palabras una por una. Definitivamente comprobaré todo. Pero si busca palabra por palabra, el conjunto de documentos correspondiente a cada palabra es muy grande. Si la cantidad de datos alcanza los 10 mil millones, el efecto al calcular la distancia de intersección será muy pobre.

El participante Ngram es similar al participante estándar en que puede especificar la longitud del participante y luego usar métodos estándar para cortarlo. Por ejemplo, si especificamos que la longitud de segmentación de "Felices vacaciones" es 2, NGram lo segmentará en "Vacaciones", "Ayuno" y "Felices". Aunque se puede reducir la cantidad de documentos correspondientes a cada etiqueta. durante la búsqueda, pero la capacidad de almacenamiento aumentará mucho y no se admiten coincidencias aproximadas. Muy sensato.

ik_max_word crea un índice y ik_smart no puede encontrarlo porque ik_max_word divide todas las palabras, mientras que ik_smart solo divide un tipo de palabra. Debido a las limitaciones de match_phrase en sí, ik_smart no puede encontrarlo.

Luego uso ik_smart cuando construyo e ik_smart cuando busco. De esta manera, siempre que haya datos en el texto original, puedo usar el mismo método de segmentación de palabras para construir y buscar, y debería poder encontrarlos. Después de las pruebas, encontramos un gran problema, es decir, palabras como "stalker" solo se dividen en dos etiquetas: "stalker" y "of", pero "walker" y "stalker" no son lo mismo que "Walkers". acosadores" también son diferentes. "Walker" también es una palabra y no se pueden encontrar todos los datos cuando se busca "Walker".

La razón por la que ik_smart no puede encontrar todos los datos es que solo puede encontrar la probabilidad de una palabra, lo que hace que la búsqueda de algunas palabras esté incompleta. Sin embargo, el problema con ik_max_word es que si la última palabra buscada puede formar una palabra con la siguiente palabra en el texto original, entonces habrá el problema de no poder encontrarlas todas. ¿Podemos hacer que ik_max_word separe palabras de palabras?

Por supuesto, podemos especificar dos métodos de segmentación de palabras para un atributo:

De esta manera, el atributo ulluin utiliza el método de segmentación de palabras estándar, es decir, segmentación de palabras de una sola palabra. Mientras que ulluin.ik usa ik_max_word, es decir, según la segmentación de Word, el diccionario de ik_max_word eliminará todas las palabras de una sola palabra.

Al realizar una consulta, primero dividimos la frase de consulta en palabras. Si hay palabras en la primera etiqueta y en la última etiqueta, entonces esta palabra puede estar compuesta por la siguiente palabra o la palabra anterior en el texto original. .word, lo que hace que no se encuentre ik_max_word. En este momento, usamos el divisor estándar para consultar en ulluin. Si el primer token y el último token son palabras, no se puede encontrar ik_max_word. Si el primer token y el último token son palabras, significa que podemos consultar en ik_max_word. Continúe probando:

¿Por qué el problema persiste? ¿Ik_max_word encontró menos datos que los datos estándar? ¿O es por la limitación de match_phrase, donde los índices de "vacaciones" y "feliz" son 1 y 3 respectivamente, y la búsqueda de "vacaciones" y "feliz" son 1 y 3 respectivamente. "Este problema es fácil de resolver, simplemente use la consulta match_phrase_prefix, es decir:

También se mencionó anteriormente que ik_max_word tiene un problema, es decir, la cantidad de palabras excede el estándar. Después de filtrar el palabras, el efecto mejorará enormemente. Supongamos que no hay participios de cuatro caracteres en nuestro diccionario, sino solo dos o tres. Por ejemplo, puede ver que el efecto modificado es mucho mejor que el efecto estándar. de etiquetas se reduce. Además, la cantidad de documentos correspondientes a cada etiqueta también se reduce considerablemente, lo que reduce la cantidad de datos para encontrar intersecciones y calcular distancias.

Esto finalmente resuelve el problema de corte y coincidencia exacta del chino ES.