如何在ICU分词器中自定义RBBI规则且不覆盖默认规则?
ICU分词器自定义规则覆盖默认规则问题解决方案
用户问题描述
尝试修改ICU分词器,使其遇到连字符等特定字符时不拆分文本为分词。已在SolrCloud中配置好自定义规则并可运行,但添加如下配置后:
"tokenizer": { "name": "icu", "rulefiles": "Latn:hyphen-preserving.rbbi" }
仅会应用该RBBI文件内的规则:
!!chain; $ALetter = [:L:]; $Numeric = [:N:]; $MidHyphen = [-]; $ALetter ($MidHyphen $ALetter)+ {200}; $Numeric ($MidHyphen $Numeric)+ {200};
其他默认规则均被舍弃,导致分词结果严重偏差。询问是否有可适配的默认RBBI文件,或是否存在仅覆盖特定RBBI规则的方法。
解决方案
1. 在自定义规则中引入默认RBBI规则
ICU RBBI规则支持通过!!include指令引入其他规则文件,你可以在自定义规则开头先加载默认的拉丁语系规则文件Latn:rbbi,再添加自己的连字符保留规则。这样既保留默认分词逻辑,又能覆盖特定场景的规则。
修改后的hyphen-preserving.rbbi规则示例:
!!include Latn:rbbi; !!chain; $ALetter = [:L:]; $Numeric = [:N:]; $MidHyphen = [-]; $ALetter ($MidHyphen $ALetter)+ {200}; $Numeric ($MidHyphen $Numeric)+ {200};
2. 理解规则优先级
RBBI规则的匹配优先级遵循两个原则:
- 后定义的规则优先于先定义的规则:因为你在默认规则之后添加了自定义规则,所以当文本同时符合默认规则和自定义规则时,会优先使用你的规则。
- 更长的匹配模式优先:你的规则匹配的是带连字符的连续字母/数字序列,比默认的单个字母/数字匹配更长,所以会优先命中,从而避免拆分带连字符的文本。
3. 查看默认RBBI规则内容(可选)
如果需要基于默认规则做更细致的修改,可以找到Solr依赖的icu4j-*.jar包,解压后在com/ibm/icu/impl/data/rbbi/目录下找到对应语言的默认规则文件(比如Latn.rbbi),参考其中的规则逻辑来调整自定义规则。
内容的提问来源于stack exchange,提问作者miran80
相关产品推荐
相关产品推荐

