当前位置: 首页 > news >正文

使用优化版的编辑距离算法替代ES默认的评分算法

优化版编辑距离算法

    public static int minDistance(String str, String str1) {
        int len = str.length(), len1 = str1.length();
        // 预处理
        char[] arr1 = str.toCharArray();
        char[] arr2 = str1.toCharArray();

        // 动态规划数组
        int[] dp = new int[len1 + 1];
        for (int j = 0; j <= len1; j++) dp[j] = j;

        for (int i = 1; i <= len; i++) {
            int prevDiagonal = dp[0];
            dp[0] = i;
            char c1 = arr1[i-1];

            for (int j = 1; j <= len1; j++) {
                int cost = (c1 == arr2[j-1]) ? 0 : 1;
                int newVal = dp[j] + 1;
                newVal = newVal < dp[j-1] + 1 ? newVal : dp[j-1] + 1;
                newVal = newVal < prevDiagonal + cost ? newVal : prevDiagonal + cost;
                prevDiagonal = dp[j];
                dp[j] = newVal;
            }
        }
        return dp[len1];
    }

ES自定义评分脚本

## 库名称:zhCNenUS-基建化工-油气-木木有限公司23456crm-QM、zhCNenUS-汽车-汽车-木木有限公司23456crm-QM
POST /tm/_search
{
  "query": {
    "bool": {
      "filter": [
        { "terms": { "dbId": ["101476","110316"] }},
        { "match": { 
          "original": {
            "query": "姓名:上云测试用户01",
            "minimum_should_match": "69%"
          }
        }}
      ],
      "must": [
        { "function_score": {
          "functions": [
            { "script_score": {
              "script": {
                "source": """
                    // 定义相似度计算函数(放于脚本顶部,str1是请求参数)
                    double calculate(String str, String str1) {
                        // 快速返回条件
                        if (str == null || str1 == null || str.isEmpty() || str1.isEmpty()) return 10.0;
                
                        int len = str.length(), len1 = str1.length();
                        int minLen = len < len1 ? len : len1;
                        int maxLen = len < len1 ? len1 : len;
                        double ratio = (double)minLen / maxLen;
                        if(ratio < 0.7) {
                            return 30;
                        }
                
                        String strLower = str.toLowerCase();
                        String str1Lower = str1.toLowerCase();
                
                        if(str.equals(str1)){
                            return 100;
                        }
                        if(strLower.equals(str1Lower)){
                            return 90;
                        }
                        // 预处理
                        char[] arr1 = strLower.toCharArray();
                        char[] arr2 = str1Lower.toCharArray();
                
                        // 动态规划数组
                        int[] dp = new int[len1 + 1];
                        for (int j = 0; j <= len1; j++) dp[j] = j;
                
                        for (int i = 1; i <= len; i++) {
                            int prevDiagonal = dp[0];
                            dp[0] = i;
                            char c1 = arr1[i-1];
                
                            for (int j = 1; j <= len1; j++) {
                                int cost = (c1 == arr2[j-1]) ? 0 : 1;
                                // 取最小值
                                int newVal = dp[j] + 1;
                                newVal = newVal < dp[j-1] + 1 ? newVal : dp[j-1] + 1;
                                newVal = newVal < prevDiagonal + cost ? newVal : prevDiagonal + cost;
                                prevDiagonal = dp[j];
                                dp[j] = newVal;
                            }
                        }
                        return 80.0 * (1.0 / dp[len1]);
                    }
                
                    String es1 = doc['original.keyword'].value;
                    String es2 = doc['translation.keyword'].value;
                    String str1 = params.val1;
                    String str2 = params.val2;
                    // 计算纯文本的评分
                    double textRatio = calculate(es1, str1);
                    // 计算标签格式的评分
                    double tagRatio = calculate(es2, str2);
                    // 如果原文没有标签,语料有标签,则需要扣分
                    if(str2.length()==0 && es2.length()!=0) {
                        tagRatio=-tagRatio;
                    }
                    // 根据情况调整权重
                    return textRatio + 0.1 * tagRatio;
                """,
                "params": {
                  "val1": "姓名:上云测试用户01",
                  "val2": "<1>4<2/>4</1>"
                }
              }
            }}
          ],
          "boost_mode": "replace"
        }}
      ]
    }
  }
}

相关文章:

  • 当进行npm install指令,安装依赖的情况下,存在如下报错
  • 神经网络中感受野的概念和作用
  • Trae根据原型设计稿生成微信小程序密码输入框的踩坑记录
  • SpringBoot+EasyPOI百万级数据导出Excel实战|分页防OOM+(含源码示例)
  • Java集合List快速实现重复判断的10种方法深度解析
  • 清华大学|DeepSeek学习资料,从入门到精通。
  • DeepSeek 202502 开源周合集
  • 快速安装CUDA版本PyTorch(pip/阿里云/CUDA 12.1)
  • MySQL 的存储引擎有哪些?它们之间有什么区别?
  • Java语法基础知识点1
  • vue 设置生产 开发 测试环境
  • Qt通过QPainter 绘制网格,以及滑动界面消除格子的方式来验证TP触摸屏的准确性
  • SSM共享充电宝系统
  • 数据库的sql语句
  • centos 7 停更后如何升级kernel版本 —— 筑梦
  • MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?
  • k8s使用containerd作为容器运行时配置Harbor私有仓库与阿里云私有仓库以及镜像加速器,k8s基于containerd如何配置harbor私有仓库
  • C#上位机--一元运算符
  • Nginx反向代理出现502 Bad Gateway问题的解决方案
  • 初级网络工程师之从入门到入狱(十二)
  • 西安搜建站科技网站/建站seo是什么
  • 郑州网站建设哪家有/seo具体是什么
  • 淘宝网站建设代码/整合营销传播最基础的形式是
  • ssh可以做wap网站么/营销网络建设
  • 怎样做网站的优化/搜索引擎优化培训班
  • 广东网站制作多少钱/淘宝搜索关键词排名查询工具