Mining Precision Interface From Query Logs -- 学习笔记(二)

4 交互mining

       前面说到解决最终问题的步骤之一:分析日志以识别有意义的结构更改,因为如果单纯用成对AST之间的差异表 diffs 会导致不相关的差异,所以并不是所有从logs中分析出的差异对生成精确界面都是有意义的。

本节作者提出的 PIL_{ANG} 语句以及编写 PIL_{ANG} 语句的工具:就是一种可以指定 有意义的结构改变的特定于域的语言

Q1:为什么不使用 diffs来分析所有 Logs中的差异?

答:有三个方面:

(1)出现不想关的结构改变:像函数重命名,更改project clause的别名,重排 FROM子句中的表,对查询语义没有任何的影响,而这些差异在 diffs 表中也是有记载的。

(2)误导性差异,举个栗子:

SELECT a FROM T WHERE 1=1

② SELECT a FROM T GROUPBY a

上面这两个查询语句,树对齐算法分析出的可能是在①中用GROUPBY子句替换WHERE子句形成了②。但事实上这并不是有意义的能够映射到小部件的变化。有可能①②是通过将 WHERE子句和GROUPBY子句添加到一个基础的查询语句 SELECT a FROM T上的。

(3)有特殊情况,再举个栗子:

① SELECT b FROM T WHERE a>5 AND a<10

② SELECT b FROM T WHERE c>5 AND a=10

第一个查询通过整数来过滤值,我们很自然的就能想到它可以用范围滑块来映射。但是范围滑块却不能用于第二个查询,为了区别这两个语句,精确界面需要额外的语义来说明更改的常量是共享相同属性的不等表达式的一部分。

基于上面的原因,应该根据应用程序和开发人员的需求,筛选有意义的查询结构变化

Q2:PIL_{ANG} 语句?

1、PIL_{ANG} 语句是一种特定于域的语言,基于此语言,用户可以指定查询结构变化的位置和方式,一个PIL_{ANG} 语句通过一对查询 s(p_{1},p_{2}) 进行计算,返回一个输出表,如果不匹配则返回一个∅。等价于通过 \pidiffs(p_{1},p_{2}) 进行过滤,并对子树\tau _{1}, \tau _{2} 进行转换

2、PIL_{ANG} 子句的结构组成

 FROM子句:用来定义精确界面在搜索时 结构变化的范围,并对 diffs 中的 子树 \tau _{1}, \tau _{2} 进行转换。 < path expression > 由 能确定祖先孩子关系的运算符 组成。path 总是和 diffs.\pi 匹配,它还指定要返回的祖先子树;FROM子句返回与路径匹配,并包含子树的最深子树。路径 //* 表示不对 diffs 中的子树进行转换。

总之,FROM子句就相当于把范围变量绑定到下面的语句:

SELECT id, pid1, pid2, extract(\pi,path),ancestor( \tau _{1} ,path),ancestor( \tau _{2},path)

FROM diffs

WHERE matches( \pi, path)

WHERE子句:是对FROM子句中定义的范围变量的布尔表达式;可以用路径操作符来操作子树 \tau _{i}

MATCH子句:match子句用来给PIL_{ANG} 语句命名,这样就可以用成功的匹配标记交互图中的边。

Q3:怎么执行和写PIL_{ANG}语句?

PIL_{ANG} 被转换成SQL查询,并在一对由 \left ( pid_{1},pid_{2} \right ) 定义的 diffs 分区上执行,执行的结果集中到一个叫做 diffs\_ pil 的表中。PIL_{ANG}是为开发者设计的,没有 一定处理抽象语法树的基础的用户使用起来有点困难。针对这个问题,作者开发了一个简化书写 PIL_{ANG}语句的工具:这个工具可以检测成对树中最普遍的差异,然后让用户来选择他们认为重要的差异。具体操作过程:(1) 用户指定一些可能的成对差异或者一些可能会不同的结点(2)工具从日志中提取样本,比较样本中所有成对树,并且指出满足指定条件的树(通过还原语法树,高亮那些变化的子句,这样使无基础用户更易懂)。

这个工具对任何的查询转换都能生成 PIL_{ANG}语句,为了帮助用户优化搜索,工具还可以把与现有 PIL_{ANG} 语句匹配的差异从要搜索的后序集合中排除,减小搜索范围。

 

 

 5 交互映射

前面交互mining输出一个 diffs\_ pil 表,表示日志中成对查询所表示子树之间有意义的差异。把这个 diffs\_ pil 表映射到一个交互图 G=\left ( P_{log},E \right ),图中每个顶点代表一个查询,每个记录都是一条用交互描述的有向边 e=\left ( p_{i} ,p_{j},l_{e}\right )。图是一个稠密图,因为每对查询之间可能会被多条转换边连接。目标是生成一个可以表达交互图中所有查询的一个界面集合 \mathbb{I} .

