# 明代历史知识图谱
## 项目简介
近年来,知识图谱(Knowledge Graph)逐渐走入我们的生活中。早在2012年5月16日,Google为了提升搜索引擎返回的答案质量和用户查询的效率,发布了知识图谱。有了知识图谱作为辅助,搜索引擎能够洞察用户查询背后的语义信息,返回更为精准、结构化的信息,更大可能地满足用户的查询需求。Google知识图谱的宣传语“Things not strings.”给出了知识图谱的精髓,即,不要无意义的字符串,而是获取字符串背后隐含的对象或事物。所以我们建立知识图谱的目的就在于要建立起一个从数据到知识库中知识要素映射的过程,将知识库中的知识与问题或者数据加以关联,机器完全可以重现我们人的理解与解释过程。
本项目实现了基于明代历史人物及事件的知识图谱,让使用者沉浸在纵横开阔的历史人文知识海洋中。我们的「明代历史知识图谱」项目的关系图谱展示了关于条目主体(如`朱元璋`)的所有关联性信息,使用者可以通过某个主体的关系图谱,一步一步探索未知的关系可能性。
## 技术实现
### 图谱结构设计
本知识图谱包含10种类型的939个实体和341种类型的1501条关系及其属性。
其中,939个实体包含的类型有:历史人物、历史事件、地点、战争、权利机构、作品、历史时期、法律等9个确定的类型,对于其他实体个数较少的类型全部归到“其他”这一类别。
关系的类型包括出生于、平定、父子、修订、出版物、朋友、删除、认知、属于、影响、画作、源自等,用以描述两个实体之间的关系,针对这一条知识,还有其对应的介绍,具体组织形式可见2.2部分的 mysql数据表
### 数据采集
本组经过调研,选择了`全历史`及`百度百科`作为本项目的数据来源。
在数据采集方面,我们使用了`Python`语言中的`selenium`库及`urllib3`库爬取网页中的信息,并使用`BeautifulSoup`库及正则表达式进行网页信息解析,剔除网页中的冗杂信息,以提取出我们需要的核心数据,完成我们初步的数据获取任务。
在数据清洗方面,为了避免出现与主题相关性过低的数据被获取,在设计爬虫程序时,通过限制DFS(深度优先遍历)的深度的方式来间接限定数据与主题的相关性,初步实现过滤部分相关性较低甚至无相关性数据,在数据获取之后,通过对图数据的裁剪,分析,实现数据的二次清洗。
在数据接入方面,通过构建MySQL数据库,实现实体属性与实体关系的存储,同时利用其方便的增、删、改、查的功能,方便下一步的数据加工。我们通过调用MySQLdb库实现将爬取数据读入MySQL数据库。
在数据加工方面,从文本数据实现实体识别及关系抽取依靠的是DeepKE框架实现。在依据DeepKE等框架实现对知识图谱的抽取后,为了实现知识图谱的剪枝以确保知识图谱中实体及关系符合本项目「明代历史知识图谱」的主题,本项目设计了实体及关系的自动剪枝框架,其主要设计思路为利用爬虫在百度百科中爬取每一个实体的
词条信息,并基于语义分析的方式分析该实体与「明代历史」这一主题的关联性,对于与「明代历史」这一主题关联性不强的实体,剪枝程序会剪去此实体及与此实体有关的关系边。
完成数据爬取、知识抽提及知识图谱剪枝后得到的知识图谱中实体-属性信息表及实体间关系信息表分别如上左图及上右图所示。我们利用MySQL数据库存储爬虫爬取得到并清洗后的信息,以供之后可视化及QA的使用。
### 数据可视化
本项目基于`Neo4j`实现了项目数据的可视化。`Neo4j`是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中。但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注。
现实中很多数据都是用图来表达的,比如社交网络中人与人的关系、地图数据、或是基因信息等等。RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘。NoSQL数据库的兴起,很好地解决了海量数据的存放问题,图数据库也是NoSQL的一个分支,相比于NoSQL中的其他分支,它很适合用来原生表达图结构的数据。
本项目就基于Neo4j实现了项目数据的可视化。我们首先连接2.2中数据存储的mysql数据库,以便进行数据的读取和后来的建图等步骤,相关代码如下所示。
```python
def read_mysql(sql):
'''
从mysql数据库中数据
:param sql: sql查询语句
:return: rows 查询结果
'''
#打开数据库连接
dbconn = pymysql.connect(
host="xxx.xxx.xxx.xxx", #Your Host IP
database='yourDatabase',
user='yourUserName',
password='yourPassword'
)
#
创建游标对象
cur=dbconn.cursor()
# 执行sql语句
cur.execute(sql)
# 获取查询内容
rows = cur.fetchall()
print(rows)
# 关闭数据库连接
cur.close()
dbconn.close()
return rows
```
分别读取已经进行关系抽取与清洗加工的节点数据表和关系数据表里的数据,建立对应的节点和关系边,相关代码片段如下所示。
```python
triples = read_mysql("SELECT RA, relationship, RB FROM relationship")
for triple in triples:
# print network_row
# 获取节点
subject_node = nodes[process_string(triple[0])]
object_node = nodes[process_string(triple[2])]
relation_type = process_string(triple[1])
properties = dict()
# 从MySQL数据库中的types节点导入到neo4j
def get_nodes():
name_type = dict()
rows = read_mysql("SELECT distinct item,type FROM allItem")
for row in rows:
subject = process_string(row[0])
subject_type = process_string(row[1])
name_type[subject] = subject_type
return name_type
```
最终将节点和关系边写入到neo4j数据库中,相关代码如下所示。
```python
########################## 插入节点到Neo4j中 ##################################
node_name_type = get_nodes()
nodes = dict()
for (node_name, node_type) in node_name_type.items():
node = Node(node_type, name=node_name)
nodes[node_name] = node
# print ke_node
graph.create(node)
# 关系创建
subject_relation_object = Relationship(subject_node, relation_type, object_node, **properties)
graph.create(subject_relation_object)
```
由此,本项目的知识图谱在图数据库中的构建已经完成。具体的参数信息如下:包括939个实体节点,1501条关系边,10种实体类别和341种关系类别。将知识图谱可视化如下图所示,因为整个图谱的规模非常庞大,我们只选取了一个子图进行展示。
### 图谱应用
我们基于知识图谱中Neo4j数据库的Cypher Query Language设计了数据查询及问答系统的接口,并基于此实现了明代知识图谱的问答。Cypher是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。对于使用者的问题,一个可资参考的Cypher语言解析案例如下所示。
```sql
问句:朱棣的父亲是谁
解析结果:question_type:"relationship_query",args:{ nodes:["朱棣"],relationship:["父子”]}
Cypher语句:MATCH(n:relationship{name:"朱棣"})->
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
知识图谱是一种结构化的知识表达形式,它以图形的方式组织和存储了大量实体(如人、地点、事件等)及其相互关系。在知识图谱中,实体作为节点,实体之间的各种语义关联则通过边进行连接,形成了一个庞大的数据网络。 知识图谱的核心价值在于其能够精确、直观地表示复杂世界中的知识,并支持高效的知识查询与推理。例如,在搜索引擎中,知识图谱可以提升搜索结果的相关性和准确性,为用户提供直接的答案而非仅仅是网页链接。同时,知识图谱还能支撑高级的人工智能应用,比如问答系统、推荐系统、决策支持等领域。 构建知识图谱的过程通常包括数据抽取、知识融合、实体识别、关系抽取等多个步骤,涉及到自然语言处理、机器学习、数据库技术等多种技术手段。知识图谱的不断完善有助于实现从海量信息中挖掘深层次、有价值的知识,从而推动人工智能向着更加理解人类世界的智慧方向发展。 总之,知识图谱是一个大规模、多领域、多源异构知识集成的载体,是实现智能化信息系统的基础工具和关键基础设施,对于提升信息检索质量、推动智能应用研发具有重要作用。
资源推荐
资源详情
资源评论
收起资源包目录
明朝历史知识图谱,基于公开语料资源的爬取及数据清洗整理信息,并利用Neo4j实现图谱可视化.zip (30个子文件)
SJT-code
Spider
names 2KB
main.py 1KB
test3.py 982B
test2.py 498B
test4.py 30B
wordPosseg.py 613B
Utils.py 2KB
checkIsValid.py 2KB
bfs.py 28B
test.py 1KB
dbExe.py 1KB
db.py 241B
LICENSE 1KB
rawData
MingDynastyHistory.sql 1.12MB
relationship.json 1.11MB
allItem.json 63KB
allRelationship.json 15KB
KG.py 2KB
.idea
vcs.xml 180B
misc.xml 185B
inspectionProfiles
profiles_settings.xml 174B
modules.xml 256B
.gitignore 176B
kg.iml 317B
history-knowledge-graph-neo4j.dump 4KB
__pycache__
Utils.cpython-37.pyc 3KB
dbExe.cpython-37.pyc 2KB
Utils.cpython-39.pyc 2KB
dbExe.cpython-39.pyc 2KB
README.md 9KB
共 30 条
- 1
资源评论
- 1233214561792024-06-04感谢资源主的分享,很值得参考学习,资源价值较高,支持!
- 宁归鹿尘2024-05-10资源和描述一致,质量不错,解决了我的问题,感谢资源主。
JJJ69
- 粉丝: 6353
- 资源: 5918
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功