Un plug-in de segmentation de mots chinois elasticsearch.
Groupe de communication QQ : 743457803
Veuillez vous référer ici pour savoir comment développer un plug-in de segmentation de mots ES.
Se réfère principalement à IK et HanLP
Prend en charge les caractères chinois complexes . Certains caractères chinois n'ont pas une longueur de 1 en Java, comme ?
, mais IK
et d'autres ne le prennent pas en charge.
La segmentation et la recherche de mots en un seul mot sont prises en charge, mais le mode ik_max_word
n'est pas pris en charge.
Prend en charge la segmentation de mots de longueur personnalisée , adaptée à l'identification des noms de personnes dans des textes courts.
La longueur du texte en caractères chinois
<=autoWordLength
séparé par des espaces, des signes de ponctuation, des lettres, des chiffres, etc. sera automatiquement reconnue comme un mot.
Prise en charge de la recherche emoji
Comparé à IK, il est plus intelligent et plus précis que IK.
ik_max_word
énumère de manière exhaustive tous les mots possibles, ce qui entraîne la conclusion de recherches non pertinentes. Le任性冲动过
s'avère任性性冲动动过
, donc la recherche de «性冲动
recherchera ce document.南京市长江大桥
, le résultat est南京市市长长江大桥
, puis la recherche市长
recherchera ce document, mais le segmenteur de mots hao ne le fera pas. Il calcule le chemin le plus court à travers la fréquence des mots et identifie la phrase avec la probabilité la plus élevée. Vous pouvez également ajuster la fréquence des mots à volonté en fonction de votre propre scène.Le résultat de segmentation de mots de ik_smart n'est pas un sous-ensemble de ik_max_word, et le résultat de segmentation de mots de hao_search_mode est un sous-ensemble du résultat de segmentation de mots de hao_index_mode.
Comparé à HanLp, il est plus léger et plus contrôlable dans la segmentation des mots . Il ne dispose pas de certaines fonctions de prédiction intelligentes telles que les noms, ce qui peut conduire à une segmentation de mots instable et inexacte. L'apprentissage automatique a des résultats de prédiction différents pour les textes longs et courts. et les résultats prédits de la segmentation des mots sont également différents. Et HanLP n'a pas de plug-in ES officiel.
Calculez le chemin le plus court en fonction de la fréquence des mots et énumérez les mots possibles au lieu de tous les mots. Si les mots énumérés sont erronés, vous pouvez ajuster la fréquence des mots pour la corriger. Le fichier de fréquence des mots est un fichier txt
avec une meilleure lisibilité .
Les méta-mots sont pris en charge, par exemple,俄罗斯
ne sera plus divisée en俄
et罗斯
(罗斯
est un nom personnel courant). De cette façon,罗斯
ne rappellera pas les documents liés俄罗斯
.
Mais une partie du discours n'est pas prise en charge
Fournir un analyseur : hao_search_mode
, hao_index_mode
Tokenizer : hao_search_mode
, hao_index_mode
Balise Git | Version ES |
---|---|
maître | ES dernière version stable |
v7.17.1 | 7.17.1 |
vX.YZ | XYZ |
Méthode 1. bin/elasticsearch-plugin install file:///Users/xiaoming/Download/analysis-hao.zip
Méthode 2. Après la décompression, placez-le dans le répertoire es plugins. Assurez-vous qu'il s'agit de la structure de répertoire suivante {ES_HOME}/plugins/analysis-hao/(各种jar等文件)
. fichiers.
Enfin, redémarrez ES
Si vous n'avez pas besoin de la version ES correspondante, vous devez modifier quelques endroits :
pom.xml
-> elasticsearch.version
vers la version correspondante.HaoTokenizerFactory.java
. Enfin, exécutez mvn clean package -Dmaven.test.skip=true
pour obtenir le package d'installation zip
du plug-in.Voici les éléments de configuration disponibles pour les segmenteurs de mots personnalisés :
Paramètres des éléments de configuration | Fonction | valeur par défaut |
---|---|---|
enableIndexMode | Que ce soit pour utiliser le mode index, le mode index est précis. | hao_search_mode est false , hao_index_mode est true , la granularité fine convient à la requête de terme et la granularité grossière convient à la requête d'expression. |
enableFallBack | Si une erreur est signalée lors de la segmentation des mots, indiquez s'il faut démarrer la segmentation des mots la plus fine, c'est-à-dire la segmentation par caractères. Il est recommandé d'utiliser search_mode afin de ne pas affecter la recherche des utilisateurs. index_mode n'est pas démarré afin que les notifications d'alarme d'erreur puissent être signalées en temps opportun. | false ne démarre pas la rétrogradation |
enableFailDingMsg | S'il faut démarrer la notification d'échec DingTalk, l'adresse de notification est le champ dingWebHookUrl de HttpAnalyzer.cfg.xml . | false |
enableSingleWord | S'il faut utiliser des mots renvoyés à granularité fine. Par exemple,体力值 , le résultat de la segmentation des mots stocke uniquement体力值 ,体力 , mais pas la值 | false |
autoWordLength | Le texte en caractères chinois séparés par des espaces, des signes de ponctuation, des lettres, des chiffres, etc. dont la longueur est inférieure à autoWordLength sera automatiquement reconnu comme un seul mot. Par défaut -1 n'est pas activé, >=2 est considéré comme activé | -1 |
hao_index_mode
Les mots seront segmentés de manière récursive en fonction des termes et des poids du vocabulaire jusqu'à ce que le mot soit inséparable. Si enableSingleWord=true
est défini, il sera divisé en mots simples.
Par exemple, ce texte南京市长江大桥
南京市长江大桥
==>南京市
,长江大桥
南京市
==>南京
,市
,长江大桥
==>长江
,大桥
enableSingleWord=false
, la récursion s'arrête et les segments de mots obtenus sont南京市
,南京
,市
,长江大桥
,长江
,大桥
enableSingleWord=true
, continuez la récursion jusqu'à la position du mot unique et obtenez la segmentation du mot comme南京市
,南京
,南
,京
,市
,长江大桥
,长江
,长
江
,大桥
,大
桥
hao_search_mode
Dans ce mode, il équivaut au mode hao_index_mode
récursivement une seule fois. Le résultat de la segmentation des mots est南京市
,长江大桥
. Parce que enableIndexMode=false
dans ce mode, s'il est modifié en true
, cela aura le même effet que hao_index_mode
.
paramètre | Fonction | Remarque |
---|---|---|
baseDictionary | Nom du fichier du dictionnaire de base | Placez-le dans le répertoire config du plug-in ou dans le répertoire es config sans le modifier. |
customerDictionaryFile | Fichier de lexique distant défini par l'utilisateur, plusieurs fichiers séparés par un point-virgule anglais ; | Il sera stocké dans le répertoire config du plug-in ou dans le répertoire es config . |
remoteFreqDict | Fichier de vocabulaire défini par l'utilisateur à distance | Mise à jour à chaud pratique, la mise à jour à chaud est mise à jour régulièrement via les deux paramètres suivants. |
syncDicTime | La prochaine heure de synchronisation du dictionnaire distant hh:mm:ss | Laissez-le vide et utilisez syncDicPeriodTime comme prochaine heure de synchronisation. |
syncDicPeriodTime | Intervalle de temps de synchronisation du dictionnaire distant, secondes, valeur minimale 30 | Par exemple, syncDicTime=20:00:00,syncDicPeriodTime=86400 , il est synchronisé à 20 heures tous les jours |
dingWebHookUrl | URL du robot DingTalk | Utilisé pour les exceptions de segmentation de mots et les notifications d'exception/succès du thésaurus de synchronisation |
dingMsgContent | Rédaction de notifications de robots | Notez que lors de la configuration du robot DingTalk, les mots-clés doivent correspondre à cette copie, sinon le message ne pourra pas être envoyé. |
Le répertoire
{ES_HOME}/config/analysis-hao/
est lu en premier et les fichiers du répertoire{ES_HOME}/plugins/analysis-hao/config
ne sont pas lus.
base_dictionary.txt
, séparé par des virgules, et le numéro suivant indique la fréquence des mots. Par exemple : le résultat de la segmentation des mots de奋发图强
est奋
,发图
,强
, car la fréquence du mot发图
est trop élevée (en raison du nombre élevé d'occurrences), vous pouvez réduire la fréquence des mots et modifier manuellement base_dictionary.txt
fichier base_dictionary.txt
.customerDictionaryFile
actuel sera automatiquement écrasé. Le format de fichier du lexique distant est {词},{词频},{是否元词}
, par exemple,俄罗斯,1000,1
. Explication s'il s'agit d'un méta-mot ou non : 1
signifie que c'est un méta-mot et qu'il ne sera pas divisé davantage俄
俄罗斯
罗斯
(Russ est un nom commun). De cette manière,罗斯
ne mémorisera pas les documents liés俄罗斯
. 0
signifie que vous pouvez continuer à le briser, par exemple奋发图强
Indice de construction :
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"
}
}
}
}
Tester la segmentation des mots
test/_analyze
{
"analyzer": "index_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
test/_analyze
{
"analyzer": "search_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
徐庆年
ne fait pas partie du vocabulaire, mais est reconnu comme un mot via autoWordLength
.