【论文笔记】Summarizing source code with Heterogeneous Syntax Graph and dual position

2024-01-09

Abstract

在本文中,我们提出了一个名为 HetSum 的新颖框架。具体来说,首先 通过在 AST 中设计六种类型的增强边来构建异构语法图(HSG) ,这表明了源代码的异构结构。同时,考虑布局信息, 为源代码中的每个标记设计了双重位置 。此外,我们在 HetSum 中 开发了异构图神经网络来对 HSG 进行编码 ,同时使用 Transformer 编码器提取代码布局特征。通过将学习到的代码标记向量同化到 HSG 编码器中,HetSum 可以捕获两个编码器之间的关系,以改进代码表示。为了便于生成高质量的摘要,我们在扩展 Transformer 解码子层的同时将复制机制集成到解码过程中。

1. Introduction

在生成高质量的代码摘要方法终仍存在一些局限性:

  • AST 的异构性总是被忽略。在学习源代码的语法结构时,大多数基于 GNN 的模型仅将 AST 视为用于编码的同构图。我们认为 AST 的异构性对于保持 AST 的结构独特性至关重要,如图 下图所示,代码片段 A 和 B 通过在 AST 上添加数据流边和兄弟边而具有相同的同构语法图,因为节点 ‘’=‘’ 无法通过同构边区分其右兄弟节点’‘identifier’’ 和左兄弟节点 ‘‘identifier’’ 。事实上,节点 ‘’=‘’ 也无法区分其父节点 ‘‘assignment’’ 和兄弟节点 ‘‘identifier’’ 。因此,边的同构性削弱了 GNN 识别节点之间不同关系的学习能力。
  • 源代码标记的位置信息尚未得到很好的研究。迄今为止,那些将源代码编码为纯文本的方法忽略了代码的布局信息,该信息记录了代码标记的精确位置。例如,下图中的代码片段A和C被处理成具有相同顺序位置的相同标记序列,导致它们无法被类似Transformer的模型区分。

在这里插入图片描述

解决方法:

  • 鉴于上述限制,本文首先将基于 AST 的同构图扩展为具有六种有向边的异构语法图(HSG)。具体地,来自HSG中的节点的边可以到达其子节点、父节点、右兄弟节点、左兄弟节点、下一个DFG节点或前一个DFG节点,这可以很好地保留HSG的结构唯一性。例如,由于节点 ‘’=‘’ 和它的两个兄弟节点(‘‘identifier’’)之间的有向边,上图 中代码片段 A 和 B 的 HSG 是不同的。此外,不同的边类型使得节点 ‘’=‘’ 区分其父节点 ‘‘assignment’’ 和兄弟节点。
  • 为了保留源代码的布局信息,我们为原始源代码中的每个代码标记设计了双重位置。通过双重位置,代码令牌可以通过行号和该行中的顺序位置精确定位。例如,上图中的双重位置突出显示了代码片段 A 和 C 之间的布局差异。

2. HSG and dual position

2.1 HSG construction

为了获取给定代码片段的 HSG,我们首先将其解析为 AST。作为源代码的基本层次语法结构,AST仅表示其节点之间的父子关系。因此,为了进一步丰富 AST 节点之间的关系,我们将 AST 增强为同构语法图。在这个阶段,我们在所有兄弟节点之间引入边来表示兄弟关系。此外,我们引入额外的边来构造数据流图(DFG),用来表示数据流。 DFG 指示每个变量来自或去往何处,可以进一步捕获数据依赖性以实现更好的代码表示。例如,在图 1 中的同构语法图中,节点 “=” 通过三个边连接到其两个兄弟节点 ‘‘identifier’’ 和父节点’‘assignment’’ 。此外,两个 ‘‘identifier’’ 节点之间存在数据依赖性。应该注意的是,所有节点实际上都无法通过这些同构边区分其父节点、子节点、兄弟节点和 DFG 邻居节点。

