阿里用户序列建模MIMN

news2024/11/13 14:58:41

Practice on Long Sequential User Behavior Modeling for Click-Through Rate Prediction

摘要

对于序列建模,实践了机器学习算法与在线服务协同设计的CTR预测系统,理论上可以处理无限长的用户序列。

从服务系统的角度来看,通过设计一个单独的模块用户兴趣中心UIC(User Interest Center),将用户兴趣模型中最消耗资源的部分与整个模型解耦。UIC维护最新的兴趣状态,对于每个用户,其更新取决于实时的用户行为触发事件,而不是流量请求,因此UIC是无延迟的实时CTR预测。

来自机器学习算法角度看,提出了一种新的基于内存的架构,命名为多通道用户兴趣记忆网络MIMN((Multi-channel user Interest Memory Network),捕捉来源于长序列行为的用户兴趣数据。

1. 简介

用户序列建模大致分为两类
(i) 基于pooling的结构,像Wide&Deep、YouTubeDNN、DIN将用户的历史行为视为独立的发出信号并应用sum/max/attention等池化操作来表示用户兴趣表示。
(ii) 顺序建模结构,像DIEN,将用户行为视为顺序信号并应用LSTM/GRU操作进行用户兴趣汇总,得到用户兴趣表示。

在工业应用中,将这些复杂的模型实时地部署到在线服务系统中需要付出很大的努力。每天数以亿计的用户访问系统,事情变得更加困难,因为模型都需要存储整个用户行为序列。这里“长”表示连续用户行为的长度达到1000条或者更多,系统延迟和存储成本增加与用户行为序列的长度近似成线性关系。正如DIEN所报告的那样,它需要做很多工程工作来部署顺序模型,它只处理最大长度为50的用户行为。

在这里插入图片描述
上图左边显示了用户行为的平均序列长度和用户活跃天数的关系图,右边是序列长度和AUC的关系图。可以明显看到,序列越长,取得的收益越大。

本文通过对机器学习算法和服务系统的协同设计来解决长序列建模的问题

(i) 服务系统视角:我们设计了一个单独的UIC(用户兴趣中心)模块。UIC关注用户行为的在线服务问题行为建模,为用户提供最新的兴趣表示每个用户。UIC的一个关键点是它的更新机制。更新只依赖于实时的用户行为触发事件,而不是流量请求。也就是说,UIC是无延迟的实时点击率预测。

(ii) 机器学习算法视角:仅解耦UIC模块无法解决存储问题,因为它仍然很难存储和进行推理
用户行为序列的长度扩展到1000到数百数以百万计的用户。这里我们借用记忆网络的概念
从NTM中提出了一种新的架构,称为MIMN(多通道用户兴趣记忆网络)。MIMN采用增量方式,可通过UIC模块实现很容易。这有助于解决存储挑战。此外,MIMN通过两种内存利用率设计改进了传统的NTM正则化和记忆归纳单元,使其更高效用于在有限存储空间下对用户行为序列进行建模。

总结:
• 提出了CTR预测的学习算法和服务系统协同设计实践。
• 设计了一种新颖的UIC模块,可以解耦沉重的负载从整个点击率预测中计算用户兴趣的过程。UIC对于流量请求是无延迟的,并且允许在离线中工作的任意复杂模型计算。
• 提出了一种新的MIMN模型,改进了原有的NTM体系结构,使其具有记忆利用正则化和记忆归纳单元,更加适合用户兴趣学习。

2. 相关工作

深度点击率模型
随着深度学习的快速发展,我们在许多领域都取得了进步,比如计算机视觉,自然语言处理。在这些成功的启发下,一大批基于深度学习的CTR预测方法已经提出。
方法上,这些方法利用神经网络来捕获特征交互,而不是传统的特征工程。虽然这个想法看起来很简单,但这些工作使CTR预测任务的发展向前迈出了一大步。之后,业界更加关注模型架构设计,而不是通过耗尽特征工程。除了学习特征交互之外,越来越多的方法被提出用于捕获从丰富的历史行为数据中获取用户洞察力。同时用户的兴趣是多种多样的,并且随着目标物料的不同而变化。DIN中引入了注意力机制来捕捉用户的兴趣。DIEN提出了一种辅助损失来获取潜在利益,具体的行为和改进GRU来模拟兴趣的进化。

长期用户利益
一些文章提出对用户的长期兴趣进行分类建模。增量模型的长期和短期用户兴趣得分,表达用户的兴趣。所有这些方法通过特征工程来建模长期利益,而不是自适应端到端学习。TDSSM提出联合建模,长期和短期用户利益提升推荐质量。不幸的是,这些基于深度学习的方法例如TDSSM, DIN, DIEN几乎不能实时部署,预测服务器面对极长的用户行为序列的
存储压力、计算延迟将随用户行为序列的长度增长而线性增长。
在工业应用中,行为序列的长度通常很小,例如50,虽然淘宝上的活跃用户可能会留下一些行为,比如点击,转换等,长度仅在两周内超过1000。

记忆网络
记忆网络NTM已被提出用于通过外部记忆组件提取知识。该思想已被广泛应用于NLP中,如问答系统。一些文章利用了记忆网络用于用户兴趣建模。然而,这些方法忽略了长期兴趣建模和实际部署问题。

3. 实时CTR预估系统

下图是实时CTR预估系统示意图:在这里插入图片描述

3.1 长序列用户行为建模的挑战

在工业应用中,如电子商务中的推荐系统行业中,在特性集中用户行为特征贡献量最大
。例如,在我们的系统中,近90%的特征是用户行为特征,剩下的10%是用户人口统计特征
特性和广告特性。这些行为数据包含丰富的信息,对用户兴趣建模很有价值。
在这里插入图片描述

上图显示了没有任何其他的努力,基本模型长度为1000的序列的AUC与100的长度相比提高了0.6%。一般0.3%AUC的改善对业务来说已经足够重要了,这表明利用这些长序列用户行为数据非常有价值。

但利用长序列行为数据带来了巨大的挑战。在推荐系统中,行为特征通常存储在一个
额外的分布式内存存储系统,这些特征被提取到预测服务器参与接收流量请求时的实时推理计算。根据实际经验,在我们的系统中实施DIEN,RTP系统的用户行为序列长度为150,延迟和吞吐量已经达到性能边缘,更别说长度为1000的情况。

长序列用户行为数据,因为它面临着几个挑战,其中最关键的两个包括:

存储约束 推荐系统有6亿用户,每个用户的行为序列的最大长度为150,存储约为1TB,不仅存储product_id,还存储其他相关功能id,如shop_id, brand_id等。当行为序列的长度达到1000需要6TB的存储空间。在我们的系统中使用高性能存储来保持低功耗延迟和高吞吐量,如此巨大的存储空间太昂贵了。因此,一个相当长的行为序列意味着不可接受的存储消耗。

耗时限制 深度网络非常具有挑战性,特别是在我们有大量请求的情况下。QPS为500耗时为14ms,当用户行为的长度可达1000,DIEN的耗时达到200毫秒,30ms就已经不可接受了。

3.2 用户兴趣中心UIC(User Interest Center)

为解决长序列用户行为的挑战,我们提出了机器学习算法和服务系统协同设计的解决方案。由于用户行为是点击率预测系统中最具挑战性的部分,我们设计了一个UIC(用户兴趣中心)模块来处理它,如下图
在这里插入图片描述

UIC服务器维护每个用户的最新兴趣表示。UIC的一个关键点是它的更新机制,用户状态的更新,只取决于实时用户行为触发事件,而不是重新请求。也就是说,UIC对实时点击率预测没有延迟。UIC可以将DIEN模型在1000用户行为长度的条件下耗时从200毫秒降低到19毫秒(QPS为500)。

4. 多通道用户兴趣记忆网络MIMN(MULTI-CHANNEL USER INTERESTMEMORY NETWORK)

4.1 长序列用户用户兴趣建模的挑战

从长序列数据中学习是很困难的。简单RNN (RNN、GRU、LSTM)在面对相当长的序列时会失效并不奇怪。注意机制在DIN被引入将序列数据的必要信息压缩成定长张量,增强模型的表达能力。在DIN中,对于实时推理,它需要存储所有的原始数据行为序列,这给存储带来了很大的压力。此外,注意力的计算成本也在增加,与行为序列的长度成线性关系,这在长序列用户行为建模是不可接受的。

最近,NTM (Neural Turing Machine,神经图灵机)被提出从源序列中捕获信息并将其存储在一个固定的外部存储器的大小,相比于RNN类的模型在许多长序列数据的建模任务中实现了显著的改进。

借鉴NTM的思想,提出了一种基于记忆模型的网络模型,为我们提供了一种新的解决方案
处理长顺序用户行为建模。命名为MIMN(多通道用户兴趣记忆网络),如下图
在这里插入图片描述

UIC通过序列从用户的行为中逐渐捕获用户的兴趣。在论文中,我们提出了提高内存利用率的正则化方法,通过提高内存利用率来提高UIC中记忆张量的表达能力。另一方面,随着用户兴趣的变化随着时间的推移,我们提出记忆感应单元帮助捕获高阶信息。

4.2 NTM

标准的图灵机从序列中捕获和存储信息。时刻 t t t,记忆矩阵表示为 M t \mathbf M_t Mt,包含 m m m个记忆槽位 { M t ( i ) } ∣ i = 1 m \mathbf \{M_t(i)\} |_{i=1}^m {Mt(i)}i=1m,NTM有两个基本操作,记忆读取(memory read)和记忆写入(memory write),这2个操作通过一个控制器(controller)来交互,控制器是个RNN或者LSTM网络。

记忆读取操作

输入序列第 t t t个行为向量,控制器产生一个寻址向量 k t k_t kt,去槽位中的记忆矩阵的每个向量进行计算,得到相关性权重向量 w t r w^r_t wtr

记忆读取实际上是根据输入向量和记忆矩阵各个向量的相关性来读取,相关性高的读出来的权重就大,相关性低的读出来的权重就小,最后的输出是根据相关性加权得到的。一般的内存读取要么读取要么不读取,是1和0的区别,这里借用了内存读取的概率,但是根据相关性来判定读取多少内容。

w t r ( i ) = exp ⁡ ( K ( k t , M t ( i ) ) ) ∑ j = 1 m exp ⁡ ( K ( k t , M t ( j ) ) )      i = 1 , 2 , . . . , m w_t^r(i) = \frac { \exp(K(k_t, M_t(i))) } { \sum_{j=1}^m \exp(K(k_t, M_t(j))) } \ \ \ \ i=1,2,...,m wtr(i)=j=1mexp(K(kt,Mt(j)))exp(K(kt,Mt(i)))    i=1,2,...,m
这里度量寻址向量和槽位中的记忆向量的相关性用的是cos距离

K ( k t , M t ( i ) ) = k t T M t ( i ) ∣ ∣ k T ∣ ∣   ∣ ∣ M t ( i ) ∣ ∣ K(k_t, M_t(i)) = \frac { k_t^T M_t(i) } { || k_T|| \ || M_t(i)||} K(kt,Mt(i))=∣∣kT∣∣ ∣∣Mt(i)∣∣ktTMt(i)

根据权重得到输出向量
r t = ∑ i = 1 m w t r ( i ) M t ( i ) r_t = \sum_{i=1}^m w_t^r(i) M_t(i) rt=i=1mwtr(i)Mt(i)
记忆写入操作
基于写入也有个写入的权重向量 w t w w_t^w wtw,计算方式和读向量权重一样,也是控制器产生一个寻址向量,根据寻址向量和记忆矩阵计算相关性。写入时控制器还会产生一个增加(add)向量 a t a_t at和一个擦除(erase)向量 e t e_t et,记忆矩阵更新如下,也就是先根据擦除向量,擦除记忆矩阵,然后根据增加向量加上去。

M t = ( 1 − E t ) ⨀ M t − 1 + A t \mathbf M_t = (1-\mathbf E_t) \bigodot \mathbf M_{t-1} + \mathbf A_t Mt=(1Et)Mt1+At

E t \mathbf E_t Et是擦除矩阵, A t \mathbf A_t At是增加矩阵, E t = w t w ⨂ e t \mathbf E_t = w_t^w \bigotimes e_t Et=wtwet A t = w t w ⨂ a t \mathbf A_t = w_t^w \bigotimes a_t At=wtwat

4.3 记忆利用正则化(Memory Utilization Regularization)

传统的NTM存在内存利用率不平衡问题,特别是在用户兴趣建模的场景中。也就是说,热门项目往往容易出现在用户序列中行为数据和主导内存更新,使得内存的使用效率低下。有文章研究使用LRU策略来平衡利用率每个记忆。因为LRU非常注重平衡过程中每个短时间序列的内存利用率。在处理过程中,LRU几乎从不将信息写入相同的内容相邻时间步长的槽。然而,在我们的场景中,用户可以与属于相同兴趣的几个行为交互,因此应该写入相同的插槽。LRU将组织内容寻址和不适合我们的任务。在本文中,我们提出了一种新的记忆利用正则化策略。

Memory Utilization Regularization
通过不同的记忆槽位对写入权重向量的方差进行正则化,平衡利用率。让 g t = ∑ c = 1 t w c w ~ g_t=\sum_{c=1}^tw_c^{\tilde w} gt=c=1twcw~表示截止到时刻 t t t累积的更新权重, w c w ~ w_c^{\tilde w} wcw~表示重新平衡后的权重,计算方式如下,
P t = s o f t m a x ( W g g t ) P_t=softmax(W_gg_t) Pt=softmax(Wggt)
w t w ~ = w t w P t w_t^{\tilde w} = w_t^w P_t wtw~=wtwPt
这里 w t w w_t^w wtw是原始的写入权重向量, w c w ~ w_c^{\tilde w} wcw~是平衡后的写权重向量,参数 W g W_g Wg通过方差正则化约束来学习,如下
w w ~ = ∑ t = 1 T w t w ~ w^{\tilde w} = \sum_{t=1}^Tw_t^{\tilde w} ww~=t=1Twtw~
L r e g = λ ∑ i = 1 m ( w w ~ ( i ) − ∑ i = 1 m w w ~ ( i ) ) 2 L_{reg} = \lambda \sum_{i=1}^m( w^{\tilde w}(i) - \sum_{i=1}^m w^{\tilde w}(i) )^2 Lreg=λi=1m(ww~(i)i=1mww~(i))2
这个约束使得写入权重的方差变小,从而有效缓解热门物料主导记忆矩阵的更新。

4.4 记忆归纳单元(Memory Induction Unit)

前面解决了长序列的记忆问题,但是对记忆中兴趣的提取没有涉及,这部分就是提取长序列记忆中蕴藏的用户兴趣。

NTM中的内存被设计用来存储来自尽可能多地使用源数据。美中不足的是它可能
错过捕捉一些高阶信息,为进一步提升在用户兴趣提取的能力,设计了一个记忆归纳单元MIU。MIU也包含一个内存矩阵S,带有m个槽位,与NTM相同。在这里,每个槽位通道视作用户的一个兴趣。

t t t时刻,根据NTM中的读取权重向量大小选择top k k k个兴趣通道, i : w t r ( i ) ∈ t o p k ( w t t ) ∣ i = 1 k i:w_t^r(i) \in topk(w_t^t)|_{i=1}^k i:wtr(i)topk(wtt)i=1k,根据选择的第 i i i个通道,使用GRU网络更新记忆矩阵S如下
S t ( i ) = G R U ( S t − 1 , M t , e i ) S_t(i) = GRU(S_{t-1}, M_t, e_i) St(i)=GRU(St1,Mt,ei)
这里 e t e_t et表示用户行为向量,这里就从原始的记忆矩阵中提取到了用户的兴趣向量。

示意图如下
在这里插入图片描述

5. 实验

数据集和实验结果

在这里插入图片描述

在这里插入图片描述

消融实验

Slot Number of Memory
我们对MIMN进行了实验具有不同数量的内存插槽。为了简化,我们只使用基本的NTM架构来评估MIMN,省略了内存利用正则化的设计以及记忆感应装置。
表3显示了结果。

经验表明,槽数会影响模型的性能。我们的分析结果表明两者是相关的,每一个槽内存是随机初始化的。对于具有长行为的数据集序列,例如淘宝数据集,内存有更多的学习机会并实现稳定的代表性。在短行为的情况下,如Amazon数据集,模型性能用较大记忆容量受到学习的影响。尤其是当所有插槽的内存利用率不平衡,部分内存病媒可能没有得到充分利用和更新,这意味着这些内存向量仍然保持在原始初始化的附近。这将损害模型的性能。因此我们提出记忆利用正则化来缓解这个问题。
Memory Utilization Regularization
每个用户的兴趣强度不均匀,内存初始化随机,在基本NTM模型中,存储的利用是不平衡的。这个问题会伤害记忆的学习,使记忆不足用于利用有限的内存存储。我们使用内存利用率正则化技巧来帮助解决这个问题。
图6显示内存利用率,它验证的有效性这种平衡的效果也带来了改善在模型性能上,如表4所示
在这里插入图片描述
Memory Induction Unit

在这里插入图片描述

部署的实际经验

UIC服务器和RTP服务器同步 MIMN是用UIC和RTP实现的服务器在一起。因此,UIC之间存在非同步问题和RTP服务器。两个服务器的异步参数更新在具有周期的实际系统中,可能导致模型推理错误模型部署,这是有很大风险的。进行实验
模拟不同步的情况。表5显示了结果。
在这里插入图片描述

MIMN非同步参数更新对模型的影响不大,在个实验中,不同步更新的差距时间在一天之内,这是工业的传统设置系统。在实际系统中,设计了模型部署每小时执行一次,进一步降低风险。我们相信这是由于MIMN学习到的用户兴趣的稳定表示,使得MIMN具有良好的泛化性能。

大销售数据的影响 如今,大甩卖被采用通过许多电子商务网站来吸引顾客进行网上消费,例如中国著名的阿里巴巴双十一大促销。在这个极端情况下,样本分布以及用户行为都与日常情况有很大的不同。我们比较在收集和不收集训练数据的情况下,MIMN的性能
在我们系统的双十一大促销日。结果显示在Table5。我们发现最好从经验上删除大销售数据。

热启策略 虽然UIC的设计是为了在心理上更新增量,但是从稳定的积累开始需要相当长的时间。实际上,我们使用预热策略用预先计算的用户兴趣表示来初始化UIC。我们收集过去120天的历史行为(平均用户行为序列的长度为1000),每个用户和用训练好的MIMN模型在离线模式下进行推理,则将累积的内存推入UIC以进一步增量更新。

回滚策略 如果出现意想不到的问题,例如被大规模在线作弊污染了训练样本,那么UIC服务器的更新机制可能会受到很大的影响。一个棘手的挑战是寻求到异常点的情况发生了, 为了抵御这种风险,我们设计了一个回滚策略,每天早上存储在00:00学习到的用户兴趣表示的副本,并记录过去7天。

总结

使用NTM的记忆矩阵来存储用户长序列,同时对NTM进行正则化的优化,进一步使用GRU提取用户兴趣,使得长序列建模突破存储和耗时的限制,从而提升线上效果。

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

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

相关文章

MIT 6.830数据库系统 -- lab five

MIT 6.830数据库系统 -- lab five 项目拉取引言搜索练习1 BTreeFile.findLeafPage() 插入练习2 Spliting Page 删除练习3 页再分配练习4 合并页 事务 项目拉取 原项目使用ant进行项目构建,我已经更改为Maven构建,大家直接拉取我改好后的项目即可: http…

选择器jQuery

诚信是你价格不菲的鞋子,踏遍千山万水,质量也应永恒不变。 jQuery选择器大全总结: jQuery选择器是一种用于在HTML文档中选择元素的强大工具。下面是一些常用的jQuery选择器的总结: 基本选择器: 元素选择器&#xff1a…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作,今天宏哥就用具体例子,将上一篇中的理论知识实践一下。而且在实际测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以使用fiddler进行…

测试|测试用例设计常见面试题

测试|测试用例设计常见面试题 文章目录 测试|测试用例设计常见面试题1.怎么模拟弱网(测试技巧)2.怎么测试接口(测试技巧)3.怎么对冒泡排序测试(代码类)4.怎么对linux的zip命令进行测试(软件类&a…

Linux: 设置qmake的Qt版本

Qt开发,qmake会对应一个Qt版本,有时候需要切换这个版本,例如把qmake从Qt5.12切换到Qt5.9, 怎么操作呢? 案例如下: 银河麒麟V10系统,下载安装了Qt5.9.8,但是检查qmake发现它使用的是5.12.8&…

《JeecgBoot系列》JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive)

JeecgBoot(ant-design-vue)实现表单页面缓存(keep-alive) 一、keep-alive介绍 keep-alive是vue的一个内置实例,通过这个属性可以缓存组件的v-node,可以实现页面缓存的功能。 keep-alive有三个属性: 1.include:记录了哪些组件可…

【Spring】聊聊Spring如何解决的循环依赖以及三级缓存

循环依赖是什么 在平时的面试中,只要问到Spring,那么大概率肯定会问什么是循环依赖,Sping是如何解决循环依赖的。以及三级缓存机制是什么。所以为了从根本上解决这个问题,本篇主要详细介绍一下循环依赖的问题。 Spring Bean初始…

IDEA格式化代码快捷键Ctrl+Alt+L失效解决

常见问题是网易云全局快捷键冲突 解决方法:取消下面的全局快捷键勾选

查看进程方式

目录 ps top uptime pstree ps 查看静态的进程统计信息 top 实时显示系统中各个进程的资源占用情况 第一行 top - 17:00:23 up 15 min, 1 user, load average: 1.05, 1.22, 0.98 17:00:23————当前时间 up 15 min————系统运行时间 1 user————当前登录用户数…

客户端实现阿里云OSS文件上传(分片上传,断点续传)

前言 阿里云OSS(Object Storage Service)是一种稳定、安全、高扩展性的云存储服务,它允许您以低成本、高可靠、高可用的方式存储和访问任意类型的数据。在实际应用中,文件上传是一个常见的功能需求。为了提高上传效率和文件完整性…

Leetcode-每日一题【剑指 Offer 56 - I. 数组中数字出现的次数】

题目 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 示例 1: 输入:nums [4,1,4,6]输出:[1,6] 或 [6,1] 示例 2&#x…

IOS开发:去除TabView的底部留白

我最近在做IOS开发的时候,使用SwiftUI中的TabView做左右滚动的页面切换,遇到了页面底部有大量留白无法去除的问题: 我查了很多资料都没有看到网上有人记录这个问题的解决方案,后来查阅apple developer的文档,我发现.ed…

模电基础知识学习笔记

文章目录: 一:基本元器件介绍 1.二极管 1.1 普通二极管特性测试 1.2 稳压二极管测试 1.3 整流二极管 1.4 开关二极管 2.电容 3.三极管(电流控制) 3.1 介绍 3.2 类型(PNP、NPN) 3.3 三种工作状态:放大状态、截止状态…

RBAC权限详解

1.传统的权限设计 首先,我们先了解下什么是传统的权限设计 从上面的图中,我们发现,传统的权限设计是对每个人进行单独的权限设置,但这种方式已经不适合目前企业的高效管控权限的发展需求,因为每个人都要单独去设置权限…

大盗阿福(记忆化搜索板子)

提供核心代码:(经典的记忆化搜索套路) int dfs(int pos){if(f[pos]!-1) return f[pos];//记忆化if(pos>n) return 0;//边界,越界int sum0;//模板int f10,f20;f1dfs(pos1);f2dfs(pos2)w[pos];summax(f1,f2);//模板f[pos]sum;//模…

表达式树

请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。 例如,当下列两棵表达式树作为算法的输入时: 输出的等价中缀表达式分别为 (ab)*(c*(-d)) 和 (a*b)(-(c-d))。 注意: 树…

ChatGPT炒股:自动批量提取股票公告中的表格并合并数据

在很多个股票公告中,都有同样格式的“日常性关联交易”的表格,如何合并到一张Excel表格中呢? 首先,在ChatGPT中输入提示词: 写一段Python代码: F盘文件夹“新三板 2023年日常性关联交易20230704”中很多…

零代码编程:PDF文件名和Excel数据进行比对找不同

F盘“北交所招股说明书”文件夹下有150个文件; F盘”北证A股20230703.xlsx”表格中证券名称有200多个; 现在想找出文件夹下的哪些证券名称不在表格里面。 在ChatGPT中输入提示词: 写一段Python程序: F盘“北交所招股说明书”文…

qt源码--事件系统之QAbstractEventDispatcher

1、QAbstractEventDispatcher内容较少,其主要是定义了一些注册接口,如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下: 其主要定义了大量的纯虚函数,具体的实现会根据不同的系统平台,实现对应的方…

AD21原理图的高级应用(五)自定义原理图模板及调用

(五)自定义原理图模板及调用 1.创建原理图模板2.调用原理图模板 1.创建原理图模板 利用 Altium Designer 软件在原理图中创建自己的模板,可以在图纸的右下角绘制一个表格用于显示图纸的一些参数,例如文件名、作者、修改时间、审核者、公司信息、图纸总数…