文本相似度 HanPL汉语言处理

news2024/9/29 5:32:44

文章目录

  • 前言
  • 需求
  • 简介
  • 实操开始
    • 1. 添加pom.xml依赖
    • 2. 文本相似度工具类
    • 3. 案例验证
    • 4. 验证结果
  • 总结


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、


提示:以下是本篇文章正文内容,下面案例可供参考

需求

当我们需要求两个或两个以上的字符串相似度百分比时,可以使用HanLP汉语言处理包来帮助我们,求两个文本的相似度百分比、海明距离、

简介

HanLP(Han Language Processing) 在汉语义处理方面具备强大的功能,由中国科学院计算技术研究所自然语言处理与社会人文计算研究中心开发。它提供了包括分词、词性标注、命名实体识别、依存句法分析、情感分析、文本分类等多种自然语言处理任务的功能。

主要功能:

  • 分词: HanLP提供了多种分词模型,包括基于规则的模型、基于神经网络的模型等,能够准确地进行中文分词。
  • 词性标注: 在分词的基础上,HanLP还能对词语进行词性标注,帮助理解词语在句子中的作用。
  • 命名实体识别: HanLP能够识别文本中的命名实体,如人名、地名、组织机构名等,这对于信息抽取等任务非常重要。
  • 依存句法分析: 通过对句子中各个词语之间的依存关系建模,HanLP能够分析句子结构,提取句子的语义信息。
  • 情感分析: HanLP支持对文本进行情感分析,判断文本所表达的情感倾向,如正面、负面或中性。
  • 文本分类: HanLP还提供了文本分类的功能,可以将文本按照预设的分类体系进行分类。

友情链接:HanLP项目主页 、HanLP下载地址、详细介绍

实操开始

注意: 本文以Java开发语言为案例

1. 添加pom.xml依赖

	    <!--junit依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!--hanlp语言处理依赖-->
        <dependency>
            <groupId>com.hankcs</groupId>
            <artifactId>hanlp</artifactId>
            <version>portable-1.7.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.3</version>
        </dependency>

2. 文本相似度工具类

import com.hankcs.hanlp.seg.common.Term;
import com.hankcs.hanlp.tokenizer.StandardTokenizer;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;

import java.math.BigInteger;
import java.util.*;

public class MySimHash {
    private String tokens; //字符串
    private BigInteger strSimHash;//字符产的hash值
    private int hashbits = 64; // 分词后的hash数;


    public MySimHash(String tokens) {
        this.tokens = tokens;
        this.strSimHash = this.simHash();
    }

    private MySimHash(String tokens, int hashbits) {
        this.tokens = tokens;
        this.hashbits = hashbits;
        this.strSimHash = this.simHash();
    }


    /**
     * 清除html标签
     *
     * @param content
     * @return
     */
    private String cleanResume(String content) {
        // 若输入为HTML,下面会过滤掉所有的HTML的tag
        content = Jsoup.clean(content, Whitelist.none());
        content = StringUtils.lowerCase(content);
        String[] strings = {" ", "\n", "\r", "\t", "\\r", "\\n", "\\t", "&nbsp;"};
        for (String s : strings) {
            content = content.replaceAll(s, "");
        }
        return content;
    }