第二步,我们从同构语法图构建 HSG。我们将同构语法图中的边改进为具有方向的异构边。如图 1 中的 HSG 所示,节点的边可能通向其子节点、父节点、右兄弟节点、左兄弟节点、下一个 DFG 节点或前一个 DFG 节点。在本文中,我们定义从当前节点到其下一个DFG节点的边意味着当前节点的数据流向其下一个DFG节点。相反,从当前节点到其前一个DFG节点的边表示当前节点的数据来自其前一个DFG节点。通过明确指定六种类型的边,精确识别节点之间的对应关系,从而很好地保持了 HSG的结构唯一性 。例如,在代码片段 A 的 HSG 中,左侧 ‘‘identifier’’ 可以准确识别其子节点 “b”、父节点’‘assignment’'、右侧兄弟节点 “=” 以及前一个 DFG 节点 ‘‘identifier’’。

2.2 Code tokens with dual positions

由于自动代码摘要生成严重依赖于源代码标记,因此我们将原始源代码及其 HSG 结合起来,生成具有双重特征的代码标记。增强代码标记表示的位置。为此,首先遍历 HSG 以获取与标记化源代码相关的所有叶节点。与早期将源代码视为自然语言中的纯文本的方法不同,我们考虑了通过 为每个代码标记呈现双重位置来显示代码布局信息 。双重位置是由两个值组成的元组。 第一个值记录行号,第二个值指示当前行中的顺序位置 。两个值都从 1 开始。特别是, 源代码中的缩进被认为具有连续位置 ,尽管它不被视为代码标记。例如,在图 1 中,令牌 “c” 的双重位置 {3, 4} 表示考虑到行开头的缩进,该令牌位于第三行的第四个位置。通过指定这样的双重位置,所有代码标记都具有与源代码对应的精确位置信息,这可以保持源代码的布局唯一性,以实现更好的代码表示。

3. HetSum model

3.1 Overview

假设将源代码片段表示成一个 HSG,这个 HSG 具有 l n l_n l n 个节点表示为 T n = ( n 1 , n 2 , . . . , n l n ) T_n = (n_1, n_2, ... , n_{l_n} ) T n = ( n 1 , n 2 , ... , n l n ) ,还有 l c l_c l c 个代码 token 表示为 T c = ( c 1 , c 2 , . . . , c l c ) T_c = (c_1, c_2, ... , c_{l_c} ) T c = ( c 1 , c 2 , ... , c l c ) 以及具有双重位置表示为 P c = ( { x 1 , y 1 } , { x 2 , y 2 } , . . . , { x l c , y l c } ) P_c = ( \{x_1, y_1\}, \{x_2, y_2\}, ... , \{x_{l_c} , y_{l_c} \}) P c = ({ x 1 , y 1 } , { x 2 , y 2 } , ... , { x l c , y l c }) 。基于当前代码摘要的标记表示为 T s = ( ⟨ ∕ s t a r t ⟩ , s 1 , s 2 , . . . , s m − 1 , ⟨ ∕ p a d ⟩ , ⟨ ∕ p a d ⟩ , . . . ) T_s = (⟨∕start⟩, s_1, s_2, ... , s_{m−1}, ⟨∕pad⟩, ⟨∕pad⟩, ...) T s = (⟨ s t a r t , s 1 , s 2 , ... , s m 1 , p a d , p a d , ... ) ,其具有连续位置 P s = ( 1 , 2 , . . . , l s ) P_s = (1, 2 , ... , l_s) P s = ( 1 , 2 , ... , l s ) ,HetSum 尝试通过融合从 HSG 和代码标记中提取的特征来生成下一个摘要标记 s m s_m s m 。请注意, ⟨ ∕ s t a r t ⟩ ⟨∕start⟩ s t a r t 是初始化 T s T_s T s 的特殊标签, ⟨ ∕ p a d ⟩ ⟨∕pad⟩ p a d 用于将 T s T_s T s 填充到 HetSum 输入的长度 l s l_s l s

