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

Jieba分词的原理及应用(三)

前言

“结巴”中文分词:做最好的 Python 中文分词组件

上一篇文章讲了使用TF-IDF+分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景,在喂给模型之前需要进行分词操作。

分词的手段有很多,其中最常用的手段还是Jieba库进行分词。(大模型除外,大模型的因为分词对输入的token很重要,所以需要单独训练自己的Tokenizer)

下面这篇文章就来讲一讲Jieba分词的原理和使用吧~~

还是老规矩,从原理出发,并使用代码帮忙辅助理解。
在这里插入图片描述
(结巴说话就像在分词一样,不知道作者当初是不是这么想的起了个这个名字)

1.原理

官网上对Jieba分词的原理描述如下:

  • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
  • 采用动态规划查找最大概率路径,找出基于词频的最大切分组合
  • 对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法

是不是很抽象,完全不懂他在说啥。

So,I’m coming,我的作用就到了,就让我来给大家详细讲一下它到底是怎么回事吧

1.前缀词典(前缀树或Trie)

其中每个节点代表一个字符串的前缀。每个节点的字节点代表的字服饰该前缀的延伸。这样就可以高效的实现字符串集合的存储和查询操作,特别是前缀匹配。

  • 结构
    • 根节点:不含字符,通常代表一个空字符串
    • 边:从一个节点到另一个节点的变表示一个字符
    • 节点:每个节点代表从根节点到当前节点的字符序列
    • 叶子节点:完整的字符串
  • 基本操作
    • 插入(Insert):将一个字符串插入到 Trie 中。
    • 搜索(Search):检查一个字符串是否存在于 Trie 中。
    • 前缀匹配(Prefix Search):查找以某个前缀开头的所有字符串。
  • 前缀树代码

字典树(Trie)是一种专门用于处理字符串集合的数据结构,尤其适用于前缀匹配操作

class TrieNode:def __init__(self):self.children = {}self.is_end_of_word = Falseclass Trie:def __init__(self):self.root = TrieNode()def insert(self, word):node = self.rootfor char in word:if char not in node.children:node.children[char] = TrieNode()node = node.children[char]node.is_end_of_word = Truedef search(self, word):node = self.rootfor char in word:if char not in node.children:return Falsenode = node.children[char]return node.is_end_of_worddef starts_with(self, prefix):node = self.rootfor char in prefix:if char not in node.children:return Falsenode = node.children[char]return True# 使用示例
trie = Trie()
trie.insert("apple")
print(trie.search("apple"))    # 输出: True
print(trie.search("app"))      # 输出: False
print(trie.starts_with("app")) # 输出: True
trie.insert("app")
print(trie.search("app"))      # 输出: True
  • 有向图环图代码

是更通用的数据结构

class TrieNode:def __init__(self):self.children = {}self.is_end_of_word = Falseclass Trie:def __init__(self):self.root = TrieNode()def insert(self, word):node = self.rootfor char in word:if char not in node.children:node.children[char] = TrieNode()node = node.children[char]node.is_end_of_word = Truedef search(self, word):node = self.rootfor char in word:if char not in node.children:return Falsenode = node.children[char]return node.is_end_of_worddef build_dag(sentence, trie):n = len(sentence)dag = {i: [] for i in range(n)}for i in range(n):node = trie.rootj = iwhile j < n and sentence[j] in node.children:node = node.children[sentence[j]]if node.is_end_of_word:dag[i].append(j + 1)j += 1return dag# 示例词典和句子
words = ["有", "资格", "讨论", "黑客", "精神", "技术", "工作者", "拒绝", "铜臭", "然后", "分享", "转", "强"]
trie = Trie()
for word in words:trie.insert(word)sentence = "有资格讨论黑客精神的技术工作者首先是要拒绝铜臭然后是要分享技术。"
dag = build_dag(sentence, trie)# 打印 DAG
for key in dag:print(f'{key}: {dag[key]}')
  • 有向无环图和前缀树的区别
    • 用途不同
      • Trie 主要用于存储和快速查找字符串集合,适合前缀匹配。
      • DAG 用于表示从起点到终点的所有可能路径,适合处理句子的所有分词路径
    • 结构不同
      • Trie 的结构是树形的,每个插入的字符串有一条唯一路径。
      • DAG 的结构是图形的,允许多个路径表示不同的词组合。(允许一个节点有多条边指向多个节点)