    /**
     * 这个是对整个字符串进行hash计算
     *
     * @return
     */
    private BigInteger simHash() {
        tokens = cleanResume(tokens); // cleanResume 删除一些特殊字符
        int[] v = new int[this.hashbits];
        List<Term> termList = StandardTokenizer.segment(this.tokens); // 对字符串进行分词
        //对分词的一些特殊处理 : 比如: 根据词性添加权重 , 过滤掉标点符号 , 过滤超频词汇等;
        Map<String, Integer> weightOfNature = new HashMap<String, Integer>(); // 词性的权重
        weightOfNature.put("n", 2); //给名词的权重是2;
        Map<String, String> stopNatures = new HashMap<String, String>();//停用的词性 如一些标点符号之类的;
        stopNatures.put("w", ""); //
        int overCount = 5; //设定超频词汇的界限 ;
        Map<String, Integer> wordCount = new HashMap<String, Integer>();
        for (Term term : termList) {
            String word = term.word; //分词字符串
            String nature = term.nature.toString(); // 分词属性;
            //  过滤超频词
            if (wordCount.containsKey(word)) {
                int count = wordCount.get(word);
                if (count > overCount) {
                    continue;
                }
                wordCount.put(word, count + 1);
            } else {
                wordCount.put(word, 1);
            }
            // 过滤停用词性
            if (stopNatures.containsKey(nature)) {
                continue;
            }
            // 2、将每一个分词hash为一组固定长度的数列.比如 64bit 的一个整数.
            BigInteger t = this.hash(word);
            for (int i = 0; i < this.hashbits; i++) {
                BigInteger bitmask = new BigInteger("1").shiftLeft(i);
                // 3、建立一个长度为64的整数数组(假设要生成64位的数字指纹,也可以是其它数字),
                // 对每一个分词hash后的数列进行判断,如果是1000...1,那么数组的第一位和末尾一位加1,
                // 中间的62位减一,也就是说,逢1加1,逢0减1.一直到把所有的分词hash数列全部判断完毕.
                int weight = 1;  //添加权重
                if (weightOfNature.containsKey(nature)) {
                    weight = weightOfNature.get(nature);
                }
                if (t.and(bitmask).signum() != 0) {
                    // 这里是计算整个文档的所有特征的向量和
                    v[i] += weight;
                } else {
                    v[i] -= weight;
                }
            }
        }
        BigInteger fingerprint = new BigInteger("0");
        for (int i = 0; i < this.hashbits; i++) {
            if (v[i] >= 0) {
                fingerprint = fingerprint.add(new BigInteger("1").shiftLeft(i));
            }
        }
        return fingerprint;
    }


    /**
     * 对单个的分词进行hash计算;
     *
     * @param source
     * @return
     */
    private BigInteger hash(String source) {
        if (source == null || source.length() == 0) {
            return new BigInteger("0");
        } else {
            /**
             * 当sourece 的长度过短,会导致hash算法失效,因此需要对过短的词补偿
             */
            while (source.length() < 3) {
                source = source + source.charAt(0);
            }
            char[] sourceArray = source.toCharArray();
            BigInteger x = BigInteger.valueOf(((long) sourceArray[0]) << 7);
            BigInteger m = new BigInteger("1000003");
            BigInteger mask = new BigInteger("2").pow(this.hashbits).subtract(new BigInteger("1"));
            for (char item : sourceArray) {
                BigInteger temp = BigInteger.valueOf((long) item);
                x = x.multiply(m).xor(temp).and(mask);
            }
            x = x.xor(new BigInteger(String.valueOf(source.length())));
            if (x.equals(new BigInteger("-1"))) {
                x = new BigInteger("-2");
            }
            return x;
        }
    }

    /**
     * 计算海明距离,海明距离越小说明越相似;
     *
     * @param other
     * @return
     */
    private int hammingDistance(MySimHash other) {
        BigInteger m = new BigInteger("1").shiftLeft(this.hashbits).subtract(
                new BigInteger("1"));
        BigInteger x = this.strSimHash.xor(other.strSimHash).and(m);
        int tot = 0;
        while (x.signum() != 0) {
            tot += 1;
            x = x.and(x.subtract(new BigInteger("1")));
        }
        return tot;
    }


    /**
     * .
     * 求百分比
     *
     * @param s2
     * @return
     */
    public double getSemblance(MySimHash s2) {
        double i = (double) this.hammingDistance(s2);
        return 1 - i / this.hashbits;
    }

}

详细说明:

/*--------------------------------------相似度算法说明--------------------------------------
    借鉴hashmap算法找出可以hash的key值,因为我们使用的simhash是局部敏感哈希,这个算法的特点是只要相似的字符串只有个别的位数是有差别变化。
    那这样我们可以推断两个相似的文本,至少有16位的simhash是一样的。具体选择16位、8位、4位,大家根据自己的数据测试选择,虽然比较的位数越小越精准,但是空间会变大。
    分为4个16位段的存储空间是单独simhash存储空间的4倍。之前算出5000w数据是 382 Mb,扩大4倍1.5G左右,还可以接受:)  通过这样计算,我们的simhash查找过程全部降
    到了1毫秒以下。就加了一个hash效果这么厉害?我们可以算一下,原来是5000w次顺序比较,现在是少了2的16次方比较,前面16位变成了hash查找。后面的顺序比较的个数是多少?
    2^16 = 65536, 5000w/65536 = 763 次。。。。实际最后链表比较的数据也才 763次!所以效率大大提高!  到目前第一点降到3.6毫秒、支持5000w数据相似度比较做完了。
    还有第二点同一时刻发出的文本如果重复也只能保留一条和短文本相识度比较怎么解决。其实上面的问题解决了,这两个就不是什么问题了。  之前的评估一直都是按照线性计算来估计的,
    就算有多线程提交相似度计算比较,我们提供相似度计算服务器也需要线性计算。比如同时客户端发送过来两条需要比较相似度的请求,在服务器这边都进行了一个排队处理,一个接着一个,
    第一个处理完了在处理第二个,等到第一个处理完了也就加入了simhash库。所以只要服务端加了队列,就不存在同时请求不能判断的情况。 simhash如何处理短文本?换一种思路,
    simhash可以作为局部敏感哈希第一次计算缩小整个比较的范围,等到我们只有比较700多次比较时,就算使用我们之前精准度高计算很慢的编辑距离也可以搞定。当然如果觉得慢了,也可以使用余弦夹角等效率稍微高点的相似度算法";
     */

    /*--------------------------------------分词说明--------------------------------------
    分词,把需要判断文本分词形成这个文章的特征单词。 最后形成去掉噪音词的单词序列并为每个词加上权重,我们假设权重分为5个级别(1~5)。
    只要相似的字符串只有个别的位数是有差别变化。那这样我们可以推断两个相似的文本, 比如:“ 美国“51区”雇员称内部有9架飞碟,曾看见灰色外星人 ” ==>
    分词后为 “ 美国(4) 51区(5) 雇员(3) 称(1) 内部(2) 有(1) 9架(3) 飞碟(5) 曾(1) 看见(3) 灰色(4) 外星人(5)”, 括号里是代表单词在
    整个句子里重要程度,数字越大越重要。 2、hash,通过hash算法把每个词变成hash值, 比如“美国”通过hash算法计算为 100101, “51区”通过hash算法计算为 101011。
    这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,要把文章变为数字计算才能提高相似度计算性能,现在是降维过程进行时。 3、加权,通过 2步骤的hash生成结果,
    需要按照单词的权重形成加权数字串, 比如“美国”的hash值为“100101”,通过加权计算为“4 -4 -4 4 -4 4”;“51区”的hash值为“101011”,通过加权计算为 “ 5 -5 5 -5 5 5”。 4、合并,
    把上面各个单词算出来的序列值累加,变成只有一个序列串。 比如 “美国”的 “4 -4 -4 4 -4 4”,“51区”的 “ 5 -5 5 -5 5 5”, 把每一位进行累加, “4+5 -4+-5 -4+5 4+-5 -4+5 4+5” ==》 “9 -9 1 -1 1 9”。
    这里作为示例只算了两个单词的,真实计算需要把所有单词的序列串累加。 5、降维,把4步算出来的 “9 -9 1 -1 1 9” 变成 0 1 串,形成我们最终的simhash签名。 如果每一位大于0 记为 1,小于0 是统优先公司";


    /*--------------------------------------敏感哈希说明--------------------------------------
    算法找出可以hash的key值,因为我们使用的simhash是局部敏感哈希,这个算法的特点是只要相似的字 把需要判断文本分词形成这个文章的特征单词。
    最后形成去掉噪音词的只要相似的字符串只有个别的位数是有差别变化。那这样我们可以推断两个相似的文本,单词序分词是代表单词在整个句子里重要程度,数字越大越重要。
    2、hash,通过hash算法把每个词变成hash值, 比如“美国”通过hash算法计算为 100101, “51区”通过hash算法计算为 101011。 这样我们的字符串就变成了一串串数字,
    还记得文章开头说过的吗,要把文章变为数字加权,通过 家可能会有疑问,经过这么多步骤搞这么麻烦,不就是为了得到个 0 1 字符串吗?我直接把这个文本作为字符串输入v较,
    前面16位变成了hash查找。后面的顺序比较的个数是多,用hd5是用于生成唯一签来相差甚远;hashmap也是用于键值对查找,便于快速插入和查找的数据结构。不过我们主要解决的
    是文本相似度计算,要比较的是两个文章是否相识,当然我们降维生成了hashcode也是用于这个目的。看到这里估计大家就明白了,我们使用的sim是这样的,传统hash函数解决的是
    生成唯一值,比如 md5、hashmap等。md5是用于生成唯一签名串,只要稍微多加一个字符md5的两个数字看起来相差甚远;hashmap也是用于键值对查找,便于快速插入和查找的数
    据结构。不过我们主要解决的是文本相似度计算,要比较的是两个文章是否相识,当然我们降维生成了hashcode也是用于这个目的。看到这里估计大家就明白了,我们使用的simhash
    就算把文章中的字符串变成 01 串也还是可以用于计算相似度的,而传统的hashcode却不行。我们可以来做个测试,两个相差只有一个字符的文本串,“你妈妈喊你回家吃饭哦,回家
    罗回家罗” 和 “你妈妈叫你回家吃饭啦,回家罗回家罗”。短文本大量重复信息不会被过滤,是不是";
     */

    /*--------------------------------------过滤说明--------------------------------------
    最后形成去掉噪音词的单词序分词是代表单词在整个句子里重要程度,数字越大越重要。 最后形成去掉噪音词的单词序列并为每个词加上权重 2、hash,通过hash算法把每个词变成hash值,
    比如“美国”通过hash算法计算为 100101, “51区”通过hash算法计算为 101011。 这样我们的字符串就变成了一串串数字,还记得文章开头说过的吗,分为4个16位段的存储空间是单独simhash
    存储空间的4倍。之前算出5000w数据是 382 Mb,扩大4倍1.5G左右,还可以接受:) 要把文章变为数字加权,通过 家可能会有疑问,经过这么多步骤搞这么麻烦,不就是为了得到个 0 1 字符串吗?
    我直接把这个文本作为字符串输入,用hd5是用于生成唯一签来相差甚远;hashmap也是用于键值对查找,便于快速插入和查找的数据结构。不过我们主要解决的是文本相似度计算,要比较的是两个文章是否相识,
    当然我们降维生成了hashcode也是用于这个目的。看到这里估计大家就明白了,我们使用的sim是这样的,传统hash函数解决的是生成唯一值,比如 md5、hashmap等。md5是用于生成唯一签名串,只要稍微多加
    一个字符md5的两个数字看起来相差甚远;hashmap也是用于键值对查找,便于快速插入和查找的数据结构。不过我们主要解决的是文本相似度计算,要比较的是两个文章是否相识,当然我们降维生成了hashcode也
    是用于这个目的。看到这里估计大家就明白了,我们使用的simhash就算把文章中的字符串变成 01 串也还是可以用于计算相似度的,而传统的hashcode却不行。我们可以来做个测试,两个相差只有一个字符的文本
    串,“你妈妈喊你回家吃饭哦,回家罗回家罗” 和 “你妈妈叫你回家吃饭啦,回家罗回家罗”。短文本大量重复信息不会被过滤,";
     */

