NLP开源形近字算法之形近字列表(番外篇)
创作目的
国内对于文本的相似度计算,开源的工具是比较丰富的。
但是对于两个汉字之间的相似度计算,国内基本一片空白。国内的参考的资料少的可怜,国外相关文档也是如此。
本项目旨在抛砖引玉,实现一个基本的相似度计算工具,为汉字 NLP 贡献一点绵薄之力。
推荐阅读:
NLP 中文形近字相似度计算思路
中文形近字相似度算法实现,为汉字 NLP 尽一点绵薄之力
当代中国最贵的汉字是什么?
NLP 开源形近字算法补完计划(完结篇)
NLP 开源形近字算法之形近字列表(番外篇)
开源项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字相似度/markdown 目录
需求
有时候我们并不是需要返回两个字的相似,而是需要返回一个汉字的相似列表。 实现思路
我们可以分别计算所有的汉字之间的相似度,然后保留最大的前100个,放在字典中。
然后实时查询这个字典即可。 实现方式
bihuashu_2w.txt 中我们主要需要的是对应的 2W 常见汉字。
hanzi_similar_list.txt 用来存放汉字和相似字的映射关系。数据初始化public static void main(String[] args) { final String path = "D:codecoinnlp-hanzi-similarsrcmainresourceshanzi_similar_list.txt"; // 读取列表 List lines = FileUtil.readAllLines("D:codecoinnlp-hanzi-similarsrcmainresourcesnlpbihuashu_2w.txt"); // 所有的单词 Set allWordSet = new HashSet<>(); for(String line : lines) { String word = line.split(" ")[0]; allWordSet.add(word); } // 循环对比 for(String word : allWordSet) { List list = getSimilarListData(word, allWordSet); String line = word +" " + StringUtil.join(list, ""); FileUtil.append(path, line); } }
•优先级队列取前 100 个
我们通过优先级队列存储: private static List getSimilarListData(String word, Set wordSet) { PriorityQueue items = new PriorityQueue<>(new Comparator() { @Override public int compare(SimilarListDataItem o1, SimilarListDataItem o2) { // 相似度大的放在前面 return -o1.getRate().compareTo(o2.getRate()); } }); for(String other : wordSet) { if(word.equals(other)) { continue; } // 对比 double rate = HanziSimilarHelper.similar(word.charAt(0), other.charAt(0)); SimilarListDataItem item = new SimilarListDataItem(other, rate); items.add(item); } final int limit = 100; List wordList = new ArrayList<>(); for(SimilarListDataItem item : items) { wordList.add(item.getWord()); if(wordList.size() >= limit) { break; } } return wordList; }相似字的获取
初始化好数据之后,一切就变得非常简单:
•接口定义 /** * 数据接口-相似列表 * @author binbin.hou * @since 1.3.0 */ public interface IHanziSimilarListData { /** * 返回数据信息 * @param word 单词 * @return 结果 * @since 1.3.0 */ List similarList(String word); }
•数据获取 public class HanziSimilarListData implements IHanziSimilarListData { private static volatile Map> map = Guavas.newHashMap(); @Override public List similarList(String word) { if(MapUtil.isEmpty(map)) { initDataMap(); } return map.get(word); } private void initDataMap() { if(MapUtil.isNotEmpty(map)) { return; } //DLC synchronized (map) { if(MapUtil.isEmpty(map)) { List lines = StreamUtil.readAllLines("/hanzi_similar_list.txt"); for(String line : lines) { String[] words = line.split(" "); // 后面的100个相近词 List list = StringUtil.toCharStringList(words[1]); map.put(words[0], list); } } } } }便利性
为了用户使用方便,我们在 HanziSimilarHelper 中添加 2 个工具类方法:/** * 相似的列表 * @param hanziOne 汉字一 * @param limit 大小 * @return 结果 * @since 1.3.0 */ public static List similarList(char hanziOne, int limit) { return HanziSimilarBs.newInstance().similarList(hanziOne, limit); } /** * 相似的列表 * @param hanziOne 汉字一 * @return 结果 * @since 1.3.0 */ public static List similarList(char hanziOne) { return similarList(hanziOne, 10); }测试效果
我们使用看一下效果:
我们来看一下【爱】的形近字。 List list = HanziSimilarHelper.similarList("爱"); Assert.assertEquals("[爰, 爯, 受, 爭, 妥, 憂, 李, 爳, 叐, 雙]", list.toString());开源地址
为了便于大家使用学习,项目已开源。
https://github.com/houbb/nlp-hanzi-similar 小结
一个字的形近字可以做很多有趣的事情,这个要看大家的想象力。
实现方式也不难,最核心的还是相似度的计算。
我是老马,期待与你的下次重逢。
贡献证券行业支教力量券商发力财商课程编者按继2021年10月中国证券业协会(下称协会)组织证券行业发起促进乡村振兴公益行动之后,为深化行动工作成效,协会搭建志愿者服务课题研究培训交流和项目展示等四个平台,并于今年4月
深海评战火波及核电站,挑战全人类安全近日,联合国安理会就扎波罗热核电站安全问题召开紧急磋商,俄罗斯和乌克兰双方就核电站近期频频遇袭各执一词。如今,尽管俄方表态称,国际原子能机构代表团可能于9月初到达扎波罗热核电站,但
对话董事长边程赴瑞士上市,给科达制造带来了什么?视频加载中对话董事长边程赴瑞士上市,给科达制造带来了什么?全国首批首家企业在瑞士成功上市两个多月内,完成从提交申请到正式挂牌上市刚过去的7月,科达制造发行的GDR(全球存托凭证)在
长江流域高温干旱持续保供水保秋收各地出实招最近,高温天气频频刷屏,截至8月22日,中央气象台已连续33天发布高温预警。连续数日的高温少雨天气,令部分地区旱情持续发展。长江干流及洞庭湖鄱阳湖水位较常年同期偏低4。856。13
宁夏自治区科协举办全区科学家精神教育基地培育建设工作培训班为深入贯彻落实习近平总书记关于弘扬科学家精神的重要指示精神,贯彻落实自治区第十三次党代会关于大力弘扬科学家精神的有关要求,推动规范科学家精神教育基地的建设,充分挖掘和利用好科学家精
庐山的救赎(第三回)(网络下载转载作者五彩湾)经过了一夜的香甜,两个人重拾生活的信心。此时,看到庐山牯岭镇上已经人来人往,一派热闹景象。王进贤感概地说袁野!我从来没有感到一个早晨可以像今天早晨这样!庐
打压华为,你们在兴奋什么?相信很多人也在前两年知道华为任正非用苹果平板和手机,也在很多人面前说过家里人都用苹果手机,好像有人还在网上看到过他和他家人用苹果,在前两年的新闻媒体上,网友分为两派,在很多新闻的评
家暴男在家中被刀刺穿头部而亡真相背后令人恶气难抒警局接到报案,有个胖子死在家中,模样十分惨烈。刑警队长立刻带人赶去现场,只见死者倒在厨房,一把水果刀刺穿他的头,身体的周围全是酒瓶碎片,身上还被刺入一些,死状看上去很是惨烈。警员从
格力电器准备更换河北经销商的原因分析记者近日了解到,格力电器已经停止对河北经销商的供货,同时河北经销商法人代表徐自发董事长也宣布,不做格力了,转做飞利浦。本着探寻事情真相的目的,记者第一时间电话联系了河北新兴格力电器
戚薇因假货事件报警?网友知三当三人品真的有问题前段时间,网友琉璃是什么璃在网上发文怒批戚薇直播间公然卖假货,热搜一出,很多网友也争相表态说自己有类似遭遇,很难维权,戚薇方也是在第一时间回应商品为真并贴出相应证明,随后,该网友将
追梦火焰蓝守护万家灯火丨森林消防为了锤炼水上救援技能有多拼?中国青年网8月20日内蒙古电(记者宋莉夏烯然)活饵救援操艇绕标翻船自救水面搜救8月19日,记者随追梦火焰蓝守护万家灯火网络主题采访团来到内蒙古森林消防总队大兴安岭支队绰尔大队水上救