Плагин сегментации китайских слов elasticsearch.
Группа связи QQ: 743457803
Пожалуйста, обратитесь сюда, чтобы узнать, как разработать плагин сегментации слов ES.
В основном относятся к IK и HanLP
Поддерживает сложные китайские символы . Длина некоторых китайских символов в Java не равна единице , например ?
, но IK
и другие не поддерживают эту функцию.
Поддерживаются сегментация и поиск слов по одному слову , но режим ik_max_word
не поддерживается.
Поддерживает сегментацию слов произвольной длины , подходящую для идентификации имен людей в коротких текстах.
Длина текста китайских символов
<=autoWordLength
разделенная пробелами, знаками препинания, буквами, цифрами и т. д., будет автоматически распознаваться как слово.
Поддержка поиска смайлов
По сравнению с ИК он умнее и точнее ИК.
ik_max_word
исчерпывающе перечисляет все возможные слова, в результате чего обнаруживаются некоторые нерелевантные запросы.任性冲动过
任性性冲动动过
, поэтому поиск по слову «性冲动
приведет к поиску этого документа.南京市长江大桥
, результат —南京市市长长江大桥
, затем поиск市长
будет искать этот документ, но сегментатор слов hao не будет. Он вычисляет кратчайший путь по частоте слов и идентифицирует фразу с наибольшей вероятностью. Вы также можете настроить частоту слов по своему желанию в соответствии с вашей собственной сценой.Результат сегментации слова ik_smart не является подмножеством ik_max_word, а результат сегментации слова hao_search_mode является подмножеством результата сегментации слова hao_index_mode.
По сравнению с HanLp, он легче и более управляем при сегментации слов . Он не имеет некоторых интеллектуальных функций прогнозирования, таких как имена, что может привести к нестабильной и неточной сегментации слов. Машинное обучение дает разные результаты прогнозирования для длинных и коротких текстов. и предсказанные результаты сегментации слов также различаются. А у HanLP нет официального плагина ES.
Рассчитайте кратчайший путь на основе частоты слов и перечислите возможные слова вместо всех слов. Если перечисленные слова неверны, вы можете настроить частоту слов, чтобы исправить это. Файл частоты слов представляет собой txt
файл с лучшей читаемостью .
Поддерживаются метаслова, например,俄罗斯
больше не будет делиться на俄
и罗斯
(罗斯
— общее личное имя). Таким образом,罗斯
не будет отзывать документы, связанные с俄罗斯
Но часть речи не поддерживается
Предоставить анализатор: hao_search_mode
, hao_index_mode
Токенизатор: hao_search_mode
, hao_index_mode
Git-тег | ES-версия |
---|---|
владелец | Последняя стабильная версия ES |
v7.17.1 | 7.17.1 |
vX.YZ | XYZ |
Способ 1. bin/elasticsearch-plugin install file:///Users/xiaoming/Download/analysis-hao.zip
Способ 2. После распаковки поместите его в каталог плагинов es. Убедитесь, что это следующая структура каталогов {ES_HOME}/plugins/analysis-hao/(各种jar等文件)
. При этом каталог не может содержать zip. файлы.
Наконец перезапустите ES
Если соответствующей версии ES, которая вам нужна, нет, вам необходимо изменить несколько мест:
pom.xml
-> elasticsearch.version
на соответствующую версию.HaoTokenizerFactory.java
. Наконец, выполните mvn clean package -Dmaven.test.skip=true
, чтобы получить установочный zip
пакет подключаемого модуля.Ниже приведены элементы конфигурации, доступные для пользовательских сегментаторов слов:
Параметры элемента конфигурации | Функция | значение по умолчанию |
---|---|---|
enableIndexMode | Использовать ли индексный режим, индексный режим является мелкозернистым. | hao_search_mode имеет значение false , hao_index_mode имеет true , мелкая детализация подходит для терминального запроса, а грубая детализация подходит для фразового запроса. |
enableFallBack | Если сообщается об ошибке при сегментации слов, следует ли запускать наиболее детальную сегментацию слов, то есть сегментацию по символам. Рекомендуется использовать search_mode , чтобы не влиять на поиск пользователя. index_mode не запускается, чтобы можно было своевременно сообщать об уведомлениях об ошибках. | false не запускает понижение версии |
enableFailDingMsg | Запускать ли уведомление об ошибке DingTalk, адрес уведомления — это поле dingWebHookUrl в HttpAnalyzer.cfg.xml . | false |
enableSingleWord | Использовать ли детализированные возвращаемые слова. Например,体力值 , результат сегментации слов сохраняет только体力值 ,体力 , но не值 | false |
autoWordLength | Текст китайских символов, разделенный пробелами, знаками препинания, буквами, цифрами и т. д., длина которого меньше autoWordLength будет автоматически распознан как одно слово. По умолчанию -1 не включено, >=2 считается включенным. | -1 |
hao_index_mode
Слова будут рекурсивно сегментироваться на основе терминов и весов словаря до тех пор, пока слово не станет неразделимым. Если установлено enableSingleWord=true
, оно будет разделено на отдельные слова.
Например, этот текст南京市长江大桥
南京市长江大桥
==>南京市
,长江大桥
南京市
==>南京
,市
,长江大桥
==>长江
,大桥
enableSingleWord=false
, рекурсия останавливается и получаются сегменты слов:南京市
,南京
,市
,长江大桥
,长江
,大桥
enableSingleWord=true
, продолжите рекурсию до позиции одного слова и получите сегментацию слова как南京市
,南京
,南
,京
,市
,长江大桥
,长江
,长
江
,大桥
,大
桥
hao_search_mode
В этом режиме он рекурсивно эквивалентен режиму hao_index_mode
только один раз. Результатом сегментации слов является南京市
,长江大桥
. Поскольку в этом режиме enableIndexMode=false
, если его изменить на true
, это будет иметь тот же эффект, что и hao_index_mode
.
параметр | Функция | Примечание |
---|---|---|
baseDictionary | Имя файла основного словаря | Поместите его в каталог config подключаемого модуля или в каталог config es, не меняя его. |
customerDictionaryFile | Определяемый пользователем файл удаленного словаря, несколько файлов, разделенных английской точкой с запятой; | Он будет храниться в каталоге config плагина или каталоге es config . |
remoteFreqDict | Удаленный файл словаря, определяемый пользователем | Удобное горячее обновление, горячее обновление регулярно обновляется по следующим двум параметрам. |
syncDicTime | Время следующей синхронизации удаленного словаря hh:mm:ss | Оставьте это поле пустым и используйте syncDicPeriodTime в качестве следующего времени синхронизации. |
syncDicPeriodTime | Интервал синхронизации удаленного словаря, секунды, минимальное значение 30 | Например, syncDicTime=20:00:00,syncDicPeriodTime=86400 , синхронизируется в 20 часов каждый день. |
dingWebHookUrl | URL-адрес робота DingTalk | Используется для исключений сегментации слов и уведомлений об исключениях/успехах тезауруса синхронизации. |
dingMsgContent | Копирайтинг уведомлений для роботов | Обратите внимание, что при настройке робота DingTalk ключевые слова должны соответствовать этому экземпляру, иначе сообщение не будет отправлено. |
Каталог
{ES_HOME}/config/analysis-hao/
считывается первым, а файлы в каталоге{ES_HOME}/plugins/analysis-hao/config
не читаются.
base_dictionary.txt
, разделенный запятыми, а следующее число указывает частоту слова. Например: результатом сегментации слов奋发图强
является奋
,发图
,强
, поскольку частота слов слова发图
слишком высока (из-за большого количества вхождений), вы можете уменьшить частоту слов и вручную изменить base_dictionary.txt
файл.customerDictionaryFile
будет автоматически перезаписан. Формат файла удаленного словаря — {词},{词频},{是否元词}
, например,俄罗斯,1000,1
. Пояснение, метаслово это или нет: 1
означает, что это метаслово и дальше делиться не будет.俄罗斯
не будет делиться на俄
и罗斯
(Русь - общее имя). Таким образом,罗斯
не будет отзывать документы, связанные с俄罗斯
. 0
означает, что вы можете продолжать разрушать его, например,奋发图强
Индекс сборки:
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"
}
}
}
}
Тестовая сегментация слов
test/_analyze
{
"analyzer": "index_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
test/_analyze
{
"analyzer": "search_analyzer",
"text": "徐庆年 奋发图强打篮球有利于提高人民生活,有的放矢,中华人民共和国家庭宣传委员会宣。?"
}
徐庆年
отсутствует в словаре, но распознается как слово с помощью autoWordLength
.