2.动态规划

  • 定义概率模型:对于每个词w,定义其概率P(w)。通常,这个概率是基于词频统计得出的: P(w) = 词w的频率 / 语料库中总词数
  • 定义动态规划状态:定义dp[i]表示从句子开始到第i个字的最大概率路径的概率
  • 动态规划递推:从句子末尾向开头遍历,对于每个位置idp[i] = max(P(w) * dp[j]), 其中w是从 i 到 j 的词, j > i
  • 记录最优路径: 在计算dp[i]的同时,记录导致最大概率的切分点j。这通常用一个route数组来存储。
  • 回溯构建最优分词结果:从句首开始,根据route数组回溯,即可得到最优分词序列

具体实现步骤:

  1. 初始化:dp[n] = 1, n为句子长度 route[n] = n
  2. 从后向前遍历句子: for i in range(n-1, -1, -1): dp[i] = 0 for j in DAG[i]: # j是从i开始可能的词的结束位置 prob = P(sentence[i:j+1]) * dp[j+1] if prob > dp[i]: dp[i] = prob route[i] = j
for i in range(n-1, -1, -1): dp[i] = 0 for j in DAG[i]: # j是从i开始可能的词的结束位置 prob = P(sentence[i:j+1]) * dp[j+1] if prob > dp[i]: dp[i] = prob route[i] = j
  1. 分词结果回溯:
i = 0 
result = [] 
while i < n: j = route[i] result.append(sentence[i:j+1]) i = j + 1

这种方法的优点是:

  1. 考虑了词的概率(频率),有利于选择更常见的词组合。
  2. 使用动态规划,避免了重复计算,提高了效率。
  3. 能够全局最优化,找到整个句子的最佳分词方案。

3.隐马尔可夫模型与维特比算法

这里比较难,鉴于HMM在NLP领域乃至整个人工智能领域的重要性,我会之后专门出一篇文章来进行详细说明。

这一步主要用于处理未登录词(Out-Of-Vocabulary, OOV),即在词典中没有出现的词。

1.HMM模型概述:

隐马尔可夫模型(Hidden Markov Model, HMM)在这里用于模拟汉字的成词能力。我们将词的边界视为隐藏状态,观察到的是汉字序列。

2.HMM的要素:

  • 状态集合: S = {B, M, E, S}
    B: 词的开头, M: 词的中间, E: 词的结尾, S: 单字成词
  • 观察集合: O = {所有可能的汉字}
  • 初始状态概率: π
  • 状态转移概率: A
  • 发射概率(观察概率): B

3.Viterbi算法:

用于找出最可能的隐藏状态序列,即最可能的分词方案。

