NLP中的主题模型:LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配)
探索自然语言处理中的主题模型:LDA与狄利克雷分布
主题模型是一种用于发现文档集合中潜在主题的概率生成模型。其中,LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配)是最著名的主题模型之一。在 LDA 中,狄利克雷分布起到了核心作用,用于建模文档-主题分布和主题-单词分布。关于迪利克雷分布的前置知识,请移步笔者的另一篇文章:深入理解:狄利克雷分布(Dirichlet Distribution)
本文将带你了解以下内容:
- 什么是主题模型?
- 什么是 LDA,它是如何工作的?
- 狄利克雷分布在 LDA 中的作用是什么?
- …
- 使用 Python 实现一个简单的 LDA 示例。
- …
- 详细解析:文档中单词生成概率公式
- …
- 为什么主题分布和单词分布可以用狄利克雷分布建模?
一、什么是主题模型?
主题模型的目标是从文档集合中自动发现潜在的主题。
假设有一组文档,每篇文档由单词构成,但文档背后隐藏着一些主题,例如:
- 一篇文档谈论“篮球”,可能包含单词 球员、比赛、NBA;
- 另一篇文档关于“科技”,可能包含单词 AI、编程、区块链。
主题模型的任务:
根据文档中的单词,找到主题,并计算:
- 每篇文档属于各个主题的概率;
- 每个主题中单词的概率分布。
二、LDA 模型简介
LDA 是一种生成式概率模型,假设文档是由多个主题的单词混合生成的。它背后的思想如下:
-
文档生成过程:
- 每篇文档的主题分布服从一个狄利克雷分布 ( θ ∼ Dirichlet ( α ) \boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}) θ∼Dirichlet(α) );
- 每个主题的单词分布也服从一个狄利克雷分布 ( ϕ ∼ Dirichlet ( β ) \boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}) ϕ∼Dirichlet(β) )。
-
生成步骤:
- 对于每篇文档:
- 从主题分布 ( θ \boldsymbol{\theta} θ ) 中抽取一个主题 ( z z z );
- 从主题 ( z z z ) 的单词分布 ( ϕ z \boldsymbol{\phi}_z ϕz ) 中抽取一个单词。
- 对于每篇文档:
-
数学公式:
给定 ( K K K ) 个主题和文档 ( d d d ),文档 ( d d d ) 中单词的生成概率为:
P ( w ) = ∏ n = 1 N ∑ z = 1 K P ( w n ∣ z ; ϕ ) P ( z ∣ d ; θ ) , P(w) = \prod_{n=1}^{N} \sum_{z=1}^{K} P(w_n | z; \boldsymbol{\phi}) P(z | d; \boldsymbol{\theta}), P(w)=n=1∏Nz=1∑KP(wn∣z;ϕ)P(z∣d;θ),
其中:- ( P ( w n ∣ z ; ϕ ) P(w_n | z; \boldsymbol{\phi}) P(wn∣z;ϕ) ):主题 ( z z z ) 中单词的概率;
- ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) ):文档 ( d d d ) 的主题分布。
三、狄利克雷分布在 LDA 中的作用
在 LDA 中,狄利克雷分布主要有两个作用:
-
建模文档的主题分布:
文档 ( d d d ) 的主题分布 ( θ \boldsymbol{\theta} θ ) 服从狄利克雷分布 ( Dirichlet ( α ) \text{Dirichlet}(\boldsymbol{\alpha}) Dirichlet(α) ),
θ ∼ Dirichlet ( α ) , \boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}), θ∼Dirichlet(α),
其中 ( α \boldsymbol{\alpha} α ) 控制主题分布的稀疏性。如果 ( α \alpha α ) 很小,文档倾向于集中于少数主题;如果 ( α \alpha α ) 很大,文档可能涉及多个主题。 -
建模主题的单词分布:
每个主题 ( z z z ) 的单词分布 ( ϕ \boldsymbol{\phi} ϕ ) 服从狄利克雷分布 ( Dirichlet ( β ) \text{Dirichlet}(\boldsymbol{\beta}) Dirichlet(β) ),
ϕ ∼ Dirichlet ( β ) , \boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}), ϕ∼Dirichlet(β),
( β \boldsymbol{\beta} β ) 控制每个主题中单词分布的稀疏性。
四、实际应用场景
-
文档分类:
在一组文档中自动发现主题,帮助理解文档内容。例如,将新闻分为“体育”、“科技”等类别。 -
推荐系统:
根据用户浏览历史中的主题分布,推荐相关主题的内容。 -
文本摘要:
从文档中提取主要主题及其关键词,生成摘要。
五、代码实现:使用 Python 的 LDA 示例
我们使用 Python 的 gensim
库来实现一个简单的 LDA 示例。
安装依赖
pip install gensim pandas nltk
数据预处理
假设我们有以下文档:
# 文档数据
documents = ["篮球 球员 比赛 NBA","比赛 体育 篮球","编程 AI 技术 代码","AI 区块链 编程","NBA 球队 篮球 体育","区块链 金融 技术"
]
实现 LDA 模型
from gensim import corpora
from gensim.models import LdaModel# 数据预处理
texts = [doc.split() for doc in documents] # 将每篇文档分词
dictionary = corpora.Dictionary(texts) # 构建词典
corpus = [dictionary.doc2bow(text) for text in texts] # 将文档转换为词袋模型# 训练 LDA 模型
lda = LdaModel(corpus, num_topics=2, id2word=dictionary, passes=10)# 输出主题及关键词
for idx, topic in lda.print_topics(-1):print(f"主题 {idx + 1}:{topic}")
输出示例
主题 1:0.40*"篮球" + 0.30*"体育" + 0.20*"比赛" + 0.10*"NBA"
主题 2:0.35*"编程" + 0.25*"AI" + 0.20*"区块链" + 0.10*"技术"
六、总结
- LDA 模型简介:LDA 是一种生成式概率模型,利用狄利克雷分布建模文档主题分布和主题单词分布。
- 狄利克雷分布的作用:控制分布稀疏性,让文档偏向少数主题或均匀分布。
- 代码实现:通过
gensim
库,我们可以快速实现 LDA 模型,分析文档集合的主题。
通过本文,你可以对 LDA 和狄利克雷分布的原理和应用有一个初步的了解。如果感兴趣,还可以深入研究其推导过程及参数优化方法,例如变分推断或吉布斯采样。
七、详细解析:文档中单词生成概率公式
在 LDA 模型中,文档的生成是一个概率过程,目标是通过主题分布和单词分布,描述文档中每个单词出现的概率。具体公式为:
P ( w ) = ∏ n = 1 N ∑ z = 1 K P ( w n ∣ z ; ϕ ) P ( z ∣ d ; θ ) , P(w) = \prod_{n=1}^N \sum_{z=1}^K P(w_n | z; \boldsymbol{\phi}) P(z | d; \boldsymbol{\theta}), P(w)=n=1∏Nz=1∑KP(wn∣z;ϕ)P(z∣d;θ),
这里:
- ( w w w ) 是文档中的所有单词集合;
- ( w n w_n wn ) 是文档中第 ( n n n ) 个单词;
- ( z z z ) 是主题的潜在变量(未观测到的随机变量),表示单词 ( w n w_n wn ) 属于的主题;
- ( ϕ \boldsymbol{\phi} ϕ ) 是每个主题的单词分布;
- ( θ \boldsymbol{\theta} θ ) 是文档的主题分布。
公式背后的含义
-
生成每个单词的概率:
- 对于文档中的每个单词 ( w n w_n wn ),
- 首先从文档的主题分布 ( θ \boldsymbol{\theta} θ ) 中抽取一个主题 ( z z z ),概率为 ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) );
- 然后在选定的主题 ( z z z ) 中,从其单词分布 ( ϕ z \boldsymbol{\phi}_z ϕz ) 中抽取单词 ( w n w_n wn ),概率为 ( P ( w n ∣ z ; ϕ ) P(w_n | z; \boldsymbol{\phi}) P(wn∣z;ϕ) )。
- 对于文档中的每个单词 ( w n w_n wn ),
-
对主题的求和:
- 由于每个单词可能来自多个主题(概率由 ( P ( z ∣ d ; θ ) P(z | d; \boldsymbol{\theta}) P(z∣d;θ) ) 决定),需要对所有主题 ( z z z ) 的可能性求和。
-
整个文档的生成:
- 文档 ( w w w ) 中所有单词的生成概率是每个单词生成概率的乘积,假设单词之间相互独立。
举例说明
假设有以下文档和主题:
- 文档 ( d d d ):“篮球 比赛 体育”;
- 主题集合 ( { z 1 : 体育 , z 2 : 科技 } \{z_1: \text{体育}, z_2: \text{科技}\} {z1:体育,z2:科技} );
- 主题分布 ( θ \boldsymbol{\theta} θ ):文档 ( d d d ) 的主题分布为 ( P ( z 1 ∣ d ) = 0.8 P(z_1|d) = 0.8 P(z1∣d)=0.8 ), ( P ( z 2 ∣ d ) = 0.2 P(z_2|d) = 0.2 P(z2∣d)=0.2 );
- 单词分布 ( ϕ \boldsymbol{\phi} ϕ ):
- 对于 ( z 1 z_1 z1 ):( P ( 篮球 ∣ z 1 ) = 0.5 P(\text{篮球}|z_1) = 0.5 P(篮球∣z1)=0.5 ), ( P ( 比赛 ∣ z 1 ) = 0.3 P(\text{比赛}|z_1) = 0.3 P(比赛∣z1)=0.3 ), ( P ( 体育 ∣ z 1 ) = 0.2 P(\text{体育}|z_1) = 0.2 P(体育∣z1)=0.2 );
- 对于 ( z 2 z_2 z2 ):( P ( 篮球 ∣ z 2 ) = 0.1 P(\text{篮球}|z_2) = 0.1 P(篮球∣z2)=0.1 ), ( P ( 比赛 ∣ z 2 ) = 0.1 P(\text{比赛}|z_2) = 0.1 P(比赛∣z2)=0.1 ), ( P ( 体育 ∣ z 2 ) = 0.8 P(\text{体育}|z_2) = 0.8 P(体育∣z2)=0.8 )。
第一步:计算单词“篮球”的生成概率
根据公式:
P ( 篮球 ) = ∑ z = 1 K P ( 篮球 ∣ z ; ϕ ) P ( z ∣ d ; θ ) , P(\text{篮球}) = \sum_{z=1}^K P(\text{篮球}|z; \boldsymbol{\phi}) P(z|d; \boldsymbol{\theta}), P(篮球)=z=1∑KP(篮球∣z;ϕ)P(z∣d;θ),
有:
P ( 篮球 ) = P ( 篮球 ∣ z 1 ) P ( z 1 ∣ d ) + P ( 篮球 ∣ z 2 ) P ( z 2 ∣ d ) , P(\text{篮球}) = P(\text{篮球}|z_1) P(z_1|d) + P(\text{篮球}|z_2) P(z_2|d), P(篮球)=P(篮球∣z1)P(z1∣d)+P(篮球∣z2)P(z2∣d),
代入数据:
P ( 篮球 ) = ( 0.5 × 0.8 ) + ( 0.1 × 0.2 ) = 0.4 + 0.02 = 0.42. P(\text{篮球}) = (0.5 \times 0.8) + (0.1 \times 0.2) = 0.4 + 0.02 = 0.42. P(篮球)=(0.5×0.8)+(0.1×0.2)=0.4+0.02=0.42.
第二步:计算整个文档的生成概率
文档 ( d d d ) 的单词为 ( 篮球 , 比赛 , 体育 \text{篮球}, \text{比赛}, \text{体育} 篮球,比赛,体育 ),
P ( d ) = P ( 篮球 ) × P ( 比赛 ) × P ( 体育 ) , P(d) = P(\text{篮球}) \times P(\text{比赛}) \times P(\text{体育}), P(d)=P(篮球)×P(比赛)×P(体育),
其中:
- ( P ( 比赛 ) = ( 0.3 × 0.8 ) + ( 0.1 × 0.2 ) = 0.24 + 0.02 = 0.26 P(\text{比赛}) = (0.3 \times 0.8) + (0.1 \times 0.2) = 0.24 + 0.02 = 0.26 P(比赛)=(0.3×0.8)+(0.1×0.2)=0.24+0.02=0.26 );
- ( P ( 体育 ) = ( 0.2 × 0.8 ) + ( 0.8 × 0.2 ) = 0.16 + 0.16 = 0.32 P(\text{体育}) = (0.2 \times 0.8) + (0.8 \times 0.2) = 0.16 + 0.16 = 0.32 P(体育)=(0.2×0.8)+(0.8×0.2)=0.16+0.16=0.32 )。
因此:
P ( d ) = 0.42 × 0.26 × 0.32 = 0.034944. P(d) = 0.42 \times 0.26 \times 0.32 = 0.034944. P(d)=0.42×0.26×0.32=0.034944.
八、公式的意义和实际应用
- 意义:通过文档中单词的生成概率公式,LDA 能够估计文档中不同主题的比例以及每个主题中单词的重要性,从而将文档归类到相应主题。
- 实际应用:在新闻分类、推荐系统、文档聚类等任务中,LDA 是一种简单而高效的方法,能揭示文档集合的潜在主题结构。
九、为什么主题分布和单词分布可以用狄利克雷分布建模?
在 LDA 模型中,主题分布 ( θ \boldsymbol{\theta} θ ) 和单词分布 ( ϕ \boldsymbol{\phi} ϕ ) 都被假设服从狄利克雷分布,即:
θ ∼ Dirichlet ( α ) , \boldsymbol{\theta} \sim \text{Dirichlet}(\boldsymbol{\alpha}), θ∼Dirichlet(α),
ϕ ∼ Dirichlet ( β ) , \boldsymbol{\phi} \sim \text{Dirichlet}(\boldsymbol{\beta}), ϕ∼Dirichlet(β),
这背后有数学和实际应用的双重考虑,狄利克雷分布的选择并不是偶然的,而是基于其独特的性质和与多项分布的密切关系。
1. 狄利克雷分布的特点
狄利克雷分布是多项分布的共轭先验分布,具有以下特点:
-
多项分布的先验分布
- LDA 中,主题分布 ( θ \boldsymbol{\theta} θ ) 描述一个文档中各个主题的比例,这些比例的总和为 1(如 ( θ 1 + θ 2 + ⋯ + θ K = 1 \theta_1 + \theta_2 + \cdots + \theta_K = 1 θ1+θ2+⋯+θK=1 )),符合简单 x x x 的概率要求。
- 类似地,单词分布 ( ϕ \boldsymbol{\phi} ϕ ) 描述每个主题中单词的比例,也满足归一化条件 ( ϕ 1 + ϕ 2 + ⋯ + ϕ V = 1 \phi_1 + \phi_2 + \cdots + \phi_V = 1 ϕ1+ϕ2+⋯+ϕV=1 )。
狄利克雷分布正是定义在这样一个单位 K − 1 K-1 K−1 维单纯形上的分布,能够自然地对概率分布建模。
-
共轭性
- 共轭分布的性质使得后验分布仍然属于同一分布族,从而大大简化了推断过程。在贝叶斯推断中,狄利克雷分布是多项分布的共轭先验,这意味着:
P ( θ ∣ 数据 ) ∝ P ( 数据 ∣ θ ) P ( θ ) , P(\boldsymbol{\theta} | \text{数据}) \propto P(\text{数据} | \boldsymbol{\theta}) P(\boldsymbol{\theta}), P(θ∣数据)∝P(数据∣θ)P(θ),
后验分布 ( P ( θ ∣ 数据 ) P(\boldsymbol{\theta} | \text{数据}) P(θ∣数据) ) 仍然是狄利克雷分布。
- 共轭分布的性质使得后验分布仍然属于同一分布族,从而大大简化了推断过程。在贝叶斯推断中,狄利克雷分布是多项分布的共轭先验,这意味着:
-
可控的稀疏性
- 狄利克雷分布的参数 ( α \boldsymbol{\alpha} α )(或 ( β \boldsymbol{\beta} β ))可以控制分布的稀疏性。具体来说:
- 若 ( α i ≪ 1 \alpha_i \ll 1 αi≪1 ),表示分布倾向于稀疏,即大多数概率质量集中在少数分量上;
- 若 ( α i > 1 \alpha_i > 1 αi>1 ),表示分布倾向于均匀。
- 在 LDA 中,可以通过调节 ( α \boldsymbol{\alpha} α ) 控制文档中的主题稀疏性,以及通过 ( β \boldsymbol{\beta} β ) 控制主题中的单词稀疏性,这与实际应用需求非常吻合。
- 狄利克雷分布的参数 ( α \boldsymbol{\alpha} α )(或 ( β \boldsymbol{\beta} β ))可以控制分布的稀疏性。具体来说:
2. 为何不用其他分布?
虽然理论上可以用其他分布(如正态分布、指数分布)来建模,但这些分布在概率模型中的适用性远不如狄利克雷分布,具体原因如下:
-
正态分布
正态分布定义在实数域上,而主题分布和单词分布需要满足归一化条件(所有分量非负,总和为 1),这与正态分布的定义域不符。 -
指数分布
指数分布通常用于建模正值随机变量,但同样无法直接用于表示归一化的概率分布。 -
狄利克雷分布的简单性与解释性
狄利克雷分布提供了一种直观的方式来控制主题和单词分布的稀疏性,同时具有优雅的数学性质(如共轭性),这使得模型推导和计算更加简洁高效。
3. 实际意义与应用场景
为什么主题分布用狄利克雷分布?
文档中的主题分布(( θ \boldsymbol{\theta} θ ))表示一个文档可能属于不同主题的概率分布,比如某篇文章可能是 80% 的“科技”、15% 的“体育”和 5% 的“娱乐”。这些概率必须满足以下条件:
- 非负性:每个主题的概率非负;
- 归一化:所有主题的概率之和等于 1。
狄利克雷分布在单位单纯形上定义,因此可以自然地建模这种分布。通过调整 ( α \boldsymbol{\alpha} α ),可以反映文档中主题的分布特性:
- 当 ( α \boldsymbol{\alpha} α ) 很小(如 ( α i ≪ 1 \alpha_i \ll 1 αi≪1 )),大多数文档只会涉及少数几个主题;
- 当 ( α \boldsymbol{\alpha} α ) 较大(如 ( α i > 1 \alpha_i > 1 αi>1 )),文档更可能均匀分布在所有主题上。
为什么单词分布用狄利克雷分布?
主题中的单词分布(( ϕ \boldsymbol{\phi} ϕ ))表示某个主题下各个单词出现的概率分布。例如,在“科技”主题下,可能“算法”出现的概率很高,而“足球”出现的概率很低。这种分布的特点是:
- 非负性:每个单词的概率非负;
- 归一化:所有单词的概率之和等于 1。
狄利克雷分布能够很好地描述这种分布,且其稀疏性特性能够反映实际语言中主题的稀疏性——即一个主题通常只关注少数关键词。
4. 例子:主题建模中的参数控制
假设我们有以下设置:
- ( α = [ 0.1 , 0.1 , 0.1 ] \boldsymbol{\alpha} = [0.1, 0.1, 0.1] α=[0.1,0.1,0.1] ):文档的主题分布非常稀疏,大多数文档可能集中在 1 个主题上;
- ( β = [ 0.1 , 0.1 , 0.1 ] \boldsymbol{\beta} = [0.1, 0.1, 0.1] β=[0.1,0.1,0.1] ):主题中的单词分布也非常稀疏,每个主题可能只会关注少数几个单词。
此时,生成的文档可能表现为:
- 文档 1:95% 属于“科技”主题,主要包含“算法”、“数据”;
- 文档 2:90% 属于“体育”主题,主要包含“足球”、“比赛”;
- 文档 3:85% 属于“娱乐”主题,主要包含“电影”、“明星”。
通过调整 ( α \boldsymbol{\alpha} α ) 和 ( β \boldsymbol{\beta} β ),可以灵活地控制主题建模的细粒度和稀疏性。
后记
2024年11月30日13点31分于上海,在GPT4o大模型辅助下完成。
相关文章:
NLP中的主题模型:LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配)
探索自然语言处理中的主题模型:LDA与狄利克雷分布 主题模型是一种用于发现文档集合中潜在主题的概率生成模型。其中,LDA(Latent Dirichlet Allocation, 潜在狄利克雷分配)是最著名的主题模型之一。在 LDA 中,狄利克雷…...
javaweb Day11
Maven高级 1.分模块设计...
pnpm的menorepo项目配置eslint和prettier
1、使用eslint脚手架安装相关依赖并生成对应配置文件 pnpm dlx eslint/create-config 自动安装了以下几个插件 生成的配置文件如下所示,和csdn其他教程里面不一样,这是因为eslint升级成9.xx版本了 需要node版本20以上 eslint 9.x 升级或使用指南…...
从0开始linux(38)——线程(1)线程概念
欢迎来到博主专栏:从0开始linux 博主ID:代码小豪 文章目录 进程与线程线程概念线程的优点线程的独立数据 进程与线程 如果要理解线程,那么进程将会时绕不开的点。首先我们回顾一下我们之前在进程章节当中是如何描述进程的? 进程&…...
【Linux系统编程】:进程池(简易版)
目录 1.制作游戏菜单 2.对管道进行描述和组织 3.初始化管道 3.1子进程执行任务slaver() 3.2检查管道是否创建有误 4.父进程向管道写入(控制子进程执行任务) 5.清理资源 修改初始化管道代码 6.完整代码: 1.制作游戏菜单 我们利用管道…...
uniapp实现小程序的版本更新
参考官方文档:uni.getUpdateManager() | uni-app官网 uni.getUpdateManager()是uniapp框架提供的一个API,用于管理小程序的版本更新。这个API返回一个全局唯一的版本更新管理器对象,该对象可以用于检测新版本、下载新版本以及提示用户重启应…...
嵌入式QT学习第4天:Qt 信号与槽
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本章思维导图如下: 不使用 Qt Designer 的方式进行开发,用代码绘界面,可以锻炼我们的布局能力,和代码逻辑能力&#x…...
`asyncio.wait` 和 `asyncio.gather` 的区别
asyncio.wait 和 asyncio.gather 的区别 1. asyncio.wait2. asyncio.gather主要区别总结 在Python的异步编程中,asyncio.wait 和 asyncio.gather 都是用于等待多个异步任务完成的工具,但它们在功能和使用方式上有一些关键的区别。本文将详细解释这两个函…...
【JavaEE】多线程(2)
一、线程安全 1.1 线程安全的概念 线程是随机调度执行的,如果多线程环境下的程序运行的结果符合我们预期则说明线程安全,反之,如果遇到其他结果甚至引起了bug则说明线程不安全 1.2 经典例子与解释 下面举一个经典的线程不安全的例子&…...
虚拟地址空间与物理内存(Linux系统)
个人主页:敲上瘾-CSDN博客 个人专栏:Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 问题引入 一、什么是虚拟内存 二、虚拟内存的描述与组织 三、页表的优势 四、虚拟内存区域划分 问题引入 为引入今天的话题,我们先来看下面…...
iOS Arkit机器学习相关
最近在搞追踪运动物体,然后Arkit识别3d模型和图片,静止状态还不错,运动时候效果还是有点差,所以搞了下苹果的CoreML,苹果官网也有一些训练好的模型 苹果模型列表,自己参考或者使用,提供一个数据…...
Maven CMD命令
打包测试命令 在当前文件中 >mvn clean package -D maven.test.skiptrue 基本命令 mvn clean 清理目标目录(target)中的输出文件。 mvn compile 编译主源代码路径(src/main/java)下的 Java 代码。 mvn test-compile 编译测试源…...
DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)
在工作中需要对DM-VIO算法进行测试,于是配置并记录了一下: 首先运行ros接口的dm-vio,一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压,并安装一下依赖: sudo apt-get install …...
DETR:一种新颖的端到端目标检测与分割框架
DETR:一种新颖的端到端目标检测与分割框架 摘要: 随着深度学习技术的发展,目标检测和图像分割任务取得了显著的进步。然而,传统的基于区域提名的方法在处理这些问题时存在一定的局限性。为此,Facebook AI Research&am…...
Android 输入事件拦截机制
Keyboard产生按键事件后,会通过notifyKey开始传递: frameworks\native\services\inputflinger\InputDispatcher.cpp void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {...uint32_t policyFlags args->policyFlags;//只关注policyFlags…...
【Figma】中文版安装
一、软件安装包下载 打开官网链接https://www.figma.com/downloads/下载相应安装包 或使用我已下载好的链接: FigmaSetup.exe 链接: https://pan.baidu.com/s/113eQ8JRETdeOwUp2B3uieA?pwd4vep 二、安装流程 1.点击安装包 2.选择在浏览器登录 3.输入账号密码&a…...
SolarCube: 高分辨率太阳辐照预测基准数据集
太阳能作为清洁能源在减缓气候变化中的作用日益凸显,其稳定的供应对电网管理至关重要。然而,太阳辐照受云层和天气变化的影响波动较大,给光伏电力的管理带来挑战,尤其是在调度、储能和备用系统管理方面。因此,精确的太…...
arkTS:持久化储存UI状态的基本用法(PersistentStorage)
arkUI:持久化储存UI状态的基本用法(PersistentStorage) 1 主要内容说明2 例子2.1 持久化储存UI状态的基本用法(PersistentStorage)2.1.1 源码1的相关说明2.1.1.1 数据存储2.1.1.2 数据读取2.1.1.3 动态更新2.1.1.4 显示…...
【Canvas与雷达】点鼠标可暂停金边蓝屏雷达显示屏
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>点鼠标可暂停金边蓝屏雷达显示屏 Draft1</title><style typ…...
第二部分shell----二、shell 条件测试
一、基本语法 在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。当指定的条件为 真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。 1.test<测试表…...
node修改文件名称
node修改名称 var fs require(fs); const events require(events); var path require(path);init(); function init() {//要遍历的文件夹所在的路径const dirPath path.resolve(__dirname, "data");//遍历目录fileDisplay(dirPath); }/*** 文件遍历* param dirP…...
Vue教程|搭建vue项目|Vue-CLI新版脚手架
一、安装Node环境 安装Node及Npm环境 Node下载地址:Node.js — Run JavaScript EverywhereNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en/ 安装完成后,检查安装是否成功,并检查版本,命令如下: node -v npm -v mac@Macd…...
Java设计模式
Java设计模式 一、观察者设计模式1.1 概述1.2 结构1.3 特点1. 优点2. 缺点3. 使用场景 1.4 JDK中的实现1. Observable 类2. Observer 接口3. 例子 二、模板设计模式三、单例设计模式一、懒汉式单例二、饿汉式单例 四、Builder模式4.1 概述4.2 结构4.3 具体实现4.4 使用场景 一、…...
java 接口防抖
防抖:防止重复提交 在Web系统中,表单提交是一个非常常见的功能,如果不加控制,容易因为用户的误操作或网络延迟导致同一请求被发送多次,进而生成重复的数据记录。要针对用户的误操作,前端通常会实现按钮的l…...
[C++并发编程] 线程基础
线程发起 最简单的发起一个线程。 void thread_work(std::string str) {std::cout << "str: " << std << std::endl; } //初始化并启动一个线程 std::thread t1(thread, wangzn2016); 线程等待: 线程发起后,可能新的线…...
基于若依框架和Vue2 + Element-UI 实现图片上传组件的重写与优化
背景 在使用 若依分离版Element-UI 的图片上传组件时,需要根据业务需求进行定制化处理,比如: 需要传递额外的业务参数到后端需要对上传路径进行修改需要对上传组件进行样式定制 实现步骤 1. 创建本地组件 首先在业务模块下创建本地的图片上传组件: src/views/xxx/compone…...
自定义类型: 结构体、枚举 、联合
目录 结构体 结构体类型的声明 匿名结构体 结构的自引用 结构体变量的定义和初始化 结构体成员变量的访问 结构体内存对齐 结构体传参 位段 位段类型的声明 位段的内存分配 位段的跨平台问题 位段的应用 枚举 枚举类型的定义 枚举的优点 联合体(共用体) 联合…...
力扣98:验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1: 输入…...
Java Stream reduce 函数,聚合数据
Stream.reduce() 是 Stream 的一个聚合方法,它可以把一个 Stream 的所有元素按照自定义聚合逻辑,聚合成一个结果。 先看一个简单数字求和: public class Main {public static void main(String[] args){int sum Stream.of(1, 2…...
npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open
这里写目录标题 报错信息1解决方案 报错信息2解决方案 报错信息1 使用npm install -gvue/cli时,发生报错,报错图片如下: 根据报错信息可以知道,缺少package.json文件。 解决方案 缺什么补什么,这里我们使用命令npm…...
阿里云服务器(centos7.6)部署前后端分离项目(MAC环境)
Jdk17安装部署 下载地址:https://www.oracle.com/java/technologies/downloads/ 选择自己需要的jdk版本进行下载。 通过mac终端scp命令上传下载好的jdk17到服务器的/usr/local目录下 scp -r Downloads/jdk-17.0.13_linux-x64_bin.tar.gz 用户名服务器ip地址:/us…...
【机器学习】机器学习基础
什么是机器学习? 机器学习(Machine Learning, ML)是一种人工智能(AI)的分支,指计算机通过数据学习规律并做出预测或决策,而无需明确编程。它的核心目标是让机器能够从经验中学习,逐…...
BUUCTF—Reverse—Java逆向解密(10)
程序员小张不小心弄丢了加密文件用的秘钥,已知还好小张曾经编写了一个秘钥验证算法,聪明的你能帮小张找到秘钥吗? 注意:得到的 flag 请包上 flag{} 提交 需要用专门的Java反编译软件:jd-gui 下载文件,发现是个class文…...
基于JSP+MySQL的网上招聘系统的设计与实现
摘要 在这样一个经济飞速发展的时代,人们的生存与生活问题已成为当代社会需要关注的一个焦点。对于一个刚刚 踏入社会的年轻人来说,他对就业市场和形势了解的不够详细,同时对自己的职业规划也很模糊,这就导致大量的 时间被花费在…...
js 中 file 文件 应用
文章目录 文件上传File 对象基本属性文件上传大文件上传文件格式校验通过 type 属性校验图片格式通过文件名扩展名校验 文件解析一、处理图片文件流(以 Blob 格式接收文件流为例)二、处理文本文件流三、处理 PDF 文件流(借助 PDF.js 库来展示…...
Java 泛型详细解析
泛型的定义 泛型类的定义 下面定义了一个泛型类 Pair,它有一个泛型参数 T。 public class Pair<T> {private T start;private T end; }实际使用的时候就可以给这个 T 指定任何实际的类型,比如下面所示,就指定了实际类型为 LocalDate…...
「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏
本篇将带你实现一个简单的数字猜谜游戏。用户输入一个数字,应用会判断是否接近目标数字,并提供提示“高一点”或“低一点”,直到用户猜中目标数字。这个小游戏结合状态管理和用户交互,是一个入门级的互动应用示例。 关键词 UI互…...
自然语言处理期末试题汇总
建议自己做,写完再来对答案。答案可能存在极小部分错误,不保证一定正确。 一、选择题 1-10、C A D B D B C D A A 11-20、A A A C A B D B B A 21-30、B C C D D A C A C B 31-40、B B B C D A B B A A 41-50、B D B C A B B B B C 51-60、A D D …...
记录Threadlocal使用
编写ThreadLocal工具类 package com.jjking.jplan.context;public class BaseContext<T> {public static final ThreadLocal threadLocal new ThreadLocal();//存储用户public static void set(Object t) {threadLocal.set(t);}//获取用户public static <T> T ge…...
利用 SpringBoot 开发的新冠密接者跟踪系统:医疗机构疫情防控辅助方案
摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…...
vue 2 父组件根据注册事件,控制相关按钮显隐
目标效果 我不注册事件,那么就不显示相关的按钮 注册了事件,才会显示相关内容 实现思路 组件在 mounted 的时候可以拿到父组件注册监听的方法 拿到这个就可以做事情了 mounted() {console.log(this.$listeners, this.$listeners);this.show.search !…...
【深度学习基础】一篇入门模型评估指标(分类篇)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…...
hls视频流学习
hls格式播放的依赖安装: <!-- 新增hls播放库 -->npm install hls.js 组件封装: <template><div class"hls-player-cls"><video ref" video" controls style"width: 100%; max-width: 800px;">…...
【electron-vite】搭建electron+vue3框架基础
一、拉取项目 electron-vite 中文文档地址: https://cn-evite.netlify.app/guide/ 官网网址:https://evite.netlify.app/ 版本 vue版本:vue3 构建工具:vite 框架类型:Electron JS语法:TypeScript &…...
第三方Express 路由和路由中间件
文章目录 1、Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据。2、Express路由1.路由方法2.路由路径3.路由处理程序 3. 模块化路由4. Express中间件1.中间件简介2.中间件分类3.自定义中间件 1、Express 应用使用回调函数的参数&am…...
WPF 常用的5个布局容器控件介绍
1. Grid Grid 是最常用的布局容器之一,它允许开发者以表格的方式对控件进行组织和布局。Grid 使用行和列来划分区域,可以精确控制控件的位置和大小。 特点: 行列定义:Grid 使用 RowDefinitions 和 ColumnDefinitions 来定义行和…...
【JAVA] 杂谈: java中的拷贝(克隆方法)
这篇文章我们来介绍什么是拷贝,并且实现浅拷贝到深拷贝。 目录 一、浅拷贝 1.1 clone 方法 1.2 实现浅拷贝: 1.2.1 重写 clone方法 1.2.2 实现接口 Cloneable 1.2.3 调用克隆方法 1.2.4 原理图: 1.3 浅拷贝的不足 1.3.1 增加引用…...
同时多平台git配置:GitHub和Gitee生成不同的SSH Key
文章目录 GitHub和Gitee生成不同的SSH Key步骤1:生成SSH Key步骤2:配置SSH配置文件步骤3:查看SSH公钥步骤4:将SSH公钥添加到GitHub和Gitee步骤5:测试SSH连接步骤6:添加remote远程库 GitHub和Gitee生成不同的…...
flink1.6集成doris,并从mysql同步数据到doris
使用 Apache Flink 1.6 集成 Doris,并从 MySQL 同步数据到 Doris 是一个复杂的任务,但可以通过以下步骤实现。Doris 是一个现代化的 MPP(大规模并行处理)SQL 数据库,支持实时分析和交互式查询。Flink 可以作为实时数据…...
手搓一个不用中间件的分表策略
场景:针对一些特别的项目,不用中间件,以月为维度进行分表,代码详细设计方案 1. 定义分片策略 首先,定义一个分片策略类,用于决定数据存储在哪个分表中 import java.time.LocalDate; import java.time.fo…...