3. 案例验证

    public static void main(String[] args) {
        String text = "杏南一区";
        List<String> itemList = new LinkedList<String>();
        itemList.add("杏南一区");
        itemList.add("杏南二区");
        itemList.add("杏南三区");
        itemList.add("杏南四区");
        itemList.add("杏南五区");
        itemList.add("杏南六区");
        itemList.add("杏南七区");
        itemList.add("杏南八区");
        itemList.add("杏南九区");
        itemList.add("杏南十区");
        System.out.println("======================================");
        long startTime = System.currentTimeMillis();
        MySimHash hash1 = new MySimHash(text, 64);
        List<Double> list = new LinkedList<Double>();
        for (String str : itemList) {
            MySimHash hash2 = new MySimHash(str, 64);
            //海明距离越小说明越相似
            System.out.println("海明距离:" + hash1.hammingDistance(hash2) + "###" + "文本相似度:" + hash2.getSemblance(hash1));
            list.add(hash2.getSemblance(hash1));
        }
        long endTime = System.currentTimeMillis();
        Double max = Collections.max(list);
        int index = list.indexOf(max);//获取集合下标
        System.out.println("======================================");
        System.out.println("耗时:" + (endTime - startTime));
        System.out.println("相似度集合内容:" + list.toString());
        System.out.println("集合中最大值:" + max + "###" + "集合下标:" + index);
        System.out.println("对比内容:" + text + "###" + "相似度最高:" + itemList.get(index));
    }