要实现这个目标,有三个挑战

(1)要为图中每条边选择合适的部件来表达交互(也就是查询语句的变化

(2)提取域和模板函数来具体化这些部件

(3)在界面上映射交互图

下面的部分则是作者针对这些问题,提出的解决方案

Q1:对交互图进行预处理

前面说过一个部件 w^{\theta }=(t_{\Pi },\Omega _{w},f_{w}) 是由一个域  \Omega _{w}\subseteq \Omega _{\theta },一个交互 t_{\pi } ,一个模板函数 f_{w}(o) =\tau 确定。如何从 diffs\_ pil  中提取模板函数和域呢?方法是从 diffs\_ pil 的子树中提取参数化的模板树,然后利用参数来构造域,还使用这些结果来标记交互图中的边。具体操作:

对于模板函数:

n 个参数代替子树 \tau 中 原来的 n个值,构建参数化的模板树 \tau ^{p};表  \mathbb{T}=\left ( \tau ^{p},v_{\mathbb{T}} \right ) 用参数化的树模型 \tau ^{p}参数值 v_{\mathbb{T}} = \left (v_{\mathbb{T}}^{i} \right )_{i\in [1,n]} 确定。然后通过这些模板把树进行分组,对每个组 g_{\tau^{p}},收集组内所有树的参数值,然后找到一个参数至少变化了一次的下标集合 K\subseteq [1,n],然后生成每个组的表 \mathbb{V}_{\tau ^{p}}=\left \{ \left ( v_{\tau} ^{k} |k\in K\right )|\tau \in g_{\tau ^{p}} \right \} ,这个表代表了在相同的参数化子树中变化的参数值。

每个部件 w_{i}^{\theta } 都有一个k维的域。如果表 \mathbb{V}_{\tau }^{p} 中的属性和 w_{i}^{\theta } 域的维度之间一一映射,则参数化子树可以被映射到部件 w,从而使每个映射都在 \Omega _{\theta } 范围内。这样的话,那模板函数 f_{w_{i}^{\theta }} 只是小部件原状态到值表中的属性的一一映射,然后这些属性绑定到了模板子树的参数。

对标记边:

交互图中每条边 e 都代表 diffs\_ pil 表中的一条记录 r。我们用 路径r.\pi和模板子树 r.\tau _{2}^{p} 标记边 l_{e} = \left ( r.\pi ,r.\tau _{2}^{p} \right ),还有其参数值 v_{r.\tau _{2}} .

一个边可以被映射到界面的多个部件,把这个候选部件集叫做 W_{e}.

Q2:部件映射

下一步生成可以 表示 log 中所有查询的界面集合 \mathbb{I}.

(1)首先,定义界面闭包集合 I_{closure},根据交互图确定它的代价 C_{I},从集合覆盖问题出发,通过松弛,证明了界面生成问题是个NP问题。作者提出了一个带优化的图松弛启发式算法来加快这个过程。作者假定每条边都有一个候选部件,每个转换都是标准的,并且每个 PIL_{ANG} 语句在任何成对查询之间最多生成一条边。然后对这些约束进行松弛。

(2)一个界面 I=(p_{0}^{I},W^{I}) 包括一个初始的查询 p^{I}和一个部件集合。定义这个界面的闭包为一个可达查询的集合。

p^{i}可达:存在一些从初始查询p_{0}^{I}p^{i} 的路径,这些路径可以由 W^{I}中的部件表达)

(边 e 可以用部件 w 表示:边 e 的路径和模板子树 和部件的相同,则可以表示)

(3)部件 w\in W^{I} 的域定义为在 I_{closure} 中它表示的边的值的集合。这个域用来计算它的代价 C_{w}(\Omega _{w}) 以及后续的界面集合 \mathbb{I} 的代价。

Q3:解决NP-Hardness

从集合覆盖到界面生成描述松弛方法:

给定一个总体 \mathbb{U} =\left \{ u_{1},u_{2},...,u_{n} \right \} 和 一个能覆盖 \mathbb{U} 的 包含 m 个子集合的集合 \dot\mathbb{S}=\left \{ S_{i} \subseteq \mathbb{U} |i\in [1,m]\right \}。集合覆盖识别子集中的最小子集 \mathbb{S}^{\star } \subseteq \mathbb{S},那么 \mathbb{U} =\cup _{S\in \mathbb{S}^{\star }}S.(我的理解是最小不重叠的子集

可以构造一个交互图 G=\left ( \mathbb{U} ,E \right ), 每个子集 S_{i} 形成一个最大子图  \left \{ \left ( u_{i},u_{j} \right )|u_{i} ,u_{j}\in S_{i}\right \}\subseteq E我理解的是这个子集中的查询结构差异是相似的),这个图的边由子集的id l_{e}=S_{i} 标识。最大子图中的边由一个唯一的候选组件 w_{i} 表示(也就是说这个子集中的界面是可以用一个候选部件表示的),若其域为空则代价为0,否则为1。往一个界面中添加组件 w_{i} 就把子集 S_{i} 中的所有元素添加到闭包中,最终界面集的部件集一起构成最终界面的候选部件集。