4.具体实现步骤:

  1. 模型训练:
    使用已分词的语料库估计HMM的参数(π, A, B)。(Baum-Welch算法

  2. Viterbi算法实现:
    a. 初始化:
    对于每个字c_i和每个可能的状态s:
    V [ 0 ] [ s ] = π [ s ] ∗ B [ s ] [ c 0 ] V[0][s] = π[s] * B[s][c_0] V[0][s]=π[s]B[s][c0]
    p a t h [ 0 ] [ s ] = [ s ] path[0][s] = [s] path[0][s]=[s]

    b. 递推:
    对于t从1到T-1 (T是句子长度):
    对于每个当前状态s:
    V [ t ] [ s ] = m a x ( V [ t − 1 ] [ s ′ ] ∗ A [ s ′ ] [ s ] ∗ B [ s ] [ c t ] ) V[t][s] = max(V[t-1][s'] * A[s'][s] * B[s][c_t]) V[t][s]=max(V[t1][s]A[s][s]B[s][ct])
    p a t h [ t ] [ s ] = p a t h [ t − 1 ] [ a r g m a x ( s ′ ) ] + [ s ] path[t][s] = path[t-1][argmax(s')] + [s] path[t][s]=path[t1][argmax(s)]+[s]

    c. 终止:
    最优路径的概率 = m a x ( V [ T − 1 ] [ s ] ) max(V[T-1][s]) max(V[T1][s])
    最优路径 = p a t h [ T − 1 ] [ a r g m a x ( s ) ] path[T-1][argmax(s)] path[T1][argmax(s)]

  3. 根据最优路径进行分词:
    将连续的BM*E序列或单独的S标记为一个词。

5.优点:

  1. 能够处理未登录词,提高分词系统的鲁棒性。
  2. 考虑了汉字的上下文信息,有助于提高分词准确性。
  3. Viterbi算法保证了在HMM模型假设下的全局最优解。

6.限制:

  1. HMM模型假设状态之间是马尔可夫的,这在实际语言中可能不总是成立。
  2. 需要大量已分词的语料库来训练模型参数。
  3. 对于非常罕见的字符组合,可能表现不佳。

4.综合示例:用"我要去北京"串联全流程

假设词典包含以下词及词频:

{"我": 1000, "要": 800, "去": 1500, "北京": 2000, "北": 500, "京": 300}

步骤1:构建DAG

原始句子:0 1 2 3 4我 要 去 北 京

DAG构建过程:

位置0:"我"是词 → [1]
位置1:"要"是词 → [2]
位置2:"去"是词 → [3]
位置3:"北"是词 → [4]"北京"是词 → [5]
位置4:"京"是词 → [5]

最终DAG:

0: [1]
1: [2]
2: [3]
3: [4,5]  # 既可以单独切分"北",也可以合并为"北京"
4: [5]

步骤2:动态规划计算

计算最大概率路径(假设总词频为10000):

dp[5] = 1
dp[4] = 300/10000 * 1 = 0.03
dp[3] = max(500/10000 * dp[4] = 0.0015,2000/10000 * dp[5] = 0.2
) → 0.2
dp[2] = 1500/10000 * dp[3] = 0.03
dp[1] = 800/10000 * dp[2] = 0.0024
dp[0] = 1000/10000 * dp[1] = 0.00024

最优路径回溯:

0→1→2→3→5 → 分词为 ["我", "要", "去", "北京"]

步骤3:HMM处理未登录词

假设现在有个句子:“我要去清华”("清华"不在词典中)

HMM模型通过以下状态序列判断:

汉 字: 清  华
HMM状态: B  E  # 组成双字词
概率计算:
P(清|B) * P(华|E) * P(B→E) > P(清|S) * P(华|S)
最终切分为 ["我", "要", "去", "清华"]

5.关键点总结

  • 词典优先:先用前缀词典找到所有可能的词组合

  • 概率最优:通过动态规划选择全局最优的常见词组合

  • 容错机制:HMM处理词典未覆盖的新词,保证对未知词汇的处理能力

  • 效率平衡:Trie提升查找效率,动态规划避免重复计算,HMM仅在必要时触发

2.实践应用

1.精确模式分词

import jiebatext = "结巴分词是一个很好用的中文分词工具"
words = jieba.cut(text, cut_all=False)
print("精确模式:" + "/".join(words))
# 输出: 
# 精确模式:结巴/分词/是/一个/很/好/用/的/中文/分词/工具

2.全模式分词

words = jieba.cut(text, cut_all=True)
print("全模式:" + "/".join(words))
# 输出: 
# 全模式:结巴/分词/是/一个/很/好/用/的/中文/分词/工具

3.搜索引擎模式

words = jieba.cut_for_search(text)
print("搜索引擎模式:" + "/".join(words))
# 输出: 
# 搜索引擎模式:结巴/分词/是/一个/很/好/用/的/中文/分词/工具

4.添加自定义词典

import oswith open("user_dict.txt", "w", encoding="utf-8") as f:f.write("结巴分词 100\n")f.write("自然语言处理 100")jieba.load_userdict("user_dict.txt")
# user_dict.txt 文件内容示例:
# 结巴分词 n
# 自然语言处理 ntext = "结巴分词在自然语言处理中非常有用"
words = jieba.cut(text)
print("使用自定义词典:" + "/".join(words))
# 输出: 使用自定义词典:结巴分词/在/自然语言处理/中/非常/有用

5.词性标注

import jieba.posseg as psegwords = pseg.cut(text)
for word, flag in words:print(f"{word} {flag}")
# 输出:
# 结巴分词 x
# 在 p
# 自然语言处理 x
# 中 f
# 非常 d
# 有用 v

6.TF-IDF分析(Term Frequency-Inverse Document Frequency)

from jieba import analysetext = "结巴分词是一个很好用的中文分词工具,对中文自然语言处理很有帮助"
tfidf = analyse.extract_tags(text, topK=5, withWeight=True)
for word, weight in tfidf:print(f"{word} {weight}")
# 输出:
# 中文 2.0370262532875
# 结巴分词 1.4943459378625
# 自然语言处理 1.4943459378625
# 分词 1.462931634325
# 工具 0.764681704455

7.获取词语位置信息

result = jieba.tokenize(text)
for tk in result:print("word %s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))# word 结巴分词		 start: 0 		 end:4
# word 是		 start: 4 		 end:5
# word 一个		 start: 5 		 end:7
# word 很		 start: 7 		 end:8
# word 好		 start: 8 		 end:9
# word 用		 start: 9 		 end:10
# word 的		 start: 10 		 end:11
# word 中文		 start: 11 		 end:13
# word 分词		 start: 13 		 end:15
# word 工具		 start: 15 		 end:17
# word ,		 start: 17 		 end:18
# word 对		 start: 18 		 end:19
# word 中文		 start: 19 		 end:21
# word 自然语言处理		 start: 21 		 end:27
# word 很		 start: 27 		 end:28
# word 有		 start: 28 		 end:29
# word 帮助		 start: 29 		 end:31

3.总结和展望

在这篇文章中,我们十分深入的理解了什么是结巴分词,从最底层的原理出发,利用代码进行辅助,并用一个例子将整个内容串起来。最后还有对Jieba库的一个简单说明。

相信大家在度过这篇文章之后,应该对Jieba分词不再陌生了吧。

思考题🤔

  1. 结巴分词的时间复杂度是多少呢?为什么企业中还是这么热衷于结巴分词呢?

下期预告🚀
1.最早的预训练语言模型W2C及其变体

相关文章:

Jieba分词的原理及应用(三)

前言 “结巴”中文分词&#xff1a;做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景&#xff0c;在喂给模型之前需要进行分词操作。 分词的手段有很多&#xff0c;其中最常用的手段还是Jieba库进行…...

神经网络背后的数学原理

神经网络背后的数学原理 数学建模神经网络数学原理 数学建模 标题民科味道满满。其实这篇小短文就是自我娱乐。 物理世界是物种多样&#xff0c;千姿百态。可以从不同的看待眼中的世界&#xff0c;包括音乐、绘画、舞蹈、雕塑等各种艺术形式。但这些主观的呈现虽然在各人眼中…...

常用图像滤波及色彩调节操作(Opencv)

1. 常用滤波/模糊操作 import cv2 import numpy as np import matplotlib.pyplot as plotimg cv2.imread("tmp.jpg") img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_g cv2.GaussianBlur(img, (7,7), 0) img_mb cv2.medianBlur(img, ksize7) #中指滤波 img_bm …...

FFMPEG和opencv的编译

首先 sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-de…...

用户登录不上linux服务器

一般出现这种问题&#xff0c;重新用root用户修改lsy用户的密码即可登录&#xff0c;但是当修改了还是登录不了的时候&#xff0c;去修改一个文件用root才能修改&#xff0c; 然后在最后添加上改用户的名字&#xff0c;例如 原本是只有user的&#xff0c;现在我加上了lsy了&a…...

【项目管理】第11章 项目成本管理-- 知识点整理

相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 ​ ​ (二)知识笔记​ 第11章 项目成本管理 ​ 1.管理基础…...

Python中的strip()

文章目录 基本语法&#xff1a;示例&#xff1a;1. 默认移除空白字符&#xff1a;2. 移除指定字符&#xff1a;3. 不修改原字符串&#xff1a; 相关方法&#xff1a;示例&#xff1a; 注意事项&#xff1a; 在 Python 中&#xff0c; strip() 是一个字符串方法&#xff0c;用于…...

设计模式 Day 9:命令模式(Command Pattern)完整讲解与实战应用

&#x1f504; 回顾 Day 8&#xff1a;策略模式 在 Day 8 中我们讲解了策略模式&#xff1a; 用于封装多个可切换的算法逻辑&#xff0c;让调用者在运行时选择合适的策略。它强调的是“行为选择”&#xff0c;是针对“算法或行为差异”而设计。通过 PaymentStrategy、路径规划…...

【正点原子】STM32MP257 同构多核架构下的 ADC 电压采集与处理应用开发实战

在嵌入式系统中&#xff0c;ADC模拟电压的读取是常见的需求。如何高效、并发、且可控地完成数据采集与处理&#xff1f;本篇文章通过双线程分别绑定在 Linux 系统的不同 CPU 核心上&#xff0c;采集 /sys/bus/iio 接口的 ADC 原始值与缩放系数 scale&#xff0c;并在另一个核上…...

区块链从专家到小白

文章目录 含义应用场景典型特征 含义 以非对称加密算法为基础。 每个**区块&#xff08;Block&#xff09;**包含&#xff1a; ​交易数据​&#xff08;如转账记录、合约内容&#xff09;。 ​时间戳​&#xff08;记录生成时间&#xff09;。 ​哈希值​&#xff08;当前区…...

记录centos8安装宝塔过程(两个脚本)

1、切换系统源&#xff08;方便使用宝塔安装脚本下载&#xff09; bash <(curl -sSL https://linuxmirrors.cn/main.sh) 2、宝塔安装脚本在宝塔的官网 宝塔面板下载&#xff0c;免费全能的服务器运维软件 根据自己的系统选择相应的脚本 urlhttps://download.bt.cn/insta…...

DAY 42 leetcode 151--哈希表.反转字符串中的单词

题号151 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 我的解法 暴力解法&#xff0c;先将String转为字…...

[VTK] 四元素实现旋转平移

VTK 实现旋转&#xff0c;有四元数的方案&#xff0c;也有 vtkTransform 的方案&#xff1b;主要示例代码如下&#xff1a; //构造旋转四元数vtkQuaterniond rotation;rotation.SetRotationAngleAndAxis(vtkMath::RadiansFromDegrees(90.0),0.0, 1.0, 0.0);//构造旋转点四元数v…...

AI大模型:(二)2.2 分词器Tokenizer

目录 1.分词技术的发展 2.分词器原理 2.1.基于词分词 2.2.基于字符分词 2.3.基于子词分词 3.手搓Byte-Pair Encoding (BPE)分词及训练 3.1.Byte-Pair Encoding (BPE)分词原理 3.2.手搓Byte-Pair Encoding (BPE)分词器 4.如何选择已有的分词器 1. 常见子词分词器及特点…...

codeforces A. Simple Palindrome

目录 题面 代码 题面 A. 简单回文串 每个测试用例时间限制&#xff1a;1 秒 每个测试用例内存限制&#xff1a;256 兆字节 纳雷克要在幼儿园陪一些两岁的孩子度过两个小时。他想教孩子们竞技编程&#xff0c;他们的第一堂课是关于回文串的。 纳雷克发现孩子们只认识英文字母…...

Linux 进程基础(一):冯诺依曼结构

文章目录 一、冯诺依曼体系结构是什么&#xff1f;&#x1f9e0;二、冯诺依曼体系为何成为计算机组成的最终选择&#xff1f;&#xff08;一&#xff09;三大核心优势奠定主流地位&#xff08;二&#xff09;对比其他架构的不可替代性 三、存储分级&#xff1a;速度与容量的平衡…...

向量存储(VectorStore)详解

一、向量存储的核心概念 向量存储&#xff08;VectorStore&#xff09;是一种用于存储和检索高维向量数据的数据库或存储解决方案&#xff0c;特别适用于处理经过嵌入模型转化后的数据。与传统关系数据库不同&#xff0c;VectorStore 执行的是相似性搜索&#xff0c;而非精确匹…...

HCIP(网络类型)

网络类型概述 网络类型主要基于数据链路层使用的协议不同&#xff0c;导致数据包封装方式不同&#xff0c;工作方式也有所区别。根据这些特点&#xff0c;网络可以被分类为以下几种类型&#xff1a; MA网络&#xff08;多点接入网络&#xff09;&#xff1a;允许同时接入多台…...

MTCNN 人脸识别

前言 此处介绍强大的 MTCNN 模块&#xff0c;给出demo&#xff0c;展示MTCNN 的 OOP&#xff0c; 以及ROS利用 C 节点&#xff0c;命令行调用脚本执行实际工作的思路。 MTCNN Script import argparse import cv2 from mtcnn import MTCNN import osclass MTCNNProcessor:def…...

一文解析DeepSeek R1模型

1. DeepSeek R1-Zero 在训练DeepSeek R1之前&#xff0c;深度求索团队尝试做了一个DeepSeek R1-Zero的模型&#xff0c;只进行强化学习而不需要监督微调&#xff0c;以此来强化模型自我推理的能力。 通过下图回顾下ChatGPT的做法&#xff1a;首先SFT&#xff0c;然后训练奖励…...

SpringMVC基础三(json)

乱码处理 编写一个表单&#xff1a; 编写EncodingController控制类 测试&#xff1a; 此乱码是在从前端传送到test方法时就已经乱了。 采用过滤器解决乱码 在web.xml中配置SpringMVC的乱码过滤器 <filter><filter-name>encoding</filter-name><filter…...

spring boot大文件与多文件下载

一、简单大文件下载&#xff1a; /*** 下载大文件* param path 路径* param fileName 文件名* return* throws IOException*/ public static ResponseEntity<InputStreamResource> downloadFile(String path, String fileName) throws IOException {Path filePath Path…...

事务隔离级别和MVCC

事务隔离级别 mysql是一个客户端/服务器架构的软件&#xff0c;对于同一个服务器来说&#xff0c;可以有多个客户端与之连接。每个客户端与服务器连接后就形成了一个会话。每个客户端都可以在自己的会话中向服务器发出请求语句&#xff0c;一个请求语句可能是某个事务的一部分…...

Ubuntu 系统深度清理:彻底卸载 Redis 服务及残留配置

Ubuntu 系统深度清理&#xff1a;彻底卸载 Redis 服务及残留配置 在Ubuntu系统中&#xff0c;Redis是一种广泛使用的内存数据存储系统&#xff0c;用于缓存和消息传递等场景。然而&#xff0c;有时候我们需要彻底卸载Redis&#xff0c;以清理系统资源或为其他应用腾出空间。本…...

关于群晖安装tailscale后无法直链的问题

问题是我局域网的ipv6无法正确获取到ip, 通过命令可以看到ipv6没有ip tailscale netcheck C:\Users\Administrator>tailscale netcheck 2025/04/12 23:43:34 attempting to fetch a DERPMap from https://controlplane.tailscale.comReport:* Time: 2025-04-12T15:43:38.27…...

第十二章:FreeRTOS多任务创建与删除

FreeRTOS多任务创建与删除教程 概述 本教程介绍FreeRTOS多任务的创建与删除方法&#xff0c;主要涉及两个核心函数&#xff1a; 任务创建&#xff1a;xTaskCreate()任务删除&#xff1a;vTaskDelete() 实践步骤 1. 准备工程文件 复制005工程并重命名为006 2. 创建多个任务…...

JavaScript数组方法:`some()`的全面解析与应用

文章目录 JavaScript数组方法&#xff1a;some()的全面解析与应用一、some()方法的基本概念语法参数说明返回值 二、some()方法的核心特点三、基础用法示例示例1&#xff1a;检查数组中是否有大于10的元素示例2&#xff1a;检查字符串数组中是否包含特定子串 四、实际应用场景1…...

IntelliJ IDEA历史版本下载安装链接

IntelliJ IDEA | Other Versions 拿走&#xff0c;不谢O(∩_∩)O...

Rag实现流程

Rag实现流程 目录 Rag实现流程1. 加载问答链代码解释`chain_type="stuff"` 的含义其他 `chain_type` 参数选项及特点1. `map_reduce`2. `refine`3. `map_rerank`示例代码展示不同 `chain_type` 的使用其他参数类型2. 提出问题3. 检索相关文档代码解释其他参数类型4. …...

设计模式 --- 命令模式

命令模式是一种行为设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而允许你使用不同的请求、队列或日志来参数化其他对象&#xff0c;同时支持请求的撤销与恢复。 优点&#xff1a; 1.解耦调用者与接收者​​&#xff1a;输入处理无需直接调用角色方法 2.支持撤销…...

C# TCP与ip通信

一、获取本机的ip地址 // 获取本地主机名 string hostName Dns.GetHostName(); string ip "127.0.0.1"; //Console.WriteLine("本地主机名: " hostName);// 获取本地IP地址 IPAddress[] addresses Dns.GetHostAddresses(hostName); Console.WriteLine…...

如何使用 Grafana 连接 Easyearch

Grafana 介绍 Grafana 是一款开源的跨平台数据可视化与监控分析工具&#xff0c;专为时序数据&#xff08;如服务器性能指标、应用程序日志、业务数据等&#xff09;设计。它通过直观的仪表盘&#xff08;Dashboards&#xff09;帮助用户实时监控系统状态、分析趋势&#xff0…...

ubuntu20.04 openvino的yolov8推理(nncf量化)

1.环境配置&#xff1a; pip install openvino-dev(2023.0.1) pip install nncf(2.5.0) pip install ultralytics 2.模型转换及nncf量化&#xff1a; 1.pytorch->onnx: # Pytorch模型转换为Onnx模型 python from ultralytics import YOLO model YOLO(yolov8s.pt) # yo…...

《Python星球日记》第26天:Matplotlib 可视化

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 订阅专栏&#xff1a;《Python星球日记》 目录 一、Matplotlib 简介1. 什么是 Matplo…...

2025蓝桥杯python A组题解

真捐款去了&#xff0c;好长时间没练了&#xff0c;感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了&#xff0c; G G G 也只写了爆搜。 题解其实队友都写好了&#xff0c;我就粘一下自己的代码&#xff0c;稍微提点个人的理解水一篇题解 队友题解 B 思路&#xff1a; 我…...

OpenHarmony - 小型系统内核(LiteOS-A)(一)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;一&#xff09; 一、小型系统内核概述 简介 OpenHarmony 轻量级内核是基于IoT领域轻量级物联网操作系统Huawei LiteOS内核演进发展的新一代内核&#xff0c;包含LiteOS-M和LiteOS-A两类内核。LiteOS-…...

Neo4j GDS-13-neo4j GDS 库中节点插入算法实现

neo4j GDS 系列 Neo4j APOC-01-图数据库 apoc 插件介绍 Neo4j GDS-01-graph-data-science 图数据科学插件库概览 Neo4j GDS-02-graph-data-science 插件库安装实战笔记 Neo4j GDS-03-graph-data-science 简单聊一聊图数据科学插件库 Neo4j GDS-04-图的中心性分析介绍 Neo…...

js中this的指向问题

前言&#xff1a; 在js中&#xff0c;this出现的位置多种多样&#xff0c;你会不会迷糊呢&#xff1f;this到底指代的是哪个对象&#xff1f;这篇文章带你搞懂不同场景下this的指向问题。 this出现场景&#xff1a; 从作用域的角度来讲&#xff0c;this出现的位置无非就是两…...

【3dSwap】3D-Aware Face Swapping

文章目录 3D-Aware Face Swapping背景points贡献方法从2D图像推断3D先验通过潜在代码操纵进行人脸交换联合枢轴调整目标函数实验与二维人脸交换方法比较进一步分析3D感知人脸交换消融实验局限性3D-Aware Face Swapping 会议/期刊:CVPR 2023 作者: code:https://lyx0208.gi…...

基于STM32的智能门禁系统

2.1系统方案设计 本课题为基于STM32的智能门禁系统的设计&#xff0c;其系统架构如图2.1所示&#xff0c;整个系统由STM32F103单片机和MaixBit开发板两部分构成&#xff0c;其中MaixBit是基于K210芯片的开发板&#xff0c;在此主要负责人脸的录入&#xff0c;识别&#xff0c;…...

用链表、信号,实现简易MP3项目

链表实现MP3 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <time.h> #include <dirent.h> #include <sys/stat.h> #include <sys/types.h> #include <glob.h> #inc…...

YOLO检测目标后实现距离测量

当我们使用YOLO检测器得到检测结果后&#xff0c;我们如何计算检测的物体距离相机的位置呢&#xff1f; 目前&#xff0c;有三种较为主流的距离计算方法&#xff0c;分别是单目测距、双目测距以及基于深度估计的测距方法。 单目测距 工作原理&#xff1a;单目测距使用一个摄像…...

js 效果展示 拿去练手

自学完整功能&#xff0c;拿去练手。 鼠标移动放大 通过网盘分享的文件&#xff1a;图片放大 链接: https://pan.baidu.com/s/1w8SjtKi4kUNDnZtRDfYMeQ?pwd95p6 提取码: 95p6 通过网盘分享的文件&#xff1a;图片动画效果 链接: https://pan.baidu.com/s/1Pjphx-Cc4HQQNNujr…...

【算法】 欧拉函数与欧拉降幂 python

欧拉函数 欧拉函数 ϕ ( n ) \phi(n) ϕ(n) 表示小于等于 n 的正整数中与 n 互质的数的个数。即&#xff1a; ϕ ( n ) ∣ { k ∈ Z ∣ 1 ≤ k ≤ n , gcd ⁡ ( k , n ) 1 } ∣ \phi(n) \left| \{ k \in \mathbb{Z}^ \mid 1 \leq k \leq n, \gcd(k, n) 1 \} \right| ϕ(n)…...

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标&#xff0c;qt设置&#xff0c;可以在只启动HMI的时候隐藏光标&#xff0c;退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…...

QT聊天项目DAY01

1.新建初始项目 2.修改UI格式 运行效果 3.创建登录界面 设计登录界面UI 设计布局 调整布局间距 往水平布局中拖入标签和文本输入框 更换控件名称并固定高度 添加窗口部件 往现有的资源文件中导入图片 添加水平布局 4.设置登陆界面为主窗口的核心组件 #pragma once#include &l…...

Stable Diffusion +双Contronet:从 ControlNet 边缘图到双条件融合:实现服装图像生成的技术演进——项目学习记录

前言 学习记录contronet优化&#xff1a;最近&#xff0c;我基于 diffusers 库的 ControlNet&#xff0c;探索了如何通过 Canny 边缘图控制服装图像生成&#xff0c;并逐步升级到融合颜色图的双条件模型。有不断的问题、解决和进步&#xff0c;从最初的边缘图生成到最终实现 2…...

【Hadoop入门】Hadoop生态之Spark简介

1 什么是Spark&#xff1f; Apache Spark 是一个开源的分布式计算框架&#xff0c;专为处理大规模数据而设计。它提供了高效、通用的集群计算能力&#xff0c;支持内存计算&#xff0c;能够显著提高数据处理和分析的速度。Spark 已经成为大数据处理领域的重要工具&#xff0c;广…...

深度学习学习笔记

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…...

小米运维面试题及参考答案(80道面试题)

请讲解一下 linux top 后进程的状态 在 Linux 系统中,使用top命令可以查看系统中正在运行的进程的相关信息,进程通常有以下几种状态: 运行(R):表示进程正在 CPU 上运行或者正在运行队列中等待运行。处于运行状态的进程正在积极地使用 CPU 资源来执行其任务。睡眠(S):进…...