# CivilAviation Q&A
基于民航业知识图谱的自动问答系统。
A QA system based on Civil Aviation knowledge graph.
## 平台
- Windows 10 x64
- Python 3.7
- Neo4j community 3.5.20
## 运行
1. 确保安装所需依赖
```
pip install -r requirements.txt
```
注:`python-Levenshtein` 如果安装不成功,则可以下载对其进行离线安装。
2. 构建知识图谱
修改`const.py`文件中连接数据库使用的`URI`,`USERNAME`和`PASSWORD`的值。然后执行:
```
python build_cakg.py
```
运行大约需要2~5分钟。
3. 可以使用两种方式运行:
1. 运行命令行端
```
python run_cmd.py
```
普通问题的回答以字符串的形式给出;带有图表的回答,图表会被渲染至`results`文件夹中。
2. 运行web端(效果图见下文)
```
python run_web.py
```
带有图表的回答和普通回答一样会被渲染至web页面中,同时也被保存至本地`results`文件夹中。
注1:最好使用谷歌浏览器(Google Chrome);
注2:生成图表的文件夹地址可以在`const.py`中更改`CHART_RENDER_DIR`。
4. have fun!
## 简介
### 一. 项目结构
```
--------------------------------------- root
|------data/ # 数据存放
|------dicts/ # 存放特征词(运行build_cakg.py后自动生成)
|------question/ # 存放问句中的疑问词
|------reference/ # 存放指代词
|------tail/ # 存放尾词(后缀词)
|------data.json # 从年报中组织出的数据
|------raw.7z # 11-19年的年报
|------demo/ # 以jupyter-notebook的形式给出了各种问题类型的演示和说明
|------doc/ # 存放有关readme的文件
|------lib/ # 函数库
|------results/ # 存放某些问题生成的图表(会自动生成)
|------test/ # 存放一些单元测试
|------web/ # web app
......
|------answer_search.py # 回答组织器
|------build_cakg.py # 构建知识图谱
|------chatbot.py # 自动问答器
|------const.py # 常量
|------question_classifier.py # 分类器
|------question_parser.py # 解析器
......
```
### 二. 数据组织
#### 1. 基本构想
通过浏览公报发现:
1. 每一年所涉及的目录大差不差,有时多有时少,或者只是改个名字;
2. 目录中涉及的指标每年都有一定的变动,而且某些指标里面嵌套指标,还有些指标中给出了各地区的组成值;
3. 指标的值有数值类型,也有字符串类型,有的有单位,有些则没有,而且有些单位在某些年份还不同。
基于上述几点,我将知识图谱的构建以年份为中心展开,将各个目录、指标等等实体作为知识图谱的结点。结点与结点之间相连接的关系称为`结构关系`(详细见下文),那么将每个年份结点到各个指标和地区的关系称为`值关系`(详细见下文)。将结构和值两种关系拆开,
1. 从结构关系来看,不用一个年度录入一个年度的所有指标,每个年度中肯定有重复指标,这样避免了数据冗余。若每年的指标位置基本不变,则上述做法直接可行,但实际上指标出现的位置可能每年都飘忽不定,所以若直接按上述做法会出现这种情况:
`假设2012年指标C1包含指标A、B,指标C2包含指标C;2013年指标C1包含指标A,指标C2包含指标B、C;则其结构关系为:`
![rel](doc/struct.png)
其中橙色的边是2012年特有的,蓝色的则是2013年特有的,而黑色的是它们共有的。但在知识图谱中这些边没有颜色之分,是按上图整个结构存储的,这就造成了一个父子结构关系错乱的问题,比如:我要查找13年指标C1包含的所有指标,则A和B都会被返回,而实际上B不应该被返回。
为了解决上述问题,并且不增加任何额外的关系,我为每个关系引入了一个生命周期属性`life`。这个属性运用了掩码的思想,每个年份维护自己的掩码(运行构建知识图谱脚本时会被自动生成),在遇到上述问题时,拿来和关系中的life做`与`运算,若结果不为0,就说明此年份包含此指标,反之则不含。
2. 从值关系来看,问题中也是直接给出年份和指标名称,这样也方便查询。
部分结点间的关系如下图:(橙色为年份,棕色为目录,蓝色为指标)
![kg1](doc/graph-1.png)
部分结点间的关系如下图:**(橙色为年份,棕色为目录,蓝色为指标,红色为地区/机场/公司集团,下同)**
![kg2](doc/graph-2.png)
#### 2. 知识图谱实体类型
| 实体类型 | 含义 | 数量 | 举例 |
|--|--|--|--|
| Year | 年份 | 9 | 2011,2012 |
| Catalog | 目录 | 16 | 运输航空,航空安全 |
| Index | 指标 | 242 | 运输总周转量,货邮运输量 |
| Area | 地区/机场/公司集团 | 35 | 港澳台,中航集团 |
#### 3. 知识图谱实体关系类型
| 实体结构关系类型 | 含义 | 数量 | 举例 |
|--|--|--|--|
| include | 年度包括目录、目录包括指标 | 193 | ![include](doc/graph-include.png)|
| contain | 指标(父)含有指标(子)、地区(父)含有地区(子) | 148 | ![contain](doc/graph-contain.png)|
| locate | 指标位于某地区 | 93 | ![locate](doc/graph-locate.png)|
| 实体值关系类型 | 含义 | 数量 | 举例 |
|--|--|--|--|
| info | 某年度的目录信息 | 45 | ![info](doc/graph-info.png)|
| value | 某年度的指标值 | 1194 | ![value](doc/graph-value.png) |
| 具体的指标名称 | 某年度某地区的指标值 | 781 | ![index-name](doc/graph-indexname.png)|
#### 4. 知识图谱属性类型
| 属性类型 | 含义 | 举例 |
|--|--|--|
| info | 年份或目录的整体概况 | 全年航空安全形势稳定,旅客运输和... |
| name | 各实体名称 | 2014,国内,货邮周转量 |
| value | 指标或地区的值 | 451.2,0,22 |
| unit | 指标或地区值的单位 | 亿吨公里,%,万元 |
| repr | 地区值所代表的含义 | 航线(不含港澳台),吞吐量占比 |
| child_id | 同一(父)指标下不同(子)指标拥有相同child_id的可视为构成父指标的一个角度 | 0,1,2 ... |
| life | (结构关系)生命周期 | 0x179, 0x008 |
### 三. 问题预处理
主要指年份和指标两个角度的预处理,此部分详见`lib/complement.py`。
1. 年份角度
对问题中的年份进行替换,方便特征词识别,例:
```
11年 -> 2011年
两千一十一年 -> 2011年
11-15年 -> 2011年,2012年,2013年,2014年,2015年
13到15年 -> 2013年,2014年,2015年
13年比前年 -> 2013年比2011年
15年比大大前年 -> 2015年比2011年
16年比3年前 -> 2016年比2013年
16年与前三年相比 -> 2016年与2015年,2014年,2013年相比
......
```
2. 指标角度
对问题中的指标名进行替换,避免因错字漏字而特征词识别不成功。通过`Levenshetin`算法实现对指标名的模糊查询。例:
```
游客周转量 -> 旅客周转量
......
```
### 四. 问题分类
问题的分类是基于特征词的分类,使用`ahocorasick`算法。
下表给出的是各种问题的类型,更详细的内容请参见项目`demo`中的`demo1~4.ipynb`。
| 问题类型 | 含义 | 举例 |
|--|--|--|
| year_status | 年度整体状况 | 2011年整体状况如何? |
| catalog_status | 年度目录状况 | 2012年教育�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 基于Python+Flask民航业知识图谱的自动问答系统源码+数据集+详细文档(高分毕业设计).zip基于Python+Flask民航业知识图谱的自动问答系统源码+数据集+详细文档(高分毕业设计).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕设项目、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 3、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于Python+Flask民航业知识图谱的自动问答系统源码+数据集+详细文档(高分毕业设计).zip (79个子文件)
171265889347208773632.zip 416B
QA-CivilAviationKG-master
lib
utils.py 587B
__init__.py 0B
answer.py 7KB
painter.py 5KB
mapping.py 2KB
result.py 2KB
formatter.py 2KB
life.py 836B
check.py 2KB
regexp.py 1KB
complement.py 3KB
chain.py 765B
errors.py 915B
.gitattributes 38B
doc
graph-indexname.png 12KB
graph-contain.png 12KB
graph-value.png 12KB
graph-info.png 10KB
graph-include.png 15KB
graph-locate.png 15KB
graph-2.png 83KB
web-2.png 51KB
struct.png 18KB
graph-1.png 255KB
web-1.png 42KB
web-3.png 45KB
data
raw.7z 3.5MB
data.json 301KB
question
Value.txt 50B
Exist.txt 239B
When.txt 64B
reference
Max.txt 55B
ParentIndex.txt 224B
ChildIndex.txt 148B
Index.txt 55B
Status.txt 97B
Catalog.txt 83B
Location.txt 113B
tail
Is.txt 32B
LICENSE 1KB
run_cmd.py 112B
demo
demo2.ipynb 15KB
demo4.ipynb 139KB
demo3.ipynb 13KB
demo1.ipynb 10KB
web
__init__.py 171B
templates
simple_tab.html 771B
nb_jupyter_lab.html 343B
nb_jupyter_lab_tab.html 438B
nb_jupyter_notebook.html 489B
simple_chart.html 253B
components.html 204B
simple_page.html 896B
index.html 1013B
nb_nteract.html 253B
macro 6KB
simple_globe.html 1KB
nb_jupyter_notebook_tab.html 608B
nb_jupyter_globe.html 1KB
nb_components.html 116B
main
__init__.py 85B
views.py 748B
static
js
func.js 9KB
style
index.css 2KB
run_web.py 128B
question_parser.py 8KB
const.py 158B
chatbot.py 2KB
requirements.txt 447B
answer_search.py 30KB
test
answer_test.py 30KB
classifier_test.py 18KB
parser_test.py 7KB
errors_test.py 632B
question_classifier.py 13KB
.gitignore 57B
README.md 12KB
build_cakg.py 7KB
共 79 条
- 1
资源评论
不走小道
- 粉丝: 3200
- 资源: 5124
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功