4. 验证结果

测试

总结

我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

参考链接、

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

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

相关文章

【redis 第五篇章】持久化之AOF和RDB

一、概述 Redis 是内存数据库&#xff0c;如果不能将内存中的数据保存到磁盘中&#xff0c;那么一旦服务器进程退出&#xff0c;数据库中数据会消失&#xff0c;所以 Redis 提供了持久化的功能, Redis 分为两种持久化方式&#xff1a;RDB 和 AOF&#xff0c;有以下几个特点&am…

荟萃科技:国外问卷调查有没有实时更新的题库?

有的&#xff0c;口子查和渠道查都是。 口子查的题目都是国外的公司发放在网络上&#xff0c;都是实时发布&#xff0c;所以我们需要去国外的各大社交平台做题。 这些题目不是集中的&#xff0c;而是散布在网站里面&#xff0c;需要我们去找&#xff0c;都是老外上班实时发放…

数据结构(其二)--线性表(其三)

目录 11.特殊矩阵的压缩存储 &#xff08;1&#xff09;.一维数组的储存结构 &#xff08;2&#xff09;.二维数组的存储结构 &#xff08;3&#xff09;.普通矩阵的存储 &#xff08;4&#xff09;.特殊矩阵的压缩存储 i.对称矩阵 ii.三角矩阵 iii.三对角矩阵 iiii.稀疏矩…

社科经管类:7本期刊被标记为“On Hold”状态!

本周投稿推荐 SCI&EI • 4区“水刊”&#xff0c;纯正刊&#xff08;来稿即录&#xff09; • CCF-B类&#xff0c;IEEE一区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网&#xff08;CNKI&#xff09;、谷歌学术 …

Github 2024-08-05 开源项目周报 Top15