图 2 说明了所提出的 HetSum 的框架。它主要由三个组件组成:Code Token Encoder、HSG Encoder 和具有复制机制的 Summary Decoder。在编码过程中,双位置代码标记和 HSG 分别地流入Transformer编码器和 HSGNN 层,用于获取代码标记表示 E c ′ ∈ R l c × d E^′_c ∈ R^{l_c×d} E c R l c × d 和语法图表示 E n ′ ∈ R l n × d E^′_n ∈ R^{l_n×d} E n R l n × d ,其中 d d d 是嵌入大小。随后,HetSum 执行具有复制机制的基于 Transformer 的解码器,将现有摘要标记作为输入,并融合提取的代码标记和 HSG 特征(即 E c ′ E^′_c E c E n ′ E^′_n E n ),以预测生成摘要的下一个标记 s m s_m s m

在这里插入图片描述

3.2 Embeddings

在对代码标记、HSG 和摘要文本进行编码之前,需要将它们转换为数值向量。在本研究中,HSG 节点 T n T_n T n 直接映射到嵌入向量 E n 0 ∈ R l c × d E^0_n ∈ R^{l_c×d} E n 0 R l c × d 中。通过利用可学习的位置嵌入,代码标记 T c T_c T c 和摘要标记 T s T_s T s 被转换为向量 E c 0 ∈ R l c × d E^0_c ∈ R^{l_c×d} E c 0 R l c × d E s 0 ∈ R l c × d E^0_s ∈ R^{l_c×d} E s 0 R l c × d ,分别包含他们的双重位置 P c P_c P c 和顺序位置 P s P_s P s 。三个嵌入过程的公式如下:

在这里插入图片描述

其中 E m b Emb E mb 表示 T n 、 T c T_n、T_c T n T c T s T_s T s 的共享嵌入操作; P c , x = ( x 1 , x 2 , . . . , x l c ) P_{c,x} = (x_1, x_2, ... , x_{l_c} ) P c , x = ( x 1 , x 2 , ... , x l c ) P c , y = ( y 1 , y 2 , . . . , y l c ) P_{c,y} = (y_1, y_2, ... , y_{l_c} ) P c , y = ( y 1 , y 2 , ... , y l c ) 是双重位置 P c P_c P c 的分量。 X E m b XEmb XE mb Y E m b Y Emb Y E mb S E m b SEmb SE mb 对应于位置嵌入操作。

3.3. Code token encoder

图2描绘了Code token 编码器包括两个相同的Transformer层。每层都由多头注意力机制以及全连接的位置前馈网络组成,两者都遵循残差连接和层归一化。残差链接用来缓解多层计算中的梯度消失问题。层归一化可以减轻残差连接期间过多的矢量偏移。第k个Code token编码层的整个流程表述如下:

在这里插入图片描述

其中 E c k − 1 ∈ R l c × d E^{k-1}_c ∈ R^{l_c×d} E c k 1 R l c × d 表示上一层输出的向量; F F N F F N FFN 表示前馈网络; L a y e r N o r m LayerNorm L a yer N or m 表示层归一化; A t t Att A tt 表示多头注意力。前馈网络包含两个由非线性变换的 ReLU 激活分隔的线性变换,其公式如下:

3.4 HSG encoder

鉴于 GraphSAGE 在处理图时的高效率和性能,我们通过改进 GraphSAGE 用于 HSG 表示学习的思想来开发 HSGNN。如图2所示,HSG编码器包括六个相同的HSGNN层。需要强调的是,学习到的代码标记表示被设计为在将 HSG embeddings 放入第一个 HSGNN 层之前集成到 HSG embeddings 中,以对代码标记编码器和 HSG 编码器之间的关系进行建模。为此,对于源代码中的每个 HSG 叶节点及其对应的标记,学习到的代码标记向量将被添加到 HSG 叶嵌入向量中。

在这里插入图片描述

