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 小结
一个字的形近字可以做很多有趣的事情,这个要看大家的想象力。
实现方式也不难,最核心的还是相似度的计算。
我是老马,期待与你的下次重逢。
护航双十一!余杭电力上门问诊保障物流用电无忧双十一到了,余杭区作为电商企业汇集地,园区生产运输压力较大,有了电力企业相助,今年一定能干出好成绩!昨日,国家电网浙江电力(余杭)红船共产党员服务队到仁和菜鸟物流园区上门服务时,园
深圳上海北京武汉常州获评中国新能源产业集聚度最高五大城市金融界11月11日消息胡润研究院今日发布2022年胡润中国新能源产业集聚度城市榜,入围城市共50家,深圳上海北京武汉常州获评中国新能源产业集聚度最高的五大城市。南京苏州广州成都和合
微信8。0。30正式版更新多了4个新功能昨天,安卓微信发布了8。0。30正式版本。此次更新与之前8。0。30内测版基本无异,主要有以下4个新变化。1微信插件页面更换背景,微信键盘开始内测在微信我设置插件中,页面背景由黄色
盘点双十一爆款平板的好评率TOP3,还没买的可以蹲一波返场了现阶段网课和在线办公仍旧是一个趋势,相信不少朋友都打算在双11大促期间入手一款兼顾学习与办公需求的设备,我也一样,平板电脑便携大屏的优点就成了我的心头好了,可惜错过了第一波大促,那
如何用SDNAND解决TF卡所遇到的问题?雷龙发展是专业做存储产品的供应商,跟客户沟通过很多关于存储方面的问题。不知道大家在使用小容量T卡的时候,是否有遇到以下的一些问题1T卡的尺寸(体积)太大了怎么办?2T卡的接触不良,
朴信惠秀自拍照满满少女感,摆Pose拍出逆天大长腿南韩女星朴信惠出道以来演出的角色都以清纯甜美为主,她本身少女感也很重,即使已经升格当妈妈,不论穿着打扮或是脸蛋,都跟大学生没两样,她今(9)日更新个人IG放上自拍照,又是青春洋溢的
李佳琦终于遇到新对手,逼得网友神助攻作者杨阳来源顶尖广告前两天,资生堂被爆官方卖的悦薇水乳套装,比李佳琦直播同款便宜300多块,李佳琦卖贵,消费者崩溃。不过,这可能不是贵妇和富婆会操心的事情,当部分李佳琦女孩忙着讨论
夏可叔叔讲美容因字辈的护肤原料有哪些?原料科普文哈,成分党围观交流。好久不发文,写了个超级长的。你们慢慢看。图片源自soogif。com写文起因是看山家的一个提问,说为啥这么多带因字的原料。(首发看山家,版权归看山和夏
高中生日记我的生活日记这是一本关于自己五年高中生活的日记。为什么是五年,主要是自己高中生病休学一年,复读一年!上面记录着,自己从考入高中成绩不理想时慌乱迷茫生病休学后回家养病时,向往校园生活
新诗采撷高洪刚秋,凉了(外一首)秋,凉了秋,凉了,树叶黄了,秋风吹起,片片金黄。叶落归根,拥抱大地。雁叫声声,叫凉了秋水,要流向冰清玉洁的世界。寒露深秋的夜晚,天上赐下玉露,滋润着月光下的世界。寒风中的琼浆玉液,
面对舆论,沉默不语,沉默是金是最好的选择面对网络的讨论,我想一个聪明的人都会选择沉默不语,最好什么都不要做,或者三思而后行,步步走好,既然前面没有走好,后面应该郑重的走踏实,不然会更走的不好!有时候面对别人的语气讽刺,选