7.19
配置环境
1创建环境
conda create -n kg python=3.7
2安装所需包
neo4j图数据库
thulac分词、词性标注
py2neo python连接neo4j的工具
预训练好的词向量模型wiki.zh.bin
……
3配置neo4j
1下载neo4j安装文件,解压
2配置系统环境变量
3验证成功
构建知识图谱问题分析
知识图谱是大规模的语义网络(semantic network ),由概念实体和语义关系构成。农业知识图谱融合农业地域性,季节性,多样性等特征,利用农业领域的实体概念与关系,挖掘农业潜在价值。
暂定需求包括:
1农业实体识别:自动识别出非结构化文本中的农业实体及其农业类型
2农业实体百科:展示实体的基本信息,相关概念(词云),农业类型(树)等
3农业知识概览:采用农业百科的形式进行罗列,将农业实体类别组织成树形结构
4实体查询:输入实体,查询与其直连的实体与关系信息
6农知问答:输入问题,根据图谱关系得到答案。
其中1关键技术在于实体识别,23关键算法为dfs,2关键技术为词向量技术,456关键技术在于关系获取。
需要使用的工具如下:
Keras——深度学习框架
采用Keras深度学习框架,主要考虑其:
简易和快速的原型设计
高度模块化,极简,和可扩充特性
支持CNN和RNN,或二者的结合
Neo4j——大规模图存储
对于大规模的结点和边的存储和运算,传统关系型数据库(例如mysql)往往效率低下;而Neo4j则很好的支持高效的图运算。
查询某个实体的某个关系,mysql需要对关系表全表扫描。
此外,传统的图运算都是在内存中进行的,然而内存容量较小,往往无法加载整个知识图谱;因此采用Neo4j,服务器就能够在磁盘中进行图运算。
Neo4j使用的查询语言为Cypher,Cypher是一个描述性的图形查询语言,语法简单,功能强大。
7.20
实体识别
现实世界中存在大量的半结构化和非结构化数据。构建农业知识图谱的关键是如何获取农业领域的知识。实体识别是从半结构化数据或非结构化数据中获取知识的重要方法。
实体识别主要有以下问题需要好好思考:
1实体类型数量多,不断有新的实体出现。
2实体构成结构复杂,实体词长度没有一定的限制。
3在不同领域场景下,命名实体的外延有差异,比如:水果苹果和苹果公司
经过思考,将实体识别细化为以下步骤:
1在农业词条中提取名词后爬取其相应的解释存入数据库hudong_pedia.csv、hudong_pedia2.csv。
2确定所有命名实体的label存为predict_labels.txt备用。
3页面逻辑层demo使用提前加载好的thulac进行分词index_ERform_view.py
4调用NER.py返回不同值实现实体识别。
1数据处理 构建农业词典/data processing
1爬取到的18000多条农业词条存到agri_economic.json
2 使用thulac分词和词性标注,提取名词,最终生成了9个table.txt。
每2000条1批,每批维护一个不可重集合。
# 给定分词结果,提取NER
def createWordSet(x):
i = 0
n = len(x)
S = set()
while i < n:
if judge(x[i][0]) == False :
i += 1
continue;
if x[i][1] == 'n': # n
S.add(x[i][0])
if i >= 1 and judge(x[i-1][0]) and preok(x[i-1][1]): # all+n
S.add(x[i-1][0]+x[i][0])
if nowok(x[i][1]): #other
S.add(x[i][0])
i += 1
return S
def createTable(num):
start = time.time()
thu = thulac.thulac()
file = open('agri_economic.json', encoding='utf-8')
print("begin!")
table = set()
f = json.load(file)
count = 0
file_text = ""
for p in f:
count += 1
if int(count/2000) != num:
continue
if count % 10 == 0:
cur = time.time()
print("now id : " + str(count) + " table size :" + str(len(table)))
print("Running Time : " + str(int(cur-start)) + " s......")
detail = p['detail']
# if len(detail) > 600:
# detail = detail[0:600]
title = p['title']
table.add(title)
# 分词
text = thu.cut(detail)
table = table | createWordSet(text)
for t in table:
file_text += t+' '
file_object = open('table'+str(num)+".txt",'w')
file_object.write(file_text)
file_object.close()
3使用set去重合并生成农业词典data/merge_table.txt。
def merge():
s = set()
for i in range(10):
filename = 'table'+str(i)+".txt"
file_object = open('table'+str(i)+".txt",'r').read()
table = file_object.split()
for c in table:
s.add(c)
print(len(s))
file_object = open("merge_table3.txt",'w')
file_text = ""
for i in s:
file_text += i + " "
file_object.write(file_text)
file_object.close()
4将词典中的词在快懂百科爬取数据,提取有效的页面内容,存到hudong_pedia.csv。
导入到数据库neo4j。
// 将hudong_pedia.csv 导入
LOAD CSV WITH HEADERS FROM "file:///hudong_pedia.csv" AS line
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})
// 新增了hudong_pedia2.csv
LOAD CSV WITH HEADERS FROM "file:///hudong_pedia2.csv" AS line
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})
// 对titile属性添加UNIQUE(唯一约束/索引)
// 创建索引
CREATE CONSTRAINT ON (c:HudongItem)
ASSERT c.title IS UNIQUE
5编写create_word2vec_input.py将有效页面内容的detail生成单词序列作为word2vec的输入备用。