Q4:启发式算法

作者之前提出一种贪心启发式算法解决界面生成问题。通过为查询集中每个查询 p_{i} 分配一个界面 I_{i}=\left ( p_{i},\left \{ \right \} \right ) 初始化 最终界面集合集 \mathbb{I}^{0}=\left \{ I_{i}|i\in [1,|P_{log}|] \right \},然后使用贪心法合并界面直到这些界面的总代价不再减少为止

如果存在0个或更多的边 连接查询 p_{i}\in I_{i_{closure}}  和 p_{j}\in I_{j_{closure}} 则可以合并 界面 (I_{i},I_{j}) ,用边 e_{ij} 合并界面。

最终合并的界面 I_{ij}=(p_{0}^{I_{i}},W^{I_{ij}}) 使用 I_{i} 的初始查询,把来自两个界面的部件和边 e_{ij} 的部件结合起来构成部件集 W^{I_{ij}}=W^{I_{i}}\cup W^{I_{j}}\cup W_{e_{ij}}.


可以通过合并 表示相同转化的部件 来减少W^{I_{ij}} 。(表示相同转化的部件定义:两个有相同路径和特征函数的部件 w_{a},w_{b}\in W^{I_{ij}}可以合并成一个部件 w_{ab},其域值为 \Omega _{w_{a}}\cup \Omega _{w_{b}}).

针对每次迭代k,作者发现合并界面可以减少总代价:

 Q4:针对多个候选部件,怎么选择合适的?

在实际操作过程中,一个给定的边 e 有多种候选组件 W_{e}.

作者选择用启发式算法(合并界面)处理候选部件而不是在初始界面集就将边绑定到特定的组件上。为了完成这个任务,需要定义两个部件如何进行合并,以及他们的代价应该怎样估计。一旦完成对界面的合并,就可以从每个候选集选择代价最小的界面。

合并候选集 W_{e_{1}}W_{e_{2}} 要合并两个集合 W_{e_{1},e_{2}}=W_{e_{1}}\cup W_{e_{2}},执行上述过程的域合并的过程。候选部件集的代价通过集合中代价最小的部件确定,即  C_{W_{e}}=min(C_{w}|w\in W_{e}).

Q5:对交互图中两个顶点间的多条边的处理:

diffs\_ pil 表中包括 至少一个记录,每个都代表图中成对查询之间的一条路径,为了能完全将查询 p_{i} 转换到 p_{j},将 边 e_{1},...e_{n} 建模为一个超级边 “super—edge” e_{1...n},它的候选部件集是 每条边的候选部件集的叉乘积 W_{e_{1...n}}=\times _{i=0}^{n}W_{e_{i}}.

Q6:基于集合的交互:

大多语言支持集合表达。前述的模型没有考虑集合操作的交互建模。例如,一个查找数字差异的PIL_{ANG}语句输出了一个成对差异的集合。多数情况下,把这些成对差异映射到一个多选择的部件。

为了自动的将 这种 diffs\_ pil 表转换成基于集合的交互,作者使用一种类似于提取模板函数的方法

(1)首先收集 diffs\_ pil 里所有的子树

(2)针对每棵子树,寻找 它最近的祖先结点(祖先结点是list类型)为根的子树 \phi _{\tau }.

(3)如果不存在这样的子树,就停止。否则,用一个参数变量代替 \phi _{\tau }中的 \tau  生成一个模板祖先子树 \phi _{\tau }^{p}

(4)若所有的模板祖先都相同,就将这些子树作为一个集合,然后将这个diffs\_ pil 映射到一个集合边,这条边的候选部件是集合部件。

Q7:界面生成:

一旦确定了最优的界面集集合 \mathbb{I}^\star,就从候选集合中根据每个部件的域 选出代价最低的部件。这时就可以运行标准界面布局算法,然后为每个界面在web应用程序中呈现一个选项卡。

 

 

小结:

对整篇文章来说,最重要的部分就是 第 3/4/5 部分,这三部分重点讲了作者对提出问题的解决方案,通过建模,运用合适的算法进行解决。

这部分的内容是最晦涩难懂的,因为涉及很多数学专业名词和计算机专业名词,还有很多数学建模的过程。第二遍看,看了接近两天,还是有一部分意思理解的不太准确!可能需要多读几遍文章才能真的理解吧!

 

印象比较深的应该是把部件映射问题建模成集合覆盖问题来求解了,数学真的博大精深,任何现实问题都可以用数学思维解决,学好数学真的太重要啦!

 

2019.8.18

绿色为今日阅读新的认识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值