NLP中文近词相似度算法的开源实现
创作目的
有朋友说他在做语言认知科学方向的研究,看了我之前写的NLP中文形态相似度计算思路。
我只是想问一下有没有源码或者相关资料。
在国内,文本相似度计算的开源工具比较丰富。
但对于两个汉字之间相似度的计算,国内基本上是空白。国内参考资料很少,国外相关文献也很少。
于是我把之前写的相似度算法整理成开源的,希望能帮助到这位小朋友。
本项目旨在启发大家,实现一个基本的相似度计算工具,为汉字自然语言处理做出一点贡献。
特性
流畅的方法,一行代码让一切都高度可定制,允许用户定义自己的自定义实现词库,以适应各种应用场景。默认基于四角编码+拼音+汉字结构+汉字部首+笔画数相似度比较实现丰富的实现策略。
变更日志
变更日志
快速开始
需要
jdk1.7+
行家3.x+
maven 引入
dependency groupIdcom.github.houbb/groupId artifactIdnlp-hanzi-similar/artifactId version1.0.0/version/dependency
快速开始
基本用法
HanziSimilarHelper.similar 获取两个汉字的相似度。
doublerate1=HanziSimilarHelper.similar(‘End’, ‘Wei’);结果为:
0.9629629629629629
自定义权重
默认根据四角编码+拼音+汉字结构+汉字部首+笔画数进行相似度比较。
如果默认的系统权重不能满足您的需求,您可以调整自定义权重:
双倍率=HanziSimilarBs.newInstance() .jiegouRate(10) .sijiaoRate(8) .bushouRate(6) .bihuashuRate(2) .pinyinRate(1) .similar(‘End’, ‘Wei’);
自定义相似度
在某些情况下,无法满足系统的计算。
用户可以在根目录下的hanzi_similar_define.txt中进行自定义。
Enter person 0.9 person Enter 0.9 这样,在计算person和enter的相似度时,会优先考虑用户自定义的。
double rates=HanziSimilarHelper.similar(‘人’, ‘ENT’);此时的结果是用户自定义的值。
引导类
说明
为了方便用户定制,HanziSimilarBs 支持用户自定义配置。
HanziSimilarBs 允许的可自定义配置列表如下:
序列号
财产
阐明
1
碧华树率
笔划数粗细
2
笔画数数据
划数数据
3
碧华书类似
笔画相似度策略
4
结购率
结构重量
5
街购数据
结构化数据
6
jiegou类似
结构相似策略
7
武首率
激进的重量
8
武手数据
激进的数据
9
武手类似
激进的相似策略
10
四角率
四角编码权重
12
四角数据
四角编码数据
13
sijiao类似
四角点编码相似度策略
14
拼音率
拼音重量
15
拼音数据
拼音数据
16
拼音类似
拼音相似策略
17 号
汉字类似
汉字相似度核心策略
18
用户定义数据
用户定义数据
所有配置都可以根据界面进行定制。
快速体验
说明
如果Java语言不是您的主要开发语言,您可以通过下面的exe文件快速体验。
下载地址
https://github.com/houbb/nlp-hanzi-similar/releases/download/exe/hanzi-similar.zip
下载后直接解压即可得到hanzi-similar.exe免安装可执行文件。
执行效果
界面是使用java swing实现的,所以美观等等。我已经彻底放弃治疗了T_T。
使用exe4j打包。
第一个字符输入一个汉字,第二个字符输入另一个汉字,单击“计算”即可得到相应的相似度。
字典的弊端
这个项目是开源的,因为一个朋友有相关需求,但是他不懂java。
起初,我想以字典的形式设计这个项目,两个单词对应一个相似度。
但有一个问题。 2W个汉字的数量以及2W个汉字的相似词典近亿个。
空间复杂度太高,也会带来时间复杂度问题。
所以我们目前使用的是实时计算,有时间的话我们会迁移到其他语言:)
实现原理
实现思路
与文本相似度不同,汉字相似度的单位是汉字。
所以相似就是汉字的细分,比如笔画、拼音、部首、结构等。
推荐阅读:
NLP中文相似词相似度计算思路
计算思路描述了实现原理,但是朋友说不会实现,所以这个项目就诞生了。
核心代码
的核心实现如下,是各种相似度的加权计算。
/** * 相似度* * @param context context* @return result* @since 1.0.0 */@Overridepublic doubleimilar(final IHanziSimilarContext context) { Final String charOne=context.charOne();最终字符串charTwo=上下文。 charTwo(); //1.是一样的吗if(charOne.equals(charTwo)) { return 1.0; } //2.是用户定义的MapString,Double DefineMap=context.userDefineData().dataMap();字符串定义键=charOne+charTwo; if(defineMap.containsKey(defineKey)) { 返回defineMap.get(defineKey); } //3.通过权值计算得到//3.1 四角编码IHanziSimilar sijiaoSimilar=context.sijiaoSimilar(); double sijiaoScore=sijiaoSimilar.相似(上下文); //3.2 结构体IHanziSimilar jiegouSimilar=context.jiegouSimilar(); double jiegouScore=jiegouSimilar.similar(context); //3.3 激进的IHanziSimilarbushouSimilar=context.bushouSimilar();双bushouScore=bushouSimilar.similar(context); 4、计算总分doubletotalScore=sijiaoScore + jiegouScore +bushouScore + bihuashuScore + pinyinScore; //4.1 避免浮点比较问题if(totalScore=0) { return 0; } //4.2 正则化double limitScore=context.sijiaoRate() + context.jiegouRate() + context.bushouRate() + context.bihuashuRate() + context.pinyinRate(); return TotalScore/limitScore;} 具体细节,有兴趣的可以自行阅读源码。
开源地址
为了方便大家学习和使用,本项目已开源。
开源地址:
https://github.com/houbb/nlp-hanzi-similar
欢迎大家,forkstar鼓励我~
算法的优缺点
优点
少数论文是从汉字的结构入手的。
该算法引入了四角编码+结构+部首+笔画+拼音的方法,使其更符合国内的使用直觉。
缺点
由于当时的数据问题,根部部分实际上是有缺陷的。
未来计划推出分词词典来比较汉字的所有组成部分,而不是目前的简单部首。
用户评论
经典的对白
这篇文章太棒了,NLP近词相似度算法的实现竟然这么详细,感谢作者开源分享!对于我这个小白来说,这样的教程太及时了。
有9位网友表示赞同!
桃洛憬
最近一直在找关于NLP近词相似度算法的实现,这个开源项目简直救星啊!希望作者能持续更新,解决更多问题。
有18位网友表示赞同!
素衣青丝
看到这个标题就有点头大了,不过既然是开源实现,我还是会尝试一下的。希望能简化我的工作流程。
有15位网友表示赞同!
歇火
这个开源实现真的很强大,我之前自己写的代码效率太低了,现在终于可以试试这个了。感谢作者的贡献!
有8位网友表示赞同!
夏以乔木
第一次接触NLP近词相似度算法,这篇文章给了我很大的帮助。希望能有更多类似的开源项目。
有17位网友表示赞同!
龙吟凤
感觉这个开源实现有点复杂,对于初学者来说可能不太友好。希望作者能出一个更简单的版本。
有13位网友表示赞同!
青墨断笺み
看了这个开源实现,发现作者真的用心了。代码质量很高,值得学习。谢谢分享!
有8位网友表示赞同!
无所谓
对于我这种编程小白来说,这个开源实现可能需要一段时间去消化。不过我会努力的!
有16位网友表示赞同!
我一个人
这个项目很有潜力,不过我觉得作者可以增加一些文档说明,让新手更容易上手。
有14位网友表示赞同!
何年何念
NLP近词相似度算法一直是我的痛点,这个开源实现给了我新的希望。谢谢作者!
有13位网友表示赞同!
汐颜兮梦ヘ
这个开源实现让我对NLP有了更深的理解,感觉自己的技术水平又提高了一步。
有6位网友表示赞同!
(り。薆情海
看了这个开源实现,我觉得作者对算法的理解真的很深入。希望能看到更多类似的优质项目。
有19位网友表示赞同!
娇眉恨
这个开源实现真的太棒了,我之前一直用付费工具,现在终于可以免费使用了。感谢作者!
有12位网友表示赞同!
一生只盼一人
虽然这个开源实现功能强大,但我觉得对于性能优化部分可以再详细一些。
有7位网友表示赞同!
坠入深海i
这个项目的代码结构很好,让我学到了很多。希望作者能持续更新,解决更多实际问题。
有10位网友表示赞同!
小清晰的声音
对于NLP近词相似度算法,这个开源实现是一个很好的学习资源。我会推荐给身边的朋友。
有7位网友表示赞同!
断秋风
这个开源实现让我对NLP有了新的认识,感觉自己的研究思路都清晰了许多。
有19位网友表示赞同!
你与清晨阳光
虽然这个项目很强大,但我感觉作者在文档上可以再下点功夫,让用户更容易理解和使用。
有12位网友表示赞同!
念旧是个瘾。
这个开源实现真的让我大开眼界,感觉自己对NLP的理解又上升了一个层次。感谢作者的分享!
有7位网友表示赞同!