Um plug-in de segmentação de palavras chinesas do elasticsearch.
Grupo de comunicação QQ: 743457803
Consulte aqui como desenvolver um plug-in de segmentação de palavras ES.
Consulte principalmente IK e HanLP
Suporta caracteres chineses complexos . Alguns caracteres chineses não têm comprimento 1 em Java, como ?
, mas IK
e outros não os suportam.
A segmentação e a pesquisa de palavras de uma única palavra são suportadas, mas o modo ik_max_word
não é suportado.
Suporta segmentação de palavras de comprimento personalizado , adequada para identificar nomes de pessoas em textos curtos.
O comprimento do texto em caracteres chineses
<=autoWordLength
separado por espaços, sinais de pontuação, letras, números, etc. será automaticamente reconhecido como uma palavra.
Suporte para pesquisa de emojis
Comparado com o IK, é mais inteligente e preciso que o IK.
ik_max_word
enumera exaustivamente todas as palavras possíveis, resultando na localização de algumas pesquisas irrelevantes. A任性冲动过
acabou任性性冲动动过
, portanto, pesquisar por "性冲动
procurará este documento.南京市长江大桥
, o resultado é南京市市长长江大桥
, então a busca pelo市长
irá procurar por este documento, mas o segmentador de palavras hao não. Ele calcula o caminho mais curto através da frequência da palavra e identifica a frase com maior probabilidade. Você também pode ajustar a frequência das palavras à vontade de acordo com sua própria cena.O resultado da segmentação de palavras de ik_smart não é um subconjunto de ik_max_word, e o resultado da segmentação de palavras de hao_search_mode é um subconjunto do resultado da segmentação de palavras de hao_index_mode
Comparado com o HanLp, é mais leve e mais controlável na segmentação de palavras . Ele não possui algumas funções de previsão inteligentes, como nomes, o que pode levar à segmentação de palavras instável e imprecisa. O aprendizado de máquina tem resultados de previsão diferentes para textos longos e curtos. e os resultados da segmentação de palavras previstas também são diferentes. E o HanLP não possui um plug-in ES oficial.
Calcule o caminho mais curto com base na frequência das palavras e enumere as palavras possíveis em vez de todas as palavras. Se as palavras txt
estiverem erradas , você pode ajustar a frequência das palavras para corrigi-las.
Metapalavras são suportadas, por exemplo,俄罗斯
não será mais dividida em俄
e罗斯
(罗斯
é um nome pessoal comum). Desta forma,罗斯
não recuperará documentos relacionados俄罗斯
Mas parte do discurso não é suportada
Fornece analisador: hao_search_mode
, hao_index_mode
Tokenizer: hao_search_mode
, hao_index_mode
Etiqueta Git | Versão ES |
---|---|
mestre | Versão estável mais recente do ES |
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. Após a descompactação, coloque-o no diretório es plugins. Certifique-se de que seja a seguinte estrutura de diretório {ES_HOME}/plugins/analysis-hao/(各种jar等文件)
. arquivos.
Finalmente reinicie o ES
Se não houver uma versão ES correspondente necessária, você precisará modificar alguns lugares:
pom.xml
-> elasticsearch.version
para a versão correspondente.HaoTokenizerFactory.java
. Por fim, execute mvn clean package -Dmaven.test.skip=true
para obter o pacote zip
de instalação do plug-in.A seguir estão os itens de configuração disponíveis para segmentadores de palavras personalizados:
Parâmetros do item de configuração | Função | valor padrão |
---|---|---|
enableIndexMode | Seja para usar o modo de índice, o modo de índice é refinado. | hao_search_mode é false , hao_index_mode é true , granularidade fina é adequada para consulta de termo e granularidade grossa é adequada para consulta de frase |
enableFallBack | Se for relatado um erro na segmentação de palavras, se deve iniciar a segmentação de palavras mais refinada, ou seja, segmentação por caracteres. Recomenda-se usar search_mode para não afetar a pesquisa do usuário. index_mode não é iniciado para que as notificações de alarme de erro possam ser relatadas em tempo hábil. | false não inicia o downgrade |
enableFailDingMsg | Para iniciar a notificação de falha do DingTalk, o endereço de notificação é o campo dingWebHookUrl de HttpAnalyzer.cfg.xml . | false |
enableSingleWord | Se devem ser usadas palavras retornadas refinadas. Por exemplo,体力值 , o resultado da segmentação de palavras armazena apenas体力值 ,体力 , mas não o值 | false |
autoWordLength | O texto em caracteres chineses separado por espaços, sinais de pontuação, letras, números, etc. cujo comprimento seja menor que autoWordLength será automaticamente reconhecido como uma palavra. Padrão -1 não está habilitado, >=2 é considerado habilitado | -1 |
hao_index_mode
As palavras serão segmentadas recursivamente com base nos termos e pesos do vocabulário até que a palavra seja inseparável. Se enableSingleWord=true
estiver definido, ele será dividido em palavras únicas.
Por exemplo, este texto南京市长江大桥
南京市长江大桥
==>南京市
,长江大桥
南京市
==>南京
,市
,长江大桥
==>长江
,大桥
enableSingleWord=false
, a recursão para e os segmentos de palavras obtidos são南京市
,南京
,市
,长江大桥
,长江
,大桥
enableSingleWord=true
, continue a recursão até a posição de uma única palavra e obtenha a segmentação da palavra como南京市
,南京
,南
,京
,市
,长江大桥
,长江
,长
江
,大桥
,大
桥
hao_search_mode
Neste modo, é equivalente ao modo hao_index_mode
recursivamente apenas uma vez. O resultado da segmentação de palavras é南京市
,长江大桥
. Como enableIndexMode=false
neste modo, se for alterado para true
, terá o mesmo efeito que hao_index_mode
.
parâmetro | Função | Observação |
---|---|---|
baseDictionary | Nome do arquivo do dicionário básico | Coloque-o no diretório config do plug-in ou no diretório es config sem alterá-lo. |
customerDictionaryFile | Arquivo de léxico remoto definido pelo usuário, vários arquivos separados por ponto e vírgula em inglês; | Ele será armazenado no diretório config do plug-in ou no diretório es config . |
remoteFreqDict | Arquivo de vocabulário remoto definido pelo usuário | Atualização a quente conveniente, a atualização a quente é atualizada regularmente por meio dos dois parâmetros a seguir. |
syncDicTime | O próximo horário de sincronização do dicionário remoto hh:mm:ss | Deixe em branco e use syncDicPeriodTime como o próximo horário de sincronização. |
syncDicPeriodTime | Intervalo de tempo de sincronização de dicionário remoto, segundos, valor mínimo 30 | Por exemplo, syncDicTime=20:00:00,syncDicPeriodTime=86400 , é sincronizado às 20 horas todos os dias |
dingWebHookUrl | URL do robô DingTalk | Usado para exceções de segmentação de palavras e notificações de exceção/sucesso do thesaurus de sincronização |
dingMsgContent | Redação de notificação de robô | Observe que ao configurar o robô DingTalk, as palavras-chave devem corresponder a esta cópia, caso contrário a mensagem não será enviada. |
O diretório
{ES_HOME}/config/analysis-hao/
é lido primeiro e os arquivos no diretório{ES_HOME}/plugins/analysis-hao/config
não são lidos.
base_dictionary.txt
, separado por vírgulas, e o número a seguir indica a frequência da palavra. Por exemplo: o resultado da segmentação de palavras de奋发图强
é奋
,发图
,强
, porque a frequência da palavra发图
é muito alta (devido ao alto número de ocorrências), você pode reduzir a frequência da palavra e modificar manualmente base_dictionary.txt
arquivo base_dictionary.txt
.customerDictionaryFile
atual será substituído automaticamente. O formato do arquivo do léxico remoto é {词},{词频},{是否元词}
, por exemplo,俄罗斯,1000,1
. Explicação se é uma metapalavra ou não: 1
significa que é uma metapalavra e não será mais dividida.俄罗斯
não será dividida em俄
e罗斯
(Russ é um nome comum). Desta forma,罗斯
não recuperará documentos relacionados俄罗斯
. 0
significa que você pode continuar a decompô-lo, como奋发图强
Índice de construção:
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"
}
}
}
}
Testar segmentação de palavras
test/_analyze
{
"analyzer": "index_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
test/_analyze
{
"analyzer": "search_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
徐庆年
não está no vocabulário, mas é reconhecido como uma palavra por meio de autoWordLength
.