互动手工消歧技术设计
1)根据解析程序的多个结果进行选择
2)对于解析程序无法完全确定结果的进行人工的指导选择,得到最后的结果
交互式消岐是在已有的语义结点(Semantic Node)的基础上获取该语义树的所有语言结点( Language Node),所有的LangugeNode的集合时一个偏序集,形成一个格结构,称为语言格(Language Lattice),然后在这个基础上再进行消岐。
下层歧义定位
针对第一种需求:
是在已有的语义结点(Semantic Node)的基础上获取该语义树的所有语言结点( Language Node),所有的LangugeNode的集合时一个偏序集,形成一个格结构,称为语言格(Language Lattice),然后在这个基础上再进行消岐。 进行第一种情形消歧的架构设计入下:
3.1算法说明
首先需要说明一个数据结构,这个数据结构应该包含该语言结点本身以及该语言结点的父节点。数据结构中父节点就是在选择该结点时可能出现的歧义。
每个Language Node都有唯一的Position Key,根据Position Key的唯一性,利用Hash方法,从Semantic Node中获取所有Language Node,并将该语言结点的父亲语言结点保存下来。同时,将在Semantic Node中最底端的叶子结点标记出来,方便下面的消岐工作。
说明:Semantic Node的叶子结点在语义方面已经是最底端的结点了,所以叶子结点肯定是没有歧义的,记录下来,减少后面消岐步骤的判断。
2)从得到的语言结点进行交互式消岐
算法f(一个语言结点):
构造一个正确的语言结点序列CorrectNodeList,这个集合中包括已经消岐或者不用消岐的语言结点,并且有一个标志该结点是否有被结合过。
A.初始话CorrectNodeLIst,将上一步得到所有的叶子结点都加入。
B.若该语言结点的父亲结点只有一个,分成两种情况:
①这个唯一的父节点Parent是根节点,即为需要Parse的语句,则显示结果。
②这个唯一的父节点不是根节点,则将该节点以及该父节点以及父节点所包含的其他子节点加入CorrectNodeList集合中。F(Parent)。
B.该节点的父亲结点不是只有一个,针对该节点的每一个父亲结点,判断该父亲结点的孩子结点是不是都在CorrectNodeList,进行计数。并将都子节点都在CorrectNodeList中的父节点标记为需要交互的分支。
该计数值>1,则说明需要进行交互;否则尝试CorrectNodeList域中没有结合过的结点。进行算法F.
3) 进行交互操作
A.根据前面的算法显示出需要进行交互的结点,并显示出歧义的分支,也就是从
2)-B中得到的需要交互的分支。
B.用户选择出正确的Parse方式后,获取被选择的正确的分支(结点的一个父亲语言结点)。如果选出来的分支就是该语句的根节点,则直接显示结果,结束;否则,标记选出来的分支结点的子结点已经被结合,并标记选出来的分支结点加入CorrectNodeList,算法F(选出来的分支结点)。
通过1)2)3)步骤,就可以经过多次的用户交互选择,得到正确的分析。
3.2数据结构说明
3.2.1
public class CorrectNode
{
public string value;
public bool IsScanned;
}
CorrectNode数据结构用来描述正确的节点的值以及这个节点是否被扫描过。
public class LangNode : Node
{
public int AbsolutePos;
public List
public bool IsValid;
public LangNode Next;
public List
public SemanticPosition Position;
public LangNode Previous;
public List
public int SN;
public SliceType Type;
public List
...
}
LangNode数据结构描述语义节点,LangNode内的Parents使得这些语义节点形成语义网格。方便遍历。
1.有些语句不能通过手动交互完成翻译
比如,带逗号的语句