JAVA实现近义词匹配挖取算法

Levenshtein类 用于实现挖词逻辑的核心,主要用于字符串匹配度计算,支持ABA词汇。

/*** 计算字符串之间匹配度算法*/
public class Levenshtein {private int compare(String str, String target) {int d[][]; // 矩阵int n = str.length();int m = target.length();int i; // 遍历str的int j; // 遍历target的char ch1; // str的char ch2; // target的int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1if (n == 0) {return m;}if (m == 0) {return n;}d = new int[n + 1][m + 1];for (i = 0; i <= n; i++) { // 初始化第一列d[i][0] = i;}for (j = 0; j <= m; j++) { // 初始化第一行d[0][j] = j;}for (i = 1; i <= n; i++) { // 遍历strch1 = str.charAt(i - 1);// 去匹配targetfor (j = 1; j <= m; j++) {ch2 = target.charAt(j - 1);if (ch1 == ch2) {temp = 0;} else {temp = 1;}// 左边+1,上边+1, 左上角+temp取最小d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);}}return d[n][m];}private int min(int one, int two, int three) {return (one = one < two ? one : two) < three ? one : three;}/*** 获取两字符串的相似度** @param str* @param target** @return*/public float getSimilarityRatio(String str, String target) {return 1 - (float) compare(str, target) / Math.max(str.length(), target.length());}

实现算法代码

//实现算法
public static String getKeyWord(String keyWord, String userAnswer, Integer index) {Levenshtein levenshtein = new Levenshtein();String[] keyWordArr = keyWord.split("");String[] answerArr = userAnswer.split("");String begin = keyWordArr[index];int beginIndex = 0;//当前记录数int pitchIndex = 0;//命中暂时记录数int pitchAnswerIndex = 0;//间隔数int intervalIndex = 0;float percentage = 0;String result = "";String result2 = "";index++;Map<String, Integer> map = new HashMap<>();//设置字符可消费的数量for (int i = 0; i < keyWordArr.length; i++) {Integer num = map.get(keyWordArr[i]);if (null != num) {map.put(keyWordArr[i], num + 1);} else {map.put(keyWordArr[i], 1);}}for (int j = 0; j < answerArr.length; j++) {String answer = answerArr[j];if (begin.equals(answer)) {if (result.equals("")) {result = answer;} else if (intervalIndex >= keyWord.length() * 0.2) {result = answer;} else {result = result + answer;}beginIndex = 1;pitchIndex++;} else {if (beginIndex == 1) {//命中间隔判断,超过原词汇0.2未命中则视为失效,重新查找if (intervalIndex >= keyWord.length() * 0.2) {beginIndex = 0;result = "";result2 = "";pitchIndex = 0;pitchAnswerIndex = 0;intervalIndex = 0;continue;}//消费逻辑Integer num = map.get(answer);if (null != num && num > 0) {map.put(answer, num - 1);pitchIndex++;} else {intervalIndex++;}result = result + answer;float percentage2 = levenshtein.getSimilarityRatio(result, keyWord);//获取暂时满足条件的串if (percentage2 >= percentage || pitchIndex > pitchAnswerIndex) {result2 = result;percentage = levenshtein.getSimilarityRatio(result2, keyWord);pitchAnswerIndex = pitchIndex;intervalIndex = 0;}if (intervalIndex >= keyWord.length() * 0.2 && pitchAnswerIndex > keyWord.length() * 0.6) {break;}}}}//返回满足百分之60以上的最优结果if (pitchAnswerIndex >= keyWord.length() * 0.6) {return result2;}//如不满足则重新查找if (index < keyWord.length()) {return getKeyWord(keyWord, userAnswer, index);} else {return null;}}

效果测试

 public static void main(String[] args) {String a = "甲构成故意杀人(预备)法律法条和过失致人死亡罪。";String b = "法律法规";String c = getKeyWordTest(b,a,0);System.out.println("取词结果为:" + c);}

结果展示

【JAVA实现近义词匹配挖取算法】相关推荐

  1. 【Elasticsearch】相关性,近义词匹配,纠错匹配

    目录 相关性 布尔模型 词频/逆向文档频率(TF/IDF) 词频 逆向文档频率 字段长度归一值 结合使用 向量空间模型 Lucene 的实用评分函数 近义词匹配 近义词查询原理 同义词过滤器 纠错匹配 ...

  2. JAVA ik es_安装elasticsearch及中文IK和近义词配置

    安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elast ...

  3. JAVA程序设计:近义词句子(LeetCode:5110)

    给你一个近义词表 synonyms 和一个句子 text , synonyms 表中是一些近义词对 ,你可以将句子 text 中每个单词用它的近义词来替换. 请你找出所有用近义词替换后的句子,按 字典 ...

  4. 人为增加近义词 | Word2Vec的语料制作和训练

    第零步:介绍 终于弄明白了gensim.word2vec怎么玩,说到底word2vec就是用共现矩阵来判断两个词语是不是相关,从而得出两个词语相似度高不高,这话听起来有问题~ 但事实就是这样的,不管我 ...

  5. 3.2.2-同义词和近义词

    目录 同义词Synonym 处理意义 同义词字典WordNet使用 近义词Near-Syonoym 同义词Synonym 处理意义 一般计算机处理自然语言时,是采用精准匹配. 例如,中文中" ...

  6. 安装elasticsearch及中文IK和近义词配置

    安装elasticsearch及中文IK和近义词配置 安装java环境 java环境是elasticsearch安装必须的 yum install java-1.8.0-openjdk 安装elast ...

  7. 自然语言处理(NLP)之求近义词和类比词<MXNet中GloVe和FastText的模型使用>

    这节主要就是熟悉MXNet框架中的两种模型:GloVe和FastText的模型(词嵌入名称),每个模型下面有很多不同的词向量,这些基本都来自wiki维基百科和twitter推特这些子集预训练得到的. ...

  8. DataCleaner---4.1近义词查找

    4.1近义词查找 近义词查找转换(Synonym lookup)是DataCleaner标准化和清理数据能力的关键部分.使用此组件,您可以在近义词目录中查找值,如果发现它是近义词,则将其替换为其主项. ...

  9. ​ES elasticsearch-analysis-dynamic-synonym​连接数据库动态更新synonym近义词

    前言 在很多搜索场景中,我们希望能够搜索出搜索词相关的目标,同时也希望能搜索出其近义词相关的目标.例如在商品搜索中,搜索"瓠瓜",也希望能够搜索出"西葫芦",但 ...

  10. 【每天一道算法题】近义词句子

    本文首发于我的公众号码农之屋(id: Spider1818),专注于干货分享,包含但不限于Java编程.网络技术.Linux内核及实操.容器技术等.欢迎大家关注,二维码文末可以扫. 题目描述 给你一个 ...

最新文章

  1. java不能连接mysql,无法使用Docker将Java程序连接到MySQL
  2. 新冠最凶变种出现!突变量德尔塔两倍,专家称感染率超原毒株500%,引发全球股市震荡...
  3. 文本过滤--awk 3
  4. mysql 回滚 前滚_Oracle 实例恢复时 前滚 后滚说明
  5. [云炬python3玩转机器学习笔记] 2-6关于回归和分类
  6. 单元测试源码分析之二Mockito自动装配和插桩
  7. 阿里云深圳数据中心正式开放
  8. c++ curl 超时_cc++写网络爬虫,curl+gumbo配合使用
  9. Linux ar命令
  10. snmp error on SnmpMgrRequest 40
  11. 关于直播带货被坑的厂商
  12. 推荐9个web前端模板框架
  13. workbench焊接实例_基于ANSYS Workbench平台和ANSYS经典界面的焊接仿真-工业电子-与非网...
  14. 英特尔芯片的后缀_英特尔处理器后缀的含义是什么?
  15. 强化学习Reinforcement Learning概念理解篇(一)
  16. 897-了解微服务网关
  17. nacos registry, gateway register failed java.lang.IllegalArgumentException: no server available
  18. Asp.Net Ajax (2)---ScriptManager
  19. 腾讯高工保姆级“Java成长手册”,层层递进,全是精华 Github上都没有
  20. 禁止Android安装某些apk应用

热门文章

  1. Android多媒体相关框架
  2. 小麦颗粒数目matlab,求关于matlab中rice.png图像中的米粒数目的算法
  3. POI复制Excel模板并填充数据
  4. tcp/udp 常用端口列表
  5. 国际冠码与国际电话区号
  6. java 按 大写字母_用大写字母拆分字符串
  7. 7-6 统计大写辅音字母
  8. HDU 6319 Ascending Rating(单调队列)
  9. 联想裁员与全球化背景下的知识阶层失业
  10. Vue看板娘教程详细版