Un complemento de segmentación de palabras chinas de elasticsearch.
Grupo de comunicación QQ: 743457803
Consulte aquí para saber cómo desarrollar un complemento de segmentación de palabras en ES.
Consulte principalmente IK y HanLP.
Admite caracteres chinos complejos . Algunos caracteres chinos tienen una longitud distinta de 1 en Java, como ?
, pero IK
y otros no los admiten.
Se admiten la segmentación y búsqueda de palabras de una sola palabra , pero no el modo ik_max_word
.
Admite la segmentación de palabras de longitud personalizada , adecuada para identificar nombres de personas en textos cortos.
La longitud del texto de los caracteres chinos
<=autoWordLength
separados por espacios, signos de puntuación, letras, números, etc. se reconocerán automáticamente como una sola palabra.
Soporte de búsqueda de emojis
Comparado con IK, es más inteligente y preciso que IK.
ik_max_word
enumera exhaustivamente todas las palabras posibles, lo que da como resultado que se encuentren algunas búsquedas irrelevantes. La任性冲动过
resulta任性性冲动动过
, por lo que al buscar "性冲动
se buscará este documento.南京市长江大桥
, el resultado es南京市市长长江大桥
, luego la búsqueda市长
buscará este documento, pero el segmentador de palabras hao no Calcula la ruta más corta a través de la frecuencia de las palabras e identifica la frase con la mayor probabilidad. También puedes ajustar la frecuencia de las palabras según tu propia escena.El resultado de la segmentación de palabras de ik_smart no es un subconjunto de ik_max_word, y el resultado de la segmentación de palabras de hao_search_mode es un subconjunto del resultado de la segmentación de palabras de hao_index_mode
En comparación con HanLp, es más liviano y más controlable en la segmentación de palabras . No tiene algunas funciones de predicción inteligentes, como nombres, lo que puede provocar una segmentación de palabras inestable e inexacta. El aprendizaje automático tiene diferentes resultados de predicción para textos largos y cortos. y los resultados previstos de la segmentación de palabras también son diferentes. Y HanLP no tiene un complemento ES oficial.
Calcule la ruta más corta según la frecuencia de las palabras y enumere las palabras posibles en lugar de todas las palabras. Si las palabras enumeradas son incorrectas, puede ajustar la frecuencia de las palabras para corregirlas. El archivo de frecuencia de palabras es un archivo txt
con mejor legibilidad .
Se admiten metapalabras. Por ejemplo,俄罗斯
ya no se dividirá en俄
y罗斯
(罗斯
es un nombre personal común). De esta manera罗斯
no recuperará documentos relacionados con俄罗斯
Pero parte del discurso no es compatible.
Proporcionar analizador: hao_search_mode
, hao_index_mode
Tokenizador: hao_search_mode
, hao_index_mode
etiqueta git | versión ES |
---|---|
maestro | ES última versión estable |
v7.17.1 | 7.17.1 |
vX.YZ | XYZ |
Método 1. bin/elasticsearch-plugin install file:///Users/xiaoming/Download/analysis-hao.zip
Método 2. Después de la descompresión, colóquelo en el directorio de complementos de es. Asegúrese de que tenga la siguiente estructura de directorio {ES_HOME}/plugins/analysis-hao/(各种jar等文件)
. Al mismo tiempo, el directorio no puede contener zip. archivos.
Finalmente reinicie ES
Si no necesita una versión ES correspondiente, debe modificar algunos lugares:
pom.xml
-> elasticsearch.version
a la versión correspondiente.HaoTokenizerFactory.java
. Finalmente, ejecute mvn clean package -Dmaven.test.skip=true
para obtener el paquete de instalación zip
del complemento.Los siguientes son los elementos de configuración disponibles para segmentadores de palabras personalizados:
Parámetros del elemento de configuración | Función | valor predeterminado |
---|---|---|
enableIndexMode | Ya sea que se utilice el modo de índice, el modo de índice es detallado. | hao_search_mode es false , hao_index_mode es true , la granularidad fina es adecuada para consultas de términos y la granularidad gruesa es adecuada para consultas de frases |
enableFallBack | Si se informa un error en la segmentación de palabras, si se debe iniciar la segmentación de palabras más detallada, es decir, la segmentación por caracteres. Se recomienda utilizar search_mode para no afectar la búsqueda del usuario. index_mode no se inicia para que las notificaciones de alarmas de error se puedan informar de manera oportuna. | false no comienza a degradar |
enableFailDingMsg | Ya sea para iniciar la notificación de falla de DingTalk, la dirección de notificación es el campo dingWebHookUrl de HttpAnalyzer.cfg.xml . | false |
enableSingleWord | Si se deben utilizar palabras devueltas detalladas. Por ejemplo,体力值 , el resultado de la segmentación de palabras solo almacena体力值 ,体力 , pero no el值 | false |
autoWordLength | El texto en caracteres chinos separado por espacios, signos de puntuación, letras, números, etc. cuya longitud sea menor que autoWordLength se reconocerá automáticamente como una sola palabra. El valor predeterminado -1 no está habilitado, >=2 se considera habilitado | -1 |
hao_index_mode
Las palabras se segmentarán de forma recursiva según los términos y pesos del vocabulario hasta que la palabra sea inseparable. Si se establece enableSingleWord=true
, se dividirá en palabras individuales.
Por ejemplo, este texto南京市长江大桥
南京市长江大桥
==>南京市
,长江大桥
南京市
==>南京
,市
,长江大桥
==>长江
,大桥
enableSingleWord=false
, la recursividad se detiene y la segmentación de palabras se obtiene como南京市
,南京
,市
,长江大桥
,长江
,大桥
enableSingleWord=true
, continúe la recursividad hasta la posición de una sola palabra y obtenga la segmentación de palabras como南京市
,南京
,南
,京
,市
大
长江大桥
, Yangtze River,长江
长
江
,大桥
,桥
hao_search_mode
En este modo, es equivalente al modo hao_index_mode
de forma recursiva solo una vez. El resultado de la segmentación de palabras es南京市
,长江大桥
. Debido a que enableIndexMode=false
en este modo, si se cambia a true
, tendrá el mismo efecto que hao_index_mode
.
parámetro | Función | Observación |
---|---|---|
baseDictionary | Nombre de archivo del diccionario básico | Colóquelo en el directorio config complemento o en el directorio config de es sin cambiarlo. |
customerDictionaryFile | Archivo de léxico remoto definido por el usuario, varios archivos separados por punto y coma en inglés; | Se almacenará en el directorio config complemento o en el directorio config de es. |
remoteFreqDict | Archivo de vocabulario remoto definido por el usuario | Conveniente actualización en caliente, la actualización en caliente se actualiza periódicamente a través de los dos parámetros siguientes. |
syncDicTime | La próxima hora de sincronización del diccionario remoto hh:mm:ss | Déjelo en blanco y use syncDicPeriodTime como la próxima hora de sincronización. |
syncDicPeriodTime | Intervalo de tiempo de sincronización remota del diccionario, segundos, valor mínimo 30 | Por ejemplo, syncDicTime=20:00:00,syncDicPeriodTime=86400 , se sincroniza a las 20 en punto todos los días |
dingWebHookUrl | URL del robot DingTalk | Se utiliza para excepciones de segmentación de palabras y notificaciones de excepción/éxito de tesauro de sincronización |
dingMsgContent | Redacción de notificaciones de robots | Tenga en cuenta que al configurar el robot DingTalk, las palabras clave deben coincidir con esta copia; de lo contrario, el mensaje no podrá enviarse. |
El directorio
{ES_HOME}/config/analysis-hao/
se lee primero y los archivos en{ES_HOME}/plugins/analysis-hao/config
no se leen.
base_dictionary.txt
, separado por comas, y el siguiente número indica la frecuencia de las palabras. Por ejemplo: el resultado de la segmentación de palabras de奋发图强
es奋
,发图
,强
. Debido a que la frecuencia de la palabra发图
es demasiado alta (debido a la gran cantidad de apariciones), puede reducir la frecuencia de la palabra y modificar manualmente base_dictionary.txt
archivo base_dictionary.txt
.customerDictionaryFile
actual se sobrescribirá automáticamente. El formato de archivo del léxico remoto es {词},{词频},{是否元词}
, por ejemplo,俄罗斯,1000,1
. Explicación de si es una metapalabra o no: 1
significa que es una metapalabra y no se dividirá más.俄罗斯
no se dividirá en俄
y罗斯
(Russ es un nombre común). De esta manera,罗斯
no recuperará documentos relacionados con俄罗斯
. 0
significa que puedes continuar rompiéndolo, como奋发图强
Índice de compilación:
PUT test/
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"search_analyzer": {
"filter": [
"lowercase"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "my_search_token"
},
"index_analyzer": {
"filter": [
"lowercase"
],
"char_filter": [
"html_strip"
],
"type": "custom",
"tokenizer": "my_index_token"
}
},
"tokenizer": {
"my_index_token": {
"enableFailDingMsg": "true",
"type": "hao_index_mode",
"enableSingleWord": "true",
"enableFallBack": "true",
"autoWordLength": 3
},
"my_search_token": {
"enableFailDingMsg": "true",
"type": "hao_search_mode",
"enableSingleWord": "true",
"enableFallBack": "true",
"autoWordLength": 3
}
}
},
"number_of_replicas": "0"
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"index_options": "offsets",
"analyzer": "index_analyzer",
"search_analyzer": "search_analyzer"
}
}
}
}
Prueba de segmentación de palabras
test/_analyze
{
"analyzer": "index_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
test/_analyze
{
"analyzer": "search_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
徐庆年
no está en el vocabulario, pero se reconoce como una palabra a través de autoWordLength
.