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

news2024/11/29 10:43:37

目录

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编写,可用于文本相似度计算、情感分析等任务,开箱即用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营 ---第四十二天

今天开始学习 动态规划&#xff1a;背包问题 也是比较难的一部分了 动态规划&#xff1a;背包问题 理论基础 01背包&#xff08;二维数组&#xff09; 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用…

MySQL进阶_10.锁

文章目录 一、概述二、MySQL并发事务访问相同记录2.1、读-读2.2、写-写2.3、读-写2.4、并发问题的解决方案 三、锁的不同角度分类3.1、 读锁、写锁3.1.1、 锁定读 3.2、表级锁、页级锁、行锁3.2.1、表锁3.2.2、意向锁3.2.2.1、意向锁的作用3.2.2.2、意向锁的互斥性 3.2.3、自增…

简单订单和支付业务的相关流程

1、订单创建、支付及订单处理流程图 2、创建HTTP客户端工具类 Slf4j public class HttpclientUtil {//类中定义了一个私有静态成员变量instance&#xff0c;并且将其初始化为HttpclientUtil类的一个实例&#xff0c;用于实现单例模式。private static HttpclientUtil instance…

LV.12 D20 RTC实验 学习笔记

一、RTC简介 RTC(Real Time Clock)即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 二、Exynos4412下的 RTC控制器 它支持…

手摸手Element-Plus组件化开发

前端环境准备 编码工具: VSCode 依赖管理:NPM 项目构建: Vuecli NPM的全称是Node Package Manager&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。2020年3月17日&#xff0c;Github宣布收购npm&am…

【研究中2】sql server权限用户设置

--更新时间2023.11.26 21&#xff1a;30 负责人&#xff1a;jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_admin)--判断是否存在此表DROP TABLE hkcms_adminCREATE TABLE hkcms_admin (id int identity(1, 1),--id int primary key identity…

《已解决:TypeError: unhashable type: ‘slice‘ 问题》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

基于springboot学籍管理系统

一、设计目的 1. 复习、巩固Java语言的基础知识&#xff0c;进一步加深对Java语言的理解和掌握&#xff1b; 2. 课程设计为学生提供了一个既动手又动脑&#xff0c;独立实践的机会&#xff0c;将课本上的理论知识和实际有机的结合起来&#xff0c;锻炼学生的分析解决实际问题…

第二十三章 解析PR曲线、ROC曲线、AUC、AP(工具)

混淆矩阵Confusion Matrix 混淆矩阵定义 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表&#xff0c;以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值&#xff0c;矩阵的列表示预测值&#xff0c;下面我…

cephadm部署ceph quincy版本,使用ceph-csi连接

环境说明 IP主机名角色 存储设备 192.168.2.100 master100 mon,mgr,osd,mds,rgw 大于5G的空设备192.168.2.101node101mon,mgr,osd,mds,rgw大于5G的空设备192.168.2.102node102mon,mgr,osd,mds,rgw大于5G的空设备 关闭防火墙 关闭并且禁用selinux 配置主机名/etc/hosts …

【Amazon】在Amazon EKS集群中安装部署最小化KubeSphere容器平台

文章目录 一、准备工作二、部署 KubeSphere三、访问 KubeSphere 控制台四、安装Amazon EBS CSI 驱动程序4.1 集群IAM角色建立并赋予权限4.2 安装 Helm Kubernetes 包管理器4.3 安装Amazon EBS CSI 驱动程序 五、常见问题六、参考链接 一、准备工作 Kubernetes 版本必须为&…

RocketMQ的push消费方式实现的太聪明了

最近仍然畅游在RocketMQ的源码中&#xff0c;这几天刚好翻到了消费者的源码&#xff0c;发现RocketMQ的对于push消费方式的实现简直太聪明了&#xff0c;所以趁着我脑子里还有点印象的时候&#xff0c;赶紧来写一篇文章&#xff0c;来掰扯一下&#xff0c;防止过两天就忘得一干…

[网络] 5. TCP 链接的建立与释放~汇总

大部分内容源于网络加之个人理解&#xff5e;巨人的肩膀有多大决定你可以看得多远&#xff5e; 文章目录 1. 三次握手说一下三次握手的过程为什么是三次握手 2. 四次挥手说一下四次挥手的过程为什么需要四次挥手有可能出现三次挥手吗&#xff0c;什么时候会出现呢&#xff1f;为…

video标签在h5中被劫持问题

将video的视频链接转为blob export const encryptionVideo (options: URL) > {return new Promise((resolve, reject) > {window.URL window.URL || window.webkitURL;var xhr new XMLHttpRequest();xhr.open(GET, options.url, true);xhr.responseType blob;xhr.onl…

正则化与正则剪枝

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 引言正则化为什么会过拟合拉格朗日与正则化梯度衰减与正则化 应用解决过拟合网络剪枝 …

JPA 自关联 设置单向多对一

Spring boot 3 JPA中&#xff0c;遇到一个需求&#xff0c;建一个数据字典表&#xff1a; Dictionary&#xff0c;存放两级数据&#xff0c;第一级为字典项目&#xff0c;第二级为项目内容&#xff0c;查询时要把parent_id对应父项的名称也一起查出来&#xff0c;返回前端。 …

VUE简易计划清单

目录 效果预览图 完整代码 效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

Web前端 ---- 【Vue】什么?代码堆在一起不好维护?辛辛苦苦改造的单文件组件用不了?看我直接Vue Cli脚手架安排

目录 前言 单文件组件 什么是单文件组件 单文件组件的内容 Es6模块的导入和导出 创建单文件组件 Vue Cli脚手架 前言 继上篇文章Vue组件的使用介绍了如何使用Vue组件&#xff0c;但是发现有一个很重要的问题&#xff0c;就是代码复用性很差&#xff0c;并且无法提供样式…

文件的写入和读取操作

题目&#xff1a; 编写一个程序&#xff0c;实现以下功能&#xff1a; 1. 创建一个新的文本文件&#xff0c;并将用户输入的数据写入文件中。 2. 打开已存在的文本文件&#xff0c;并将其中的数据显示在屏幕上。 #include <stdio.h> #include <stdlib.h> void wri…

事件委派+自定义属性+编程式导航实现路由跳转及传参

当我们页面中有许多a标签需要实现点击跳转到同一个页面并携带不同的参数时&#xff0c;我们就可以使用事件委派自定义属性编程式导航 的方式&#xff0c;用最小的内存实现路由跳转的最大效率。 为什么我们不用router-link 进行跳转&#xff1f; 要知道&#xff0c;我们页面中…