在第 k 个 HSGNN 层中,HSG 首先由异构 GraphSAGE 处理。具体来说,对于 HSG 节点 i i i ,它的状态通过指向该节点的邻居节点的两个阶段聚合来更新,如图 3 所示。在第一阶段,具有不同边类型的邻居分别被聚合为不同的邻居组。对于边类型 g,聚合公式为:

在这里插入图片描述

其中 N g ( i ) N_g(i) N g ( i ) 表示边类型为 g g g 的节点 i i i 的邻居; e g , j k − 1 ∈ R d e^{k−1}_{g,j} ∈ R^d e g , j k 1 R d 表示第 ( k − 1 ) (k−1) ( k 1 ) 层、边类型为 g g g 的第 j j j 个邻居的向量; A g g r 1 Aggr_1 A gg r 1 表示聚合函数。在第二阶段,转换和聚合邻居组以更新节点的状态,其公式如下:

在这里插入图片描述

其中 e i k − 1 ∈ R d e^{k−1}_{i} ∈ R^d e i k 1 R d 表示上一个 HSGNN 层输出的节点 i i i 的向量; g ( i ) g(i) g ( i ) 表示通向节点 i i i 的边的类型; A g g r 2 Aggr_2 A gg r 2 表示聚合函数; W 0 , W g ∈ R d × d W_0, W_g ∈ R^{d×d} W 0 , W g R d × d 是可学习的权重矩阵。

一旦节点状态全部更新,状态向量就会被连接起来并输入到 R e L U ReLU R e LU 激活函数中进行非线性变换,其公式如下:

在这里插入图片描述

通过更多堆叠的 HSGNN 层,节点可以从更远的距离收集其相邻数据,从而捕获更多异构结构特征。为了减轻多层计算导致的梯度消失和过多的向量偏移,我们在每一层中采用残差连接以及层归一化,其公式为以下:

在这里插入图片描述

其中方程中的 E k − 1 ∈ R l n × d E^{k−1} ∈ R^{l_n×d} E k 1 R l n × d 表示第 ( k − 1 ) (k−1) ( k 1 ) 个 HSGNN 层输出的 HSG 节点向量。

3.5 Summary decoder

为了利用学习到的代码标记和 HSG 表示来生成摘要,我们通过实现六层扩展 Transformer 解码模块来设计 HetSum 的解码器。每个模块包含四个子层:一个用于自注意力编码的屏蔽多头注意力子层,两个用于两阶段解码的多头注意力子层,以及一个用于非线性变换的 F F N F F N FFN 子层。每个子层后面都是带有层归一化的残差连接。

给定现有的摘要标记,解码器首先基于屏蔽多头注意力对其进行解码。

之后,通过与两个编码器交互,堆叠两个多头注意力模块,基于现有的摘要标记进行两阶段解码。一个模块处理学习到的 HSG 表示以获得第一阶段解码信息,随后将其放入第二阶段解码模块,该模块吸收提取的代码标记特征。接下来, F F N F F N FFN 子层将解码后的向量作为非线性变换的输入。整个过程表述如下:

在这里插入图片描述

其中 E c ′ ∈ R l c × d E^′_c ∈ R^{l_c×d} E c R l c × d E n ′ ∈ R l n × d E^′_n ∈ R^{l_n×d} E n R l n × d 分别表示提取的 HSG 和代码 token 的特征。

3.6. Copying mechanism

由于许多代码标记(例如变量和函数名称)可能存在于文本摘要和源代码中,我们根据编码器和解码器实现了复制机制多源指针生成器(MPG)网络,最终确定后续的摘要标记。基于多头注意力,MPG 允许 HetSum 生成更准确的摘要标记,这些标记都是在词汇表中选择的,并且是从输入 HSG 节点和源代码标记复制的。

在这里插入图片描述

