交互语法树
项目部署在GitPage, 版本号1.0.0
一棵语法树可以用来描述句子的产生规则,配合句子模拟器可以生成若干模拟句子
语法树是一棵有序树,即交换语法树的各个子树可能导致语义变化
- 语法树包含1个根节点
- 说明:根节点用来标识一棵语法树
- 定义:
- "type": "root"
- "children": 兴趣节点集合
- 节点颜色:灰色
- 约束:根节点子节点集合中包含1个超根节点和0个或多个子节点,每个子节点代表一种提问兴趣
- 样例:
{ "type": "root", "children": [ { "type": "holder", "children": [] }, { "type": "intent", "intent": "搜会议", "weight": 0.25, "children": [] } ] }
- 语法树包含1个超根节点
- 说明:超根节点用于挂载所有未标明兴趣的节点,作为复制子树和新建节点的挂载点
- 定义:
- "type": "holder"
- "children": 未标明兴趣的节点集合
- 节点颜色:棕色
- 约束:一棵语法树包含且只包含1个超根节点,超根节点的父节点是根节点
- 样例:
{ "type": "holder", "children": [] }
- 语法树包含0个或多个兴趣节点
- 说明:兴趣节点用于标明生成规则对应的兴趣
- 定义:
- "type": "intent"
- "intent": 对应语法树生成句子的意图
- "weight": 以多大权重生成对应语法的句子。默认值为1.0
- "children": 规则节点的集合
- 节点颜色:紫色
- 约束:一棵语法树包含的意图互不相同
- 样例:
{ "type": "intent", "intent": "搜会议", "weight": 0.25, "children": [] }
- 语法树包含控制节点
- 说明:控制节点用于控制模拟器行为
- 定义:
- "type": < "order" | "pickone" | "exchangeable" >
- order:顺序节点,模拟器按顺序产生每个子节点内容,顺序连接
- pickone:选择节点,模拟器从子节点中选择一个节点生成内容
- exchangeable:可换节点,模拟器按顺序产生每个子节点内容,shuffle这些内容后连接
- "name": (可选)节点的显示名称
- "dropout": (可选)模拟器生成内容时以多大概率剪枝。[0, 1],默认值为0
- "weight": (当父节点type为pickone或intent时有效,可选)以多大权重生成对应分支的内容。默认值为1.0
- "children": 子节点集合
- "type": < "order" | "pickone" | "exchangeable" >
- 节点颜色:
- pickone:选择节点,红色
- order:顺序节点,蓝色
- exchangeable:可换节点,黄色
- 约束:控制节点一般不为叶节点
- 样例:
{ "type": "pickone", "name": "选取一条规则", "dropout": 0.5, "children": [{ "type": "order", "name": "规则1", "weight": 0.5, "children": [] }, { "type": "exchangeable", "name": "规则2", "weight": 1.5, "children": [] }] }
- 语法树包含内容节点
- 说明:内容节点包含实际产生的内容,可由文件或标签定义
- 定义:
- "type": "content"
- "from_file": < true | false >
- true:来自文件,模拟器从指定文件获取内容,取每行split后的第一个单词,模拟器从这些单词中选取一个作为生成的内容
- false:来自标签,模拟器从指定的标签列表中随机选取一个作为生成的内容
- "filename": (当且仅当from_file为true时存在),加载的文件名
- "content": (当且仅当from_file为false时存在),内容节点的内容,字符串数组
- "entity": (可选)对应实体类型。如果该键不存在则默认为"O"类型(Other)
- "name": (可选)节点的显示名称
- "weight": (当父节点type为pickone或intent时有效,可选)以多大权重生成对应分支的内容。默认值为1.0
- "dropout": (可选)模拟器生成内容时以多大概率剪枝。[0, 1],默认值为0
- "cut": (可选)模拟器生成内容时该内容缺字的概率。[0, 1],默认值为0
- "word_cut": (当且仅当cut > 0时存在),对于每个字符,有多大概率删除该字符。[0, 1],默认值为0
- 节点颜色:绿色
- 样例:
{ "type": "content", "from_file": false, "dropout": 0.2, "content": [ "给我", "想找", "想要", "想要找", "查", "查询", "检索", "显示", "展示", "查找" ] }
一个生成询问会议的语法树的JSON示例:
{
"type": "root",
"children": [{
"type": "holder",
"children": []
}, {
"type": "intent",
"intent": "venue",
"weight": 0.2,
"children": [{
"type": "order",
"name": "ask_venue_root",
"children": [{
"type": "order",
"name": "search_node",
"children": [{
"type": "content",
"from_file": false,
"dropout": 0.2,
"content": [
"给我",
"想找",
"想要",
"想要找",
"查",
"查询",
"检索",
"显示",
"展示",
"查找"
]
}, {
"type": "content",
"from_file": false,
"dropout": 0.3,
"content": [
"一些",
"一组",
"一批",
"几个"
]
}]
}, {
"type": "pickone",
"name": "ex_keyword_node",
"children": [{
"type": "order",
"children": [{
"type": "content",
"from_file": false,
"content": [
"有关",
"关于"
]
}, {
"type": "content",
"from_file": true,
"filename": "aminer_keywords_zh.txt",
"entity": "KEY",
"name": "keyword_node"
}, {
"type": "content",
"from_file": false,
"content": [
"方面",
"方向",
"领域"
]
}, {
"type": "content",
"from_file": false,
"content": [ "的" ]
}]
}, {
"type": "order",
"children": [{
"type": "content",
"from_file": false,
"content": [
"和",
"与"
]
}, {
"type": "content",
"from_file": true,
"filename": "aminer_keywords_zh.txt",
"entity": "KEY",
"name": "keyword_node"
}, {
"type": "content",
"from_file": false,
"content": [
"相关",
"有关"
]
}, {
"type": "content",
"from_file": false,
"content": [ "的" ]
}]
}]
}, {
"type": "content",
"from_file": false,
"content": [
"期刊",
"会议"
]
}]
}]
}]
}
- (*)以树图形式展示JSON内容(完成)
- (*)导入JSON文件(完成)
- (*)将树图结果保存为JSON文件(完成)
- (*)可展开/折叠单个节点(完成)
- (**)可整体拖动(完成)
- (**)可缩放显示(完成)
- (**)可拖动节点改变顺序(完成)
- (**)支持语法树森林(提供检查)
- (***)可编辑节点内容(完成)
- (***)可拷贝子树(完成)
- (***)从JSON文件生成模拟语料(完成)
- (***)每个Intent对应一棵独立的tree(完成)
- (***)Debug(完成)
通过交互操作生成规则语法树,下载语法树json文件,利用句子模拟器生成模拟句子
-
初始界面分为左侧树界面与右侧控制界面,树界面初始包含两个节点:灰色root根节点与棕色holder超根节点。根节点用来挂载所有的兴趣节点与超根节点(作为特殊的兴趣节点),超根节点用来挂载所有未明确定义兴趣的节点
-
创建兴趣节点:要开始创建一棵新的规则语法树,首先应该创建一个紫色兴趣节点。兴趣节点用来标明所生成句子的兴趣。按照如下步骤创建一个紫色兴趣节点:
- 点击灰色根节点
- 在右侧Setting面板中找到Intent Settings - Append Intent
- 设置兴趣名称
- 设置生成属于该兴趣句子的权重
- 点击Append完成兴趣节点的创建
新创建的兴趣节点会添加到兴趣列表的尾端,可通过Intent List改变兴趣节点顺序
-
创建控制节点:句子模拟器模拟生成句子时依据控制节点来改变模拟行为。语法树包含三种控制节点:蓝色顺序选择节点、红色选择节点和黄色可换节点
- order:顺序节点,模拟器按顺序产生每个子节点内容,顺序连接
- pickone:选择节点,模拟器从子节点中选择一个节点生成内容
- exchangeable:可换节点,模拟器按顺序产生每个子节点内容,shuffle这些内容后连接
按照如下步骤创建一个控制节点:
- 在右侧Menu面板中找到Create Node
- 在Common Settings - Type中设定控制节点类型
- (可选)给控制节点命名
- (可选)调整dropout,标明你希望该控制节点以多大概率被剪枝,默认值为0.
- (可选)设置weight,该值仅当父节点类型为intent或pickone时有效,标明你希望以多大权重来生成该分支下的内容,默认值为1(有效时)
- 点击Create完成控制节点的创建
新创建的控制节点会挂载到棕色超根节点的尾端
-
创建内容节点:句子模拟器根据绿色内容节点来生成句子的内容。绿色内容节点是语法树的叶节点。按照如下步骤创建一个绿色内容节点:
- 在右侧Menu面板中找到Create Node
- 在Common Settings - Type中设置节点类型为content
- (可选)给控制节点命名
- (可选)调整dropout,标明你希望该控制节点以多大概率被剪枝,默认值为0
- (可选)设置weight,该值仅当父节点类型为intent或pickone时有效,标明你希望以多大权重来生成该分支下的内容,默认值为1(有效时)
- 选择内容来源:是否来自文件
- 设置为来自文件时,应给出内容的文件名。文件包含若干行,每行包含一个内容和内容出现的词频
最后一个分隔符后的内容被认为是内容出现的词频
- 设置为不来自文件时,可以通过点击New Tag并输入内容来添加一个tag,或点击tag上的x符号来删除某个tag
- 设置为来自文件时,应给出内容的文件名。文件包含若干行,每行包含一个内容和内容出现的词频
- (可选)设置cut,标明你希望生成的内容以何种概率缺字,默认值为0
- 当cut > 0时,设置WordCut,标明你希望以何种概率删除内容中的每个字符,默认值为0
- 点击Create完成控制节点的创建
新创建的内容节点会挂载到棕色超根节点的尾端
-
拖动节点来改变树结构:新创建的节点会被挂载到棕色超根节点下,可以使用拖动来改变树结构。
- 拖动要改变的节点
- 该节点会被临时收起,该节点与父节点的连线也会临时删除
- 所有可以挂载该节点的节点会显示交互圈
- 拖动节点到交互圈上会显示红色连接线
- 结束拖动
- 不存在红色连接线时,恢复原结构,且居中被拖动节点,并缩放至2倍大小
- 存在红色连接线时,将拖动节点挂载至对应节点上,子节点顺序按结束拖动时子节点相对父节点夹角决定
- 只有控制节点和叶节点可被拖动
- 只有兴趣节点和控制节点可挂载节点
-
查看 - 修改节点属性:可以通过点击节点来查看和修改节点属性
- 点击要查看 - 修改的节点
- 选中的节点会在节点上显示点标记,并居中放大至2倍
- 在右侧Setting面板中查看与修改节点的属性
只能在同类节点中切换节点类别。具体来说,只有控制节点可以在三种类型间切换
-
语法树操作
- 滚轮缩放
- 双击切换展开/折叠状态
- 点击拖动
-
导出树文件
- 在右侧Menu面板中找到Download JSON
- 点击Download Syntax Tree JSON
该文件可用于句子模拟器
-
导入树文件
- 在右侧Menu面板中找到Upload JSON
- 点击或拖动json文件到上传面板完成导入
仅保证导入由模拟器生成的调试树和由导出树导出文件时的行为
-
调试树
- 要展示生成路径,首先需要由句子模拟器生成一棵调试树和一个句子的调试输出
- 通过导入树导入调试树
- 在右侧Menu面板中找到Debug,打开Debug Mode开关
- 点击或拖动json文件到上传面板完成句子导入
- 点击新出现面板中的节点,会在上方树面板展示句子生成路径
该功能行为还未最终确定