相识词设计思路及实现方法

目录

1.业务背景

2.实现方法

        第一种:

    ​编辑

        第二种:

3.相关材料


1.业务背景

        业务有全文检索功能,然后根据标书的要求需要有近似词的功能,一般近似词需要模型训练之后成为词库,是需要大数据相关人员负责。负责人表示简单实现一个不需要那么复杂,如输入 张三显示于张三有关的信息表示。作为开发的当然不允许这么草率实现一个功能,相识近似至少要能识别中文语义才行。

2.实现方法

        第一种:

              在网上找到一个 shibing624 similarity 的jar 包,里面包含了词语短句中文以及字符串的格式相识,通过比较都得一个相识分。然后在网上找到一个简单的词库,通过流的形式读取出来然后挨个比较。得出分数高的返回即可,嘿嘿嘿,想法不错。

    

        这是词库的格式得按照一定格式解析,考虑近似词使用可能比较频繁,每次本地IO也挺消耗资源,所以给他干以放在内存,因为词库数据可能存在重复的情况,使用set集合

private static Set<String> lexiconResourcePaths = new HashSet<>();
    private static Set<String> lexiconData = new HashSet<>();

    /**
     * 词典预热
     */
    @PostConstruct
    public void lexiconPreheat() {
        loadResource();
        analysisLexicon();
    }
    

    /**
     * 加载资源
     */
    private void loadResource() {
        lexiconResourcePaths.add(getClass().getClassLoader().getResource("lexicon/jinyici.txt").getFile());
    }


    /**
     * 解析本地词典
     *
     * @return
     */
    private void analysisLexicon() {
        StringBuilder result = new StringBuilder();
        lexiconResourcePaths.forEach(filePath -> {
            File file = new File(filePath);
            try {
                // 构造一个BufferedReader类来读取文件
                BufferedReader br = new BufferedReader(new FileReader(file));
                String s = null;
                // 使用readLine方法,一次读一行
                while ((s = br.readLine()) != null) {
                    result.append(System.lineSeparator() + s);
                }
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        String str = result.toString().replace("\r\n", " ");
        lexiconData = Arrays.stream(str.split(" ")).collect(Collectors.toSet());
    }
    

        然后就是将要获取同义词的和词库一一比计较,且必须得按照分数分值高的排序。

        添加的时候会遇到几种情况,所以是添加的时候去比较,且可以根据前端传递的长度返回前几位,有几种情况

@Override
    public List<SearchSimilarityVo>  execute(SimilarSearchParam param) {

        List<SearchSimilarityVo> resultVo = new LinkedList<>();

        lexiconData.forEach(word -> {
            double score = Similarity.conceptSimilarity(param.getSearchContent(), word);
            if (score < 0.7 || StringUtils.isEmpty(word)){
                return;
            }
            SearchSimilarityVo currentData = new SearchSimilarityVo(word, score);

            if (resultVo.size() >= 1) {
                int lastIndex = resultVo.size() - 1;
                SearchSimilarityVo lastData = resultVo.get(lastIndex);
                Double acquaintanceshipScore = lastData.getScore();

                // 大于
                if (score > acquaintanceshipScore) {
                    while (true) {
                        if (lastIndex == 0) {
                            // 最小
                            break;
                        }
                        lastIndex--;
                        lastData = resultVo.get(lastIndex);
                        if (score > lastData.getScore()) {
                            continue;
                        } else {
                            lastIndex++;
                            break;
                        }
                    }
                    // 1.大于长度 删除末尾
                    if (resultVo.size() >= param.getSize()) {
                        resultVo.remove(resultVo.size() - 1);
                    }
                    resultVo.add(lastIndex, currentData);
                } else if (resultVo.size() < param.getSize()) {
                    // 2.小于且不超过总长度
                    resultVo.add(currentData);
                }
            } else {
                // 3.第一个
                resultVo.add(currentData);
            }
        });

        System.out.println("resultVo{}:" + resultVo);
        return resultVo;
    }

        功能是实现了,但其实每次去比较这么多其实还是挺耗时间,词库 就 30000次每次都去比较,性能就不用说了,肯定慢,而且一旦遇到分数高的还得将数据进行排序,所以我这使用的是 linklist 会强一点,且在添加的时候已经将顺序排号,过滤了低分。

        但是这种词库不出意外的肯定出意外了,客户说这同义词没啥用。嘿嘿嘿给我说,词库这方面我们还没想法,要不这样你就知识库(也就是 用户名 邮箱 电话 相关的三个库),要求比如输入英文名 能显示中文名,就这样一个实例,没错,剩下的又是我自己发挥的时候,开发真难,抱着客户都是祖宗的原则,我只能,害,这不简简单单的事情嘛。

        第二种:

           只有一个实例,剩下的都得自己想,首先是姓名 手机 邮箱的库,要我说就简单粗暴一些就全字段匹配将符合的一行数据全部匹配返回就完事了。唉,谁让我是个合格开发勒,这种低级耗时的设计代码我是一行都不想写,必须得高级。

        正则表达式怎么样,首先根据输入的内容判断其输入的是什么,在根据其输入的内容格式去匹配最相识的格式,嘿嘿嘿,我确实想这么做,比如你输入手机号 123456  刚好库里有123457,第一符合的放前面,但是有点不符合客户的想法输入中文名 提示英文名()

        同步es怎么样,毕竟三张表多字段匹配管理查询效率不说,且sql写起来也麻烦不是,直接组成宽表搞到es,嘿嘿嘿,还能分词,好是好,又得考虑同步问题,咋比对值有没有改变还是直接全部更新一遍,想的这头疼,好希望公司有个项目经理,这种方案的事我就不操心了。

        TODO 代码实现后补充

3.相关材料

GitHub - shibing624/similarity: similarity: Text similarity calculation Toolkit for Java. 文本相似度计算工具包,java编写,可用于文本相似度计算、情感分析等任务,开箱即用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/190462.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode合集】1457. 二叉树中的伪回文路径

1457. 二叉树中的伪回文路径 1457. 二叉树中的伪回文路径 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&am…

2024年最新最全的Jmeter接口测试必会知识点:jmeter连接数据库

jmeter连接mysql数据库 大致步骤如下&#xff1a; 1、下载mysql的jar包放入到jmeter的lib下&#xff0c;然后重启jmeter 2、配置JDBC Connection Configuration 3、配置JDBC Request 4、在请求中引用查询到的结果变量&#xff0c;可以结合计数器取每一个结果值&#xff1a…

RocketMQ 安装部署及应用场景记录

文章目录 前言一、RocketMQ简介1.1 整体架构 二、RocketMQ安装部署2.1 RocketMQ 下载2.2 修改 JVM 参数2.3 启动 NameServer 和 Broker2.4 验证发送和接受消息2.5 停止 NameServer 和 Broker2.6 配置全局环境 三、RocketMQ应用场景3.1 异步处理3.2 应用解耦3.3 流量削峰 前言 …

基于acme免费申请泛域名证书

参考文档&#xff1a;https://github.com/acmesh-official/acme.sh 文章目录 step1: 获取阿里云的ak、skstep2: 安装acmestep3: 安装通配符证书step4: 查看证书step5: 证书的使用step6: 删除证书 step1: 获取阿里云的ak、sk export Ali_Key"LTAI5tG8888888CDoEjLzkE"…

Maxwell安装部署消费到kafka集群

1.上传安装包到linux系统上面 2.解压安装包到安装目录下&#xff0c;并且重命名 [rootVM-4-10-centos package]# tar -zxvf maxwell-1.29.2.tar.gz -C /opt/software/3.配置mysql 增加以下配置 #数据库id server-id 1 #启动binlog&#xff0c;该参数的值会作为binlog的文件…

Vite -构建优化 - 分包策略 + 打包压缩

什么是分包策略 分包策略 就是把不会常规更新的文件&#xff0c;单独打包处理。问 &#xff1a;什么是不会常规更新的文件&#xff1f; 答 &#xff1a; 就是基本上不会改的文件&#xff0c;比如我们引入的第三方的依赖包&#xff0c;例如 lodash工具包&#xff0c;这些工具包…

小程序项目:springboot+vue基本微信小程序的电子书阅读器小程序

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

Python基础:字符串详解(需补充完善)

1. 字符串定义 在Python中&#xff0c;字符串是一种数据类型&#xff0c;用于表示文本数据。字符串是由字符组成的序列&#xff0c;可以包含字母、数字、符号和空格等字符。在Python中&#xff0c;你可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#x…

Leetcode—94.二叉树的中序遍历【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—94.二叉树的中序遍历 C语言实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array mus…

[Linux]进程等待

文章目录 3.进程等待3.1什么是进程等待3.2为什么要进程等待3.3如何进行进程等待?1.wait2.waitpid2.1函数的讲解2.2status的理解2.3代码理解 3.4学后而思1.直接用全局变量获取子进程退出码可以吗?如下2.进程具有独立性 退出码是子进程的数据 父进程是如何拿到退出码的3.对内存…

【brpc学习实践十】streaming log实战

实战实例 通常我们在服务还没正式起来时&#xff0c;会用brpc流式log打印&#xff0c;支持对日志输出到ostream对象中&#xff08;默认std)。同时会在服务初始化时配置LogSink&#xff0c;实现自己的log&#xff0c;这样后续都可以将输出重定向至自己的log. int init(int arg…

【C++】类型转换 ③ ( 重新解释类型转换 reinterpret_cast | 指针类型数据转换 )

文章目录 一、重新解释类型转换 reinterpret_cast1、指针数据类型转换 - C 语言隐式类型转换报错 ( 转换失败 )2、指针数据类型转换 - C 语言显示类型强制转换 ( 转换成功 )3、指针数据类型转换 - C 静态类型转换 static_cast ( 转换失败 )4、指针数据类型转换 - C 重新解释类型…

有关HarmonyOS-ArkTS的Http通信请求

一、Http简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在Web应用程序之间进行通信的协议&#xff0c;通过运输层的TCP协议建立连接、传输数据。Http通信数据以报文的形式进行传输。Http的一次事务包括一个请求和一个响应。 Http通信是基于客户端-服…

一盏茶的时间,入门 Node.js

一、.什么是 Node.js&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建高性能、可伸缩的网络应用。 它采用事件驱动、非阻塞 I/O 模型&#xff0c;使其在处理并发请求时表现出色。 二、安装 Node.js 首先&#xff0c;让我们从 Node.…

为社会做贡献的EasyDarwin 4.0.1发布了,支持视频点播、文件直播、摄像机直播、直播录像、直播回放、录像MP4合成下载

经过几个月的不懈努力和测试&#xff0c;最新的EasyDarwin 4.0版本总算是发布出来了&#xff0c;功能还是老几样&#xff1a;文件点播、视频直播&#xff08;支持各种视频源&#xff09;、直播录像与回放、录像合成MP4下载&#xff0c;稍稍看一下细节&#xff1a; 文件上传与点…

【代码随想录刷题】Day18 二叉树05------延伸题目练习

文章目录 1.【113】路径总和II1.1 题目描述1.2 解题思路1.3 java代码实现 2.【105】从前序与中序遍历序列构造二叉树2.1 题目描述2.2 java代码实现 【113】路径总和II 【105】从前序与中序遍历序列构造二叉树 1.【113】路径总和II 1.1 题目描述 给你二叉树的根节点 root 和一…

win11任务栏居中/靠左设置路径

win11任务栏居中/靠左设置路径 设置-个性化-任务栏-任务栏对齐方式

Java | The last packet sent successfully to the server was xxx milliseconds ago

最近在部署代码后&#xff0c;后端总是会遇到这个问题&#xff0c;设备通道在访问数据库时经常会报错&#xff0c;在搜集大量资料后我以为是配置问题&#xff0c;首先要保证&#xff1a; &#xff08;1&#xff09;首先确定jdbc.url地址是正确的 &#xff08;2&#xf…

林曦的小世界:不在担心与顾虑中蹉跎时间,Just Do It

内容来自林曦的小世界      先提问&#xff1a;你有没有过这样的经历&#xff0c;一项很想学的技艺&#xff0c;一件想做许久的事情&#xff0c;却始终下不了决心&#xff0c;担心左&#xff0c;担心右&#xff0c;彷徨犹豫间&#xff0c;时间过去了&#xff0c;这件事仍未…

JsonRPC协议详解(协议介绍、请求示例、响应示例)

JsonRPC协议详解 什么是RPC&#xff1f; RPC&#xff08;远程过程调用&#xff09;是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数&#xff0c;使得分布式系统的开发变得更加简单和高效。 什么是JsonRP…