Ein Elasticsearch-Plug-in zur Segmentierung chinesischer Wörter.
QQ-Kommunikationsgruppe: 743457803
Hier erfahren Sie , wie Sie ein ES-Wortsegmentierungs-Plug-in entwickeln.
Bezieht sich hauptsächlich auf IK und HanLP
Unterstützt komplexe chinesische Zeichen . Einige chinesische Zeichen haben in Java eine andere Länge als 1 ?
aber IK
und andere unterstützen sie nicht.
Die Wortsegmentierung und -suche nach einzelnen Wörtern wird unterstützt, ik_max_word
Modus wird jedoch nicht unterstützt.
Unterstützt die Segmentierung benutzerdefinierter Wortlängen und eignet sich zur Identifizierung von Personennamen in kurzen Texten.
Durch Leerzeichen, Satzzeichen, Buchstaben, Zahlen usw. getrennter Text mit chinesischen Schriftzeichen
<=autoWordLength
wird automatisch als ein Wort erkannt.
Unterstützt die Emoji-Suche
Im Vergleich zu IK ist es intelligenter und genauer als IK.
ik_max_word
listet beispielsweise alle möglichen Wörter umfassend auf, was dazu führt, dass einige irrelevante Suchanfragen gefunden werden. Es stellt sich heraus, dass das任性冲动过
任性性冲动动过
. Wenn Sie also nach „性冲动
suchen, wird nach diesem Dokument gesucht.南京市长江大桥
, das Ergebnis ist南京市市长长江大桥
, dann sucht die Suche nach市长
nach diesem Dokument, der Hao-Wortsegmentierer jedoch nicht. Er berechnet den kürzesten Weg durch die Worthäufigkeit und identifiziert die Phrase mit der höchsten Wahrscheinlichkeit. Sie können die Worthäufigkeit auch nach Belieben an Ihre eigene Szene anpassen.Das Wortsegmentierungsergebnis von ik_smart ist keine Teilmenge von ik_max_word, und das Wortsegmentierungsergebnis von hao_search_mode ist eine Teilmenge des Wortsegmentierungsergebnisses von hao_index_mode
Im Vergleich zu HanLp ist die Wortsegmentierung leichter und kontrollierbarer . Es verfügt nicht über einige intelligente Vorhersagefunktionen wie Namen, was zu einer instabilen und ungenauen Wortsegmentierung führen kann. und die vorhergesagten Ergebnisse der Wortsegmentierung sind ebenfalls unterschiedlich. Und HanLP verfügt nicht über ein offizielles ES-Plugin.
Berechnen Sie den kürzesten Weg basierend auf der Worthäufigkeit und zählen Sie mögliche Wörter anstelle aller Wörter auf. Wenn die aufgezählten Wörter falsch sind, können Sie die Worthäufigkeit anpassen, um sie zu korrigieren. Die Worthäufigkeitsdatei ist eine txt
Datei mit besserer Lesbarkeit .
Metawörter werden unterstützt. Beispielsweise wird俄罗斯
nicht mehr in俄
und罗斯
aufgeteilt (罗斯
ist ein gebräuchlicher Personenname). Auf diese Weise ruft罗斯
keine Dokumente mit Bezug zu俄罗斯
zurück
Die Wortart wird jedoch nicht unterstützt
Stellen Sie einen Analysator bereit: hao_search_mode
, hao_index_mode
Tokenizer: hao_search_mode
, hao_index_mode
Git-Tag | ES-Version |
---|---|
Master | ES neueste stabile Version |
v7.17.1 | 7.17.1 |
vX.YZ | XYZ |
Methode 1. bin/elasticsearch-plugin install file:///Users/xiaoming/Download/analysis-hao.zip
Methode 2. Platzieren Sie es nach der Dekomprimierung im es-Plugins-Verzeichnis. Stellen Sie sicher, dass es sich um die folgende Verzeichnisstruktur handelt {ES_HOME}/plugins/analysis-hao/(各种jar等文件)
. Dateien.
Starten Sie abschließend ES neu
Wenn Sie keine entsprechende ES-Version benötigen, müssen Sie einige Stellen ändern:
pom.xml
-> elasticsearch.version
auf die entsprechende Version.HaoTokenizerFactory.java
geben. Führen Sie abschließend mvn clean package -Dmaven.test.skip=true
aus, um das zip
Installationspaket des Plug-Ins abzurufen.Die folgenden Konfigurationselemente sind für benutzerdefinierte Wortsegmentierer verfügbar:
Konfigurationselementparameter | Funktion | Standardwert |
---|---|---|
enableIndexMode | Ob der Indexmodus verwendet werden soll, der Indexmodus ist feinkörnig. | hao_search_mode ist false , hao_index_mode ist true , feine Granularität ist für Begriffsabfragen geeignet und grobe Granularität ist für Phrasenabfragen geeignet |
enableFallBack | Wenn bei der Wortsegmentierung ein Fehler gemeldet wird, wird angegeben, ob die feinkörnige Wortsegmentierung gestartet werden soll, d. h. die Segmentierung nach Zeichen. Es wird empfohlen, search_mode zu verwenden, um die Benutzersuche nicht zu beeinträchtigen. index_mode wird nicht gestartet, damit Fehleralarmbenachrichtigungen rechtzeitig gemeldet werden können. | false startet kein Downgrade |
enableFailDingMsg | Ob die DingTalk-Benachrichtigung über einen Fehler gestartet werden soll, die Benachrichtigungsadresse ist das Feld dingWebHookUrl von HttpAnalyzer.cfg.xml . | false |
enableSingleWord | Ob feinkörnige zurückgegebene Wörter verwendet werden sollen. Beispielsweise speichert das Ergebnis der Wortsegmentierung nur体力值 体力值 体力 , aber nicht den值 | false |
autoWordLength | Durch Leerzeichen, Satzzeichen, Buchstaben, Zahlen usw. getrennter Text mit chinesischen Schriftzeichen, dessen Länge kürzer als autoWordLength ist, wird automatisch als ein Wort erkannt. Standardmäßig ist -1 nicht aktiviert, >=2 gilt als aktiviert | -1 |
hao_index_mode
Wörter werden rekursiv basierend auf den Begriffen und Gewichtungen des Vokabulars segmentiert, bis das Wort untrennbar ist. Wenn enableSingleWord=true
gesetzt ist, wird es in einzelne Wörter aufgeteilt.
Zum Beispiel dieser Text南京市长江大桥
南京市长江大桥
==>南京市
,长江大桥
南京市
==>南京
,市
,长江大桥
==>长江
,大桥
enableSingleWord=false
ist, stoppt die Rekursion und die Wortsegmentierung wird als南京市
,南京
,市
,长江大桥
,长江
,大桥
erhaltenenableSingleWord=true
ist, setzen Sie die Rekursion bis zur Einzelwortposition fort und erhalten Sie die Wortsegmentierung als南京市
,南京
,南
,京
,市
大
长江大桥
, Yangtze River,长江
长
江
,大桥
,桥
hao_search_mode
In diesem Modus entspricht er nur einmal rekursiv dem hao_index_mode
-Modus. Das Ergebnis der Wortsegmentierung ist南京市
,长江大桥
. Da in diesem Modus enableIndexMode=false
in true
geändert wird, hat es den gleichen Effekt wie hao_index_mode
.
Parameter | Funktion | Bemerkung |
---|---|---|
baseDictionary | Grundlegender Name der Wörterbuchdatei | Platzieren Sie es im Plug-in config oder im es config , ohne es zu ändern. |
customerDictionaryFile | Benutzerdefinierte Remote-Lexikondatei, mehrere Dateien durch englisches Semikolon getrennt; | Es wird im Plug-in config oder im es config gespeichert. |
remoteFreqDict | Remote-benutzerdefinierte Vokabeldatei | Praktisches Hot-Update: Hot-Update wird regelmäßig über die folgenden zwei Parameter aktualisiert. |
syncDicTime | Die nächste Synchronisierungszeit des Remote-Wörterbuchs hh:mm:ss | Lassen Sie es leer und verwenden Sie syncDicPeriodTime als nächste Synchronisierungszeit. |
syncDicPeriodTime | Zeitintervall für die Synchronisierung des Remote-Wörterbuchs, Sekunden, Mindestwert 30 | Beispiel: syncDicTime=20:00:00,syncDicPeriodTime=86400 , es wird jeden Tag um 20 Uhr synchronisiert |
dingWebHookUrl | DingTalk-Roboter-URL | Wird für Wortsegmentierungsausnahmen und Synchronisierungsthesaurus-Ausnahme-/Erfolgsbenachrichtigungen verwendet |
dingMsgContent | Texterstellung für Roboterbenachrichtigungen | Beachten Sie, dass bei der Konfiguration des DingTalk-Roboters die Schlüsselwörter mit dieser Kopie übereinstimmen müssen, da sonst die Nachricht nicht gesendet werden kann. |
Das Verzeichnis
{ES_HOME}/config/analysis-hao/
wird zuerst gelesen und die Dateien im Verzeichnis{ES_HOME}/plugins/analysis-hao/config
werden nicht gelesen.
base_dictionary.txt
, durch Kommas getrennt, und die folgende Zahl gibt die Worthäufigkeit an. Beispiel: Das Ergebnis der Wortsegmentierung von奋发图强
ist奋
,发图
,强
. Da die Worthäufigkeit des Wortes发图
zu hoch ist (aufgrund der hohen Häufigkeit), können Sie die Worthäufigkeit reduzieren und base_dictionary.txt
Datei.customerDictionaryFile
automatisch überschrieben. Das Dateiformat des Remote -Lexikons ist {词},{词频},{是否元词}
, zum Beispiel俄罗斯,1000,1
. Erklärung, ob es sich um ein Metawort handelt oder nicht: 1
bedeutet, dass es ein Metawort ist und nicht weiter aufgeteilt wird.俄罗斯
wird nicht in俄
und罗斯
aufgeteilt (Russ ist ein gebräuchlicher Name). Auf diese Weise wird罗斯
keine Dokumente mit Bezug zu俄罗斯
zurückrufen. 0
bedeutet, dass Sie es weiter abbauen können, indem Sie beispielsweise奋发图强
Build-Index:
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"
}
}
}
}
Testen Sie die Wortsegmentierung
test/_analyze
{
"analyzer": "index_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
test/_analyze
{
"analyzer": "search_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
徐庆年
ist nicht im Vokabular enthalten, wird aber über autoWordLength
als Wort erkannt.