Coincidencia exacta de frases del segmentador de palabras en chino ES (resuelva el problema de concordancia incompleta de frases coincidentes)
Investigamos varios segmentadores de palabras, como el segmentador de palabras IK, el segmentador de palabras ansj y el segmentador de palabras mmseg, y descubrimos que IK tiene el mejor efecto de segmentación de palabras. Por ejemplo:
En el ejemplo anterior, IK y Mmsg usan el mismo diccionario. Ansj e IK, Mmsg no utilizan un conjunto de diccionarios ni están configurados con palabras vacías.
El segmentador de palabras chino que se analiza en este artículo es el segmentador de palabras IK.
El cartel quería poner todas las palabras en el diccionario, de modo que cuando se use ik_max_word para indexar los datos, las palabras se puedan separar para construir el índice y las palabras se puedan separar para construir el índice. Luego use ik_smart para buscar frases, porque los datos separados por ik_smart son un subconjunto de ik_max_word. Si la frase que desea buscar aparece en el texto original, definitivamente se puede encontrar. Más tarde, descubrí que cuando usé el segmentador de palabras ik_smart para buscar oraciones (match_phrase), no pude encontrar ninguna oración, ¿exo? ¿Por qué no se puede encontrar? Obviamente es un subconjunto. El sitio web oficial explica match_phrase de la siguiente manera:
Esto significa que cuando se usa match_phrase para buscar, la posición de la palabra separada por el segmentador de palabras de búsqueda es la misma que la posición de la palabra separada al crear el índice. Por ejemplo:
Como se puede ver en lo anterior, al buscar, ik_smart divide la declaración en dos palabras: felicidad y gratitud, y las posiciones son 1 y 2 respectivamente. Cuando ik_max_word construye el índice, las posiciones. de felicidad y gratitud son respectivamente 1 y 4. Según match_phrase, esto no coincide, por lo que cuando se usan frases de segmentación de palabras ik_smart, no se pueden encontrar los datos o no se pueden encontrar los datos completos.
Bueno, como ik_smart no puede encontrarlo, usaré ik_max_word para encontrar la oficina central. Usando el ejemplo anterior, al buscar "felicidad", encontrará que los resultados que encuentra usando ik_max_word no son tantos como los obtenidos al indexar usando el segmentador de palabras estándar. La razón es la misma que se mencionó anteriormente:
Al construir el índice, las posiciones de felicidad, alegría y placer son 1, 2, 4 respectivamente, mientras que el orden de los segmentos de palabras al buscar es 1, 2. , 3 y luego match_phrase Se considera que no coincide, por lo que no se puede encontrar tal resultado en la consulta.
Si encuentra algún problema, busque soluciones en línea. Después de leer varios blogs, todos señalaron el problema de coincidencia de match_phrase. Hay dos soluciones:
Todos están familiarizados con el segmentador de palabras estándar. Definitivamente es posible dividir los caracteres chinos. comprobado. Pero si lo divide uno por uno, habrá un conjunto muy grande de documentos correspondientes a cada palabra. Si la cantidad de datos alcanza decenas de miles de millones, el efecto será muy pobre al encontrar intersecciones y calcular distancias.
El tokenizador Ngram es similar al tokenizador estándar. Puede especificar la longitud del token y luego cortarlo utilizando el método estándar. Por ejemplo, para "Felices vacaciones", especificamos la longitud de corte como 2 y NGram cortará en "Vacaciones", "Rikuai" y "Happy". Aunque la cantidad de documentos correspondientes a cada token se puede reducir durante la búsqueda, la capacidad de almacenamiento aumentará mucho y ya no se admiten coincidencias aproximadas. Muy rústico.
Cuando ik_max_word crea el índice, ik_smart no puede encontrarlo. La razón es que ik_max_word separa todas las palabras y ik_smart solo separa un tipo de palabra. Debido a las limitaciones de match_phrase, ik_smart no puede encontrarlo. Luego uso ik_smart al construir y también uso ik_smart al buscar. De esta manera, siempre que haya datos en el texto original y se use el mismo método de segmentación de palabras para la construcción y la búsqueda, debería poder encontrarse. Después de las pruebas, descubrimos que esto también tiene un gran problema, es decir, una palabra como "Stalker" solo se divide en dos tokens: "Stalker" y "Zhe", pero "Stalker" también es una palabra cuando se busca ". Stalker" No se pueden recuperar los datos completos.
La razón por la cual ik_smart no puede buscar todas las palabras es porque solo distingue la posibilidad de una palabra, lo que resulta en búsquedas incompletas de algunas palabras. ik_max_word puede resolver este problema. .
Pero 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 encontrar todas las palabras. ¿Podemos dejar que ik_max_word separe palabras de palabras?
Por supuesto, puede especificar dos métodos de segmentación de palabras para un atributo:
De esta manera, el atributo ulluin utiliza segmentación de palabras estándar, es decir, segmentación de palabras de una sola palabra, y ulluin.ik usa ik_max_word, que es la segmentación de palabras, y el diccionario de ik_max_word Elimina todas las palabras de .
Al realizar una consulta, primero segmente la frase de consulta en palabras. Si hay una palabra en el primer token y en el último token, entonces esta palabra puede formar una palabra con la siguiente palabra o la palabra anterior en el original. text, lo que hace que ik_max_word falle. Encontrado, usamos el tokenizador estándar para consultar en ulluin. Si el primer token y el último token son palabras, entonces se pueden consultar en ik_max_word. Continúe y pruébelo:
¿Por qué sigue habiendo un problema? ¿La cantidad de datos detectados por ik_max_word es menor que la del estándar? O debido a la limitación de match_phrase, las posiciones de "Festival" y "Happy" en el índice son 1 y 3, mientras que las posiciones de "Festival" y "Happy" durante la búsqueda son 1 y 2. Este problema es fácil de resolver. Simplemente use match_phrase_prefix para realizar la consulta, es decir:
También se mencionó anteriormente que ik_max_word tiene el problema de que separa más palabras que el estándar. Después de filtrar la segmentación de una sola palabra, el efecto será Hay una gran mejora. Supongamos que nuestro diccionario no tiene segmentación de cuatro caracteres, solo dos o tres caracteres. Por ejemplo
Se puede ver que el efecto modificado es mucho mejor que el efecto estándar. No solo se reduce la cantidad de tokens, sino que también se reduce considerablemente la cantidad de documentos correspondientes a cada token, lo que reduce. la necesidad de intersección. La cantidad de datos y la cantidad de datos para calcular la distancia.
En este punto, finalmente se ha resuelto el problema de la coincidencia precisa de la segmentación de palabras en chino ES.