1、分析为啥不支持多音字
拼音分词器的拼音解析部分是适用的nlp-lang1.7.jar,默认是不支持多音字的,从代码层面跟踪拼音插件调用链路,涉及代码如下:
不支持多音的原因就在于如下代码(直接去多音字的第一个):
2、分析如果改造成支持多音字
为了不影响原”pinyin“类型和为了后期的版本更新,决定再新建一个跟”pinyin“类似的type,命名为”multi_pinyin“。
3、实现步骤
3.1、多音字转换工具类实现
参考PinyinUtil工具类改造一个MultiPinyinUtil工具类。
修改点如下:
-
取消构造方法里面的带音标的中文&拼音字典映射。
因为在搜索引擎不需要用到带音标的拼音,所以可以把带音标的取消掉。
-
加载”pinyin.txt“文件时,直接把拼音后面的音调去掉,避免每次拼音转换时删除音调。
- 执行convert转换时,修改如下代码,让多音字转换为,长 -> “chang zhang”
3.2、MultiPinyinTokenFilter实现
参考PinyinTokenFilter实现MultiPinyinTokenFilter。
- 修改readTerm()方法
将原来的拼音转换方法多音字转换方法.
- 将识别为多音字”zhang chang“按空格分隔,添加到分词表中
- 取消两个汉字拼音连接在一起
3.3、创建MultiPinyinTokenFilterFactory类
3.5、注册多音字filterFactory
4、多音字分词插件使用
4.1、多音字filter定义
"multi_pinyin_filter":
{
"keep_joined_full_pinyin": "true",
"lowercase": "true",
"keep_original": "true",
"remove_duplicated_term": "true",
"keep_separate_first_letter": "true",
"type": "multi_pinyin",
"limit_first_letter_length": "50",
"keep_full_pinyin": "true"
}
4.2、多音字analyzer定义
"multi_pinyin_analyzer":
{
"filter":
[
"multi_pinyin_filter",
"lowercase"
],
"tokenizer": "standard"
}
4.3、分词效果
GET test/_analyze
{
"analyzer": "multi_pinyin_analyzer",
"text": ["重庆重启"]
}
个人学习笔记,仅做参考。