如上图所示,为了生成第 i i i 个摘要标记的输出似然,MPG 首先计算对应于摘要词汇表、代码标记和 HSG 节点的三个概率分布 p v p_v p v p c p_c p c p n p_n p n p v pv p v 是通过在解码的摘要标记向量 e ′ s ∈ R d e′_s ∈ Rd e s R d 上执行 S o f t m a x Softmax S o f t ma x L i n e a r Linear L in e a r 子层导出的,其定义如下:

如果候选标记 w w w 不在摘要词汇表中,则 p v ( w ) p_v(w) p v ( w ) 设置为 0。

p c p_c p c p n p_n p n 是基于摘要解码器以及代码令牌和 HSG 编码器上的两个附加多头注意力子层计算的。具体来说, p c p_c p c 是根据第 i i i 个解码后的摘要标记向量 e ′ s e′_s e s 和编码后的代码标记 E ′ c E′_c E c 进行 s o f t m a x softmax so f t ma x 注意力值得出的,其公式如下:

在这里插入图片描述

其中 w j w_j w j 表示第 j j j 个源代码标记; a ˉ c ∈ R l c \bar{a}_c ∈ R^{l_c} a ˉ c R l c 表示注意力值。如果 w w w 不是代码标记,则 p c ( w ) = 0 p_c (w) = 0 p c ( w ) = 0 。具体来说,MPG 中的注意力子层以 e ′ s e′_s e s 作为查询,以 E ′ c E′_c E c 作为键和值来得到 a ˉ c \bar{a}_c a ˉ c ,其公式如下:

在这里插入图片描述

其中 W j Q W^Q_j W j Q W j K W^K_j W j K W j V W^V_j W j V 是可训练矩阵。此外,上下文向量 θ c ∈ R d θ_c ∈ R^d θ c R d 对于下一个摘要标记的最终输出似然至关重要,计算如下:

在这里插入图片描述

其中 W O W^O W O 表示可训练参数, a j a_j a j 来自上式

p n p_n p n θ n θ_n θ n 的计算过程与 p c p_c p c θ c θ_c θ c 的计算过程相同,唯一的区别是 p n p_n p n θ n θ_n θ n 的多头注意力中的 key 和 value 是编码后的 HSG E ′ n E′_n E n 。最后,候选标记 w w w 的似然 p s ( w ) p_s(w) p s ( w ) 定义为三个概率 p v 、 p c p_v、p_c p v p c p n p_n p n 的加权和:

在这里插入图片描述

其中 η v 、 η c η_v、η_c η v η c η n η_n η n 表示对应于 p v 、 p c p_v、p_c p v p c p n p_n p n 的权重。理论上,标记 w w w 更有可能被视为具有较高概率 p s ( w ) p_s(w) p s ( w ) 的下一个摘要标记。

4. Experiment

4.1 Experimental results

在这里插入图片描述

4.2 Ablation study

首先设计了四种变体模型来验证 HSG 的异构结构特征和源代码中的布局信息:

  1. HSG-SibEdge,排除HSG中兄弟节点之间的边
  2. HSG-DFGEdge,排除HSG中的DFG
  3. HSG-Hetero,忽略HSG中的异构性,使用同构GraphSAGE进行语法结构学习
  4. Code-SeqPos,将源代码标记视为先前工作中的自然语言序列,并将双重位置替换为顺序位置。

为了进一步研究HetSum模型架构的合理性,我们构建了八个变体:

  1. 模型-HSGRes,消除了HSG编码器中层归一化的残差连接
  2. 模型-HetGCN,用GCN替换HSGNN中使用的GraphSAGE
  3. Model-HetGAT 引入 GAT 以取代 HSGNN 中的 GraphSAGE
  4. Model-HSGEnc 删除 HSG 编码器
  5. Model-CodeEnc删除代码令牌编码器
  6. Model-EncRel,不将编码的代码令牌集成到 HSG 嵌入中,以丢弃两个编码器之间的关系
  7. Model-DecInv,反转 HSG 和代码令牌特征的解码在摘要解码器中
  8. 删除复制机制的模型复制。

