(三)构建知识图谱
知识图谱构建使用neo4j作为图谱数据库,因数据量庞大(4572万个实体,1.41亿条关系),需使用neo4j-admin import工具导入,导入前需准备节点和关系的文件。
-
节点数据格式
neo4j节点数据使用以下数据格式,本文统一给实体增加Entity标签,便于检索。
id:ID name :LABEL 1 姚明 Entity 2 姚沁蕾 Entity 3 中国 Entity 说明:此处id应唯一,一一对应相关实体.
-
关系数据格式
neo4j关系数据使用以下数据格式,:START_ID表示起始实体的id,:END_ID表示终止的实体id,本文统一增加Relation关系类型,便于检索。
:START_ID :END_ID :TYPE name 1 2 Relation 女儿 1 3 Relation 国籍 1 4 Relation 身高 说明:id对应关系为 (:START_ID)-[r]->(:END_ID)
-
数据抽取
数据抽取部分包括三元组抽取,属性映射,城市映射和带有单位的属性值标准化等部分。话不多说,先上代码,再谈本文所遇到的问题。
spo_extract代码如下:
import os import csv import re import build_prop_dict dir_path = os.getcwd() attr_map = build_prop_dict.load_attr_map(dir_path + '/data/prop_mapping.txt') city_map = build_prop_dict.load_city_map(dir_path + '/data/city_mapping.txt') zz_map = build_prop_dict.load_attr_map(dir_path + '/data/zhengze_mapping.txt') spo_file = open('/mnt/zjb/data/allTypeCsv.csv', 'w', encoding='utf-8') alltypeCsv = csv.writer(spo_file) entity_file = open('/mnt/zjb/data/entity.csv','w', encoding='utf-8') spo_file = open('/mnt/zjb/data/relation.csv', 'w', encoding='utf-8') ent_csv = csv.writer(entity_file) ent_csv.writerow(("id:ID", "name", ":LABEL")) spo_csv = csv.writer(spo_file) spo_csv.writerow((":START_ID", ":END_ID", ":TYPE", "name")) def remove_stopwords(s): ans = (re.sub(r'[;::;、,,.。%【】、`?*①②③④◇●◆/(& --·)\\()“”〗""》〖《 \s\d]', '', s)).replace('\u200b', '').replace("[", '').replace("]", '') return ans entity_dict = dict() idx = 0