根据Github Trendings的统计,本周(2024-08-05统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目4JavaScript项目3Python项目3Java项目2TypeScript项目2C项目1Shell项目1Dockerfile项目1非开发语言项目1免费编程学习平台:freeCodeCamp…

2.2 (2) 调度算法

文章目录 调度算法的评价指标CPU利用率系统吞吐量周转时间等待时间响应时间总结 典型的调度算法先来先服务&#xff08;FCFS&#xff09;短作业优先&#xff08;SJF&#xff09;高响应比优先&#xff08;HRRN&#xff09;时间片轮转调度算法优先级调度算法多级反馈列队调度算法…

动态规划:打家劫舍系列

目录 1. 打家劫舍1(线性数组)(LeetCode198) 解法1&#xff1a;动态规划&#xff08;二维dp数组&#xff09; 解法2&#xff1a;动态规划&#xff08;一维dp数组&#xff09; 解法3&#xff1a;动态规划&#xff08;一维dp数组优化&#xff09; 2. 打家劫舍2(环形数组)…

信号处理——自相关和互相关分析

1.概括 在信号处理中&#xff0c;自相关和互相关是相关分析非常重要的概念&#xff0c;它们能分析一个信号或两个信号在时间维度的相似性&#xff0c;在振动测试分析、雷达测距和声发射探伤得到了广泛的应用。自相关分析的研究对象为一个信号&#xff0c;互相关分析的研究对象…

spring原理(第八天)

aop的实现原理 AOP 底层实现方式之一是代理&#xff0c;由代理结合通知和目标&#xff0c;提供增强功能 除此以外&#xff0c;aspectj 提供了两种另外的 AOP 底层实现&#xff1a; 第一种是通过 ajc 编译器在编译 class 类文件时&#xff0c;就把通知的增强功能&#xff0c;织…

Linux之文件系统

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 算法 C进阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.磁盘 二.对磁盘进行管理 三.通过inode找到文件…

Netty的几种IO模式的实现与切换

写在文章开头 今天我们就基于Netty来简单聊聊开发中几种常见的IO模式以及Netty对于这几种IO模式的实现&#xff0c;希望对你有帮助。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专家 &#xff0c;也是开源项…

如何在RabbitMQ中防止消息丢失

如何在RabbitMQ中防止消息丢失 在分布式系统中&#xff0c;消息的可靠传递是至关重要的。RabbitMQ作为一个强大的消息队列系统&#xff0c;提供了多种机制来确保消息不会丢失。本文将介绍在RabbitMQ中防止消息丢失的几种方法。 消息确认机制 消息发布确认 在RabbitMQ中&…

pdf转换器哪个好?不要错过这4款转换工具

pdf转换器哪个好&#xff1f;选择一款高效的PDF转换器&#xff0c;无疑能极大地便利我们的日常工作与学习。它不仅能够轻松实现PDF文件与Word、Excel、图片等多种格式之间的互转&#xff0c;还支持批量处理&#xff0c;显著提高工作效率。无论是编辑修改、格式调整还是分享传阅…

深入浅出消息队列----【RocketMQ 和 Kafka 消息存储差异对比】

深入浅出消息队列----【RocketMQ 和 Kafka 消息存储差异对比】 RocketMQ 的消息存储Kafka 的消息存储对比 RocketMQ 与 Kafka 本文仅是文章笔记&#xff0c;整理了原文章中重要的知识点、记录了个人的看法 文章来源&#xff1a;编程导航-鱼皮【yes哥深入浅出消息队列专栏】 Roc…

指南!网上卖药品需要什么资质?

随着互联网技术的飞速发展&#xff0c;医药电商已经成为药品和医疗器械销售的重要渠道。处方药的网络销售政策逐步放宽&#xff0c;医药电商行业迎来了快速发展的春天。在这一领域&#xff0c;主要的参与者包括药品销售公司和电商平台。 为了吸引流量和满足处方药审方的需求&a…

第18课 Scratch入门篇:时钟-当前时间

时钟 故事背景&#xff1a; 在一个遥远的科技星球上&#xff0c;时间对于居民们来说无比珍贵。这个星球上的居民们都是技术高手&#xff0c;他们使用先进的编程技术来管理自己的生活。然而&#xff0c;星球上的时间系统最近出现了故障&#xff0c;导致时间的流逝变得不稳定。为…

【终极指南】大模型二次开发:从零基础到高手之路

随着人工智能技术的发展&#xff0c;预训练的大模型&#xff08;例如GPT系列、BERT等&#xff09;已成为自然语言处理领域的关键技术之一。对于开发者来说&#xff0c;掌握如何基于这些大模型进行二次开发&#xff0c;不仅可以提升自身的技术实力&#xff0c;还能为企业带来更多…

Flink 如何处理背压

文章目录 目录 前言 一、什么是背压&#xff1f; 二、处理背压的步骤 1.模拟背压机制 2.为什么要关心背压问题&#xff1f; 总结 前言 初次接触Flink的同学会对背压有很多的疑问。本文就是我学习的一些心得和体会&#xff0c;以及借鉴一些文章的感想。 Flink 如何处理背压效应…

使用snap的安装docker配置阿里云镜像加速

使用snap安装docker非常的简单&#xff0c;一条命令即可 snap install docker 但是通过这个命令安装的docker, 配置阿里云镜像跟常规安装的配置起来不太一样, 下面讲一下配置流程 修改docker配置文件/var/snap/docker/current/config/daemon.json 这个文件应该是已经创建好…

重磅!LangChain 官方发布 Agent IDE!!

1 LangChain 开发现状 LangChain 从应用开发框架出发&#xff0c;提供了一套代码级工具集&#xff0c;旨在降低 LLM 的开发难度&#xff0c;在过去一年中吸引了众多开发者&#xff0c;助力他们迅速打造 AI 大模型应用。然而&#xff0c;还有一群用户&#xff0c;他们希望门槛…