请注意,GrapSAGE、GCN 和 GAT 都是常用于图学习任务的典型 GNN。

在这里插入图片描述

4.3 Model Size

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【论文笔记】Summarizing source code with Heterogeneous Syntax Graph and dual position 的相关文章

  • 跨境电商三大趋势已经涌现

    在过去的几年里 跨境电商在推动外贸增长中发挥了至关重要的作用 成为了引领行业发展的强大引擎 然而 随着2024年的到来 跨境电商行业又站在了崭新的起点 准备攀登新的发展高峰 数据显示 得益于经济的逐步复苏 未来三年跨境电商行业预计将以16

随机推荐

  • 如何快速搭建一个自营商城?(调用电商API实现快速采集商品)

    一 背景介绍 在数字化时代 电商行业蓬勃发展 无数商家涌入这片蓝海 对于许多有志于开拓电商业务的企业和个人来说 快速搭建一个自营商城成为了迫切的需求 然而 传统意义上的自建商城需要投入大量的人力 物力和时间 这让许多初创企业和个人望而却步
  • 思腾合力赞助CCF YOCSEF太原第十一届学术委员会第三次全体会议

    2024年1月6日 由思腾合力赞助的 CCF YOCSEF太原第十一届学术委员会第三次全体会议暨AC换届选举活动 在山西大学举办 华北区教育行业负责人宋肖敏出席本次会议 会议汇聚了众多学术界和企业界的精英 共同探讨人工智能和计算机科学的未来
  • 在ASP.NET MVC中使用JQuery提供的弹出窗口(模态窗口)

    在ASP NET MVC中使用JQuery提供的弹出窗口 模态窗口 原理 使用 div 图层灵活显示在浏览器的任何位置 默认情况下指定 div 不可见 引用 样式表 在JQuery的官方网站可以下载对应的css样式表 打开官网的 样例页 找
  • KALI Linux 最新超详细安装教程

    自己也在学习所以就想着记录一下 接下来开始安装 一 先下载好kali linux 的镜像 可以去kali的官网 https www kali org get kali kali bare metal 还可以去 清华大学开源软件镜像站下载 h
  • vue2中Cascader 级联选择器限制选择个数和回显问题

    文章目录 1 组件默认数据绑定 2 指定数据绑定 3 watch监听v model绑定的数组 控制选中个数 4 前后端数据转换 实现回显 1 接口初始数据回显 2 重新选择级联选择器后 如何将选择的数据转换成后端需要的数据 3 最后提交数据
  • 【网络安全】XSS如何绕过HttpOnly获取Cookie以及XSS与CORS漏洞利用

    目录 HttpOnly XSS如何绕过HttpOnly获取Cookie 直接读取 目录 HttpOnly 当开启HttpOnly时不依靠cookie如何登录后台 直接读取 表单劫持 XSS如何绕过HttpOnly获取Cookie 利用php
  • Python-PyQt5树莓派上位机

    Python PyQt5树莓派上位机 一个使用PythonQT设计的树莓派的上位机 功能大概如下 1 笔记本电脑与树莓派的通讯是否成功显示 给个信号显示判断是否通讯成功 2 阈值的设置显示 3 图像成像的显示 4 是否发生火灾报警显示 5
  • vue2项目实现excel文件导入导出和拖拽上传

    文章目录 一 excle文件导出 二 excel文件导入 三 文件拖拽上传 四 完整代码 文件导入导出实现逻辑图 一 excle文件导出 导出员工接口返回的是二进制流 axios配置responseType为blob接收二进制流文件为Blo
  • 拍照翻译在线使用的具体教程在哪里?你一定想知道这个

    马上就期末了 这几天真是天天在为我的日语考试而发愁 都怪我平时上课只顾着 欣赏 老师放的各种教学电影 那些课堂知识倒是一点也不进脑 这下好了 人家已经在美美的复习 我还卡在看不懂单词 尴尬期 而且这查词也太费功夫了吧 一下午的时间光用在这上
  • 手机系统更新的背后,涉及技术、商业与安全的考量

    在数字化时代 手机已经成为我们生活中不可或缺的伙伴 而系统更新则是手机使用中不可避免的一部分 然而 为何手机需要经常进行系统更新呢 这背后涉及多方面的考量 首先 从技术角度来看 手机系统更新的根本原因是科技的持续进步 随着技术的飞速发展 手
  • Ehcache轻量级缓存框架

    Ehcache 是一个用于Java应用程序的开源的轻量级缓存框架 它专注于提供简单且高效的缓存解决方案 通过将数据存储在内存中 以提高对这些数据的访问速度 1 为什么选择Ehcache 1 1 Ehcache 内存中缓存 的优缺点 优势 性
  • 拍照转文字的软件哪个好?这篇文分分钟告诉你答案

    上了大学之后 大家是不是就很少在上课的时候拿笔记记课堂笔记啦 也是 大学课堂上并不禁止我们使用手机 我们只需要在遇到需要记下的知识点时 掏出手机拍几张照片就好了 这样虽然解放了双手 但我们到了期末想要复习知识点的时候 图片形式的内容总是不太
  • ‘DR-GAN: Automatic Radial Distortion RectificationUsing Conditional GAN in Real-Time‘条件GAN实时径向畸变自动矫正

    这篇文章在2020年发表在IEEE Transactions on Circuits and Systems for Video Technology上
  • mysql+关掉密码过期

    mysql 关掉密码过期 要在MySQL中关闭密码过期功能 可以按照以下步骤进行操作 登录到MySQL服务器 使用管理员账户 如root 连接到数据库 mysql uroot ppassword 运行以下命令来查看当前的密码过期设置 SHO
  • 如何在整个项目中有效管理成本?

    在项目管理方面 没有什么比控制成本更重要 尤其是在项目复杂的情况下 开支可能会让项目成本比预期飙升得更快 项目经理需要采取积极主动的成本管理方法 以保证预算不超支 项目成本管理的各个阶段 管理项目成本需要在整个项目周期中保持警惕 并制定可靠
  • 2024年品牌如何实现持续发展?媒介盒子分享

    当军大衣成为冬季日常穿搭 小众城市成为旅游新趋势 年轻人蹭老式消费火了 薅羊毛 团购 平替 成了2023的搜索热词 这些热词背后也透析当下显著的消费特征 性价比成为首选 今天媒介盒子就来和大家聊聊 2024品牌如何实现持续发展 一 nbsp
  • pdf压缩大小方法哪个好用些?这三招可不要错过

    大家有没有被龟速的文件上传速度折磨过 好不容易等到上传进度走到最后一点点 但是却眼睁睁看着上传速度突然降到2kb s 真的是分分钟被 气死 拿网速没办法 那就只能从文件大小下手了 而怎么样做到压缩文件大小的同时又能保持它的清晰度呢 这当然少
  • 线下餐饮店如何通过内容提高竞争力?媒介盒子揭秘

    要说现在最卷的实体店 媒介盒子认为非餐饮店莫属 在商场 街头巷尾还是社区深处 餐饮永远是更新换代速度最快的一波 如今市场对餐饮的需求可谓是既要又要还要 要实质的产品好 更需要好的内容持续有话题 有存在感 今天媒介盒子就来分享 传统餐饮店如何
  • ITLV格式:优化数据处理与通信效率

    许多文章中经常使用 它是基于TLV Tag Length Value 格式的一种变体 根据实际需要进行了一些修改 在ITLV格式中 各字段具有以下含义 I ID或Index 用于区分不同的数据 每个数据都有一个唯一的ID或索引 用于标识该数
  • 【论文笔记】Summarizing source code with Heterogeneous Syntax Graph and dual position

    Summarizing source code with Heterogeneous Syntax Graph and dual position Abstract 1 Introduction 2 HSG and dual positio