nlp-hanzi-similar 为汉字提供相似性的计算。
有一位小伙伴说自己在做语言认知科学方向的课题研究,看了我以前写的 NLP 中文形近字相似度计算思路,就想问下有没有源码或者相关资料。
国内对于文本的相似度计算,开源的工具是比较丰富的。但是对于两个汉字之间的相似度计算,国内基本一片空白。国内的参考资料少得可怜,国外相关文档也是如此。
于是我将以前写的相似度算法整理开源,希望能帮到这位小伙伴。
本项目旨在抛砖引玉,实现一个基本的相似度计算工具,为汉字 NLP 贡献一点绵薄之力。
推荐阅读:
开源项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字相似度/markdown 目录
fluent 方法,一行代码搞定一切
高度自定义,允许用户定义自己的实现
词库自定义,适应各种应用场景
丰富的实现策略
默认实现了基于 四角编码+拼音+汉字结构+汉字偏旁+笔画数+拆字 的相似度比较。
jdk1.7+
maven 3.x+
<dependency> <groupId>com.github.houbb</groupId> <artifactId>nlp-hanzi-similar</artifactId> <version>1.4.0</version> </dependency>
HanziSimilarHelper.similar
获取两个汉字的相似度。
double rate1 = HanziSimilarHelper.similar('末', '未');
结果为:
0.9629629629629629
默认是根据 四角编码+拼音+汉字结构+汉字偏旁+笔画数 进行相似度比较。
如果默认的系统权重无法满足你的需求,你可以通过自定义权重调整:
double rate = HanziSimilarBs.newInstance() .jiegouRate(10) .sijiaoRate(8) .bushouRate(6) .bihuashuRate(2) .pinyinRate(1) .chaiziRate(8) .init() .similar('末', '未');
有些情况下,系统的计算是无法满足的。
用户可以在根目录下 hanzi_similar_define.txt
进行自定义。
入人 0.9
人入 0.9
这样在计算 人
和 入
的相似度时,会优先以用户自定义的为准。
double rate = HanziSimilarHelper.similar('人', '入');
此时的结果为用户自定义的值。
HanziSimilarHelper.similarList
可以返回指定汉字的相似列表,最多支持返回 100 个。
默认返回10个。
List<String> list = HanziSimilarHelper.similarList('爱'); Assert.assertEquals("[爰, 爯, 受, 爭, 妥, 憂, 李, 爳, 叐, 雙]", list.toString());
double rate = HanziSimilarBs.newInstance() // 笔画数数据 .bihuashuData(HanziSimilarDatas.bihuashu()) // 笔画数相似算法 .bihuashuSimilar(HanziSimilars.bihuashu()) // 笔画数权重 .bihuashuRate(HanziSimilarRateConst.BIAHUASHU) // 结构数据 .jiegouData(HanziSimilarDatas.jiegou()) // 结构相似算法 .jiegouSimilar(HanziSimilars.jiegou()) // 结构权重 .jiegouRate(HanziSimilarRateConst.JIEGOU) // 部首数据 .bushouData(HanziSimilarDatas.bushou()) // 部首相似算法 .bushouSimilar(HanziSimilars.bushou()) // 部首权重 .bushouRate(HanziSimilarRateConst.BUSHOU) // 四角数据 .sijiaoData(HanziSimilarDatas.sijiao()) // 四角相似算法 .sijiaoSimilar(HanziSimilars.sijiao()) // 四角权重 .sijiaoRate(HanziSimilarRateConst.SIJIAO) // 拼音权重 .pinyinRate(HanziSimilarRateConst.PINYIN) // 拼音相似算法 .pinyinSimilar(HanziSimilars.pinyin()) // 拆字权重 .chaiziRate(HanziSimilarRateConst.CHAIZI) // 拆字相似算法 .chaiziSimilar(HanziSimilars.chaizi()) // 初始化 .init() // 执行文本相似度对比 .similar('末', '未');
为了便于用户自定义,HanziSimilarBs
支持用户进行自定义配置。
HanziSimilarBs 中允许自定义的配置列表如下:
序号 | 属性 | 说明 |
---|---|---|
1 | bihuashuRate | 笔画数权重 |
2 | bihuashuData | 笔画数数据 |
3 | bihuashuSimilar | 笔画数相似度策略 |
4 | jiegouRate | 结构权重 |
5 | jiegouData | 结构数据 |
6 | jiegouSimilar | 结构相似度策略 |
7 | bushouRate | 部首权重 |
8 | bushouData |