【知识图谱可视化】实体抽取结果预处理,Neo4j数据导入(学习记录)

本篇内容:

  • 实体抽取内容的初步数据处理
    (之后会发关于导入neo4j数据库的相关内容)

初始数据:进行实体抽取之后的结果数据↓
(这里方便举例,只拿出了小部分数据。这里解释一下数据含义,最左边是每个旅游产品的ID,第二列表示的是旅游产品中包含的景点,第三列是途径城市,第四列是住宿地点。后边同理)
【知识图谱可视化】实体抽取结果预处理,Neo4j数据导入(学习记录)_第1张图片
下面我们就正式开始!

1. 实体内容抽取

我们知道,图数据库的基本数据结构是“实体-关系-实体”。将这些原始数据构建成图网络,首先应该根据需要确定我们需要提取的实体和关系。

在这里,我们确定具体需求为:

  • 每个产品作为一个实体;每一列中所有出现的景点、地点等名称都是实体
  • 我们需要建立的关系是产品与Attraction、City…之间的关系,共六个。

(1)统计每个分类下总共出现的实体个数:
由于后边需要建立实体间的关系,我们在这里为每个实体都加入了编号。我们在这里借助字典完成,知识很基础,在这里就不赘述啦~

attra_e={}
city_e={}
accom_e={}
country_e={}
shop_e={}
trans_e={}
product_e={} #创建每个实体的字典

#字典函数
def set_dic(entity_name,dic_name,startBy):
    number = 1
    for i in df[entity_name]:
        a = pd.isnull(i)#判断单元格是否为空
        if a == False:
            i = i.split(';')#实体间被;分隔
            for j in i:
                if j in dic_name.keys():
                    continue
                else:
                    dic_name[j] = startBy+str(number)
                    number = number + 1

可以看看结果:

{'高大上': '1011',
 '蓝洞': '1012',
 '万岁崖': '1013',
 '博物馆': '1014',
 '哈佛': '1015',
 '麻省大学': '1016',
 '两大名校': '1017',
 '海洋公园': '1018',
 '迪斯尼': '1019',
 '威基基海滩': '10110',
 '黄石国家公园': '10111',
 '大提顿国家公园': '10112',
 '尼亚加拉瀑布': '10113',
 '第五大道': '10114',
 '大瀑布': '10115',
 '小镇': '10116',
 '国家公园': '10117',
 '布莱斯峡谷国家公园': '10118',
 '大峡谷国家公园': '10119',
 '羚羊彩穴': '10120',
 '马蹄湾': '10121',
 '大峡谷': '10122',
 '大学城': '10123'}

(2)将每个实体及其编号写入文件:
在这里要注意两点,不然后期导入neo4j的时候你会伤心~
①一定要写入csv文件
②一定要注意编码格式为“UTF8"

以下是写入模块的函数:

#第一个参数是:实体的字典名
#第二个参数是:文件名(记得加.csv)
def write_entity(entity_dic,OutPut):
    mulu = '你自己的目录'
    with open(mulu+str(OutPut),'w',newline='',encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        number = 1
        writer.writerow(['entity','code'])
        for key,value in entity_dic.items():
            writer.writerow([key,value])
            number = number+1
        print('写入完成!')

看看结果:
【知识图谱可视化】实体抽取结果预处理,Neo4j数据导入(学习记录)_第2张图片

2. 关系内容抽取

将关系写入文件:
既然实体已经抽取完成,那么我们接下来的工作就要分别抽取出”产品“这个实体与其他每个实体的关系。这时我们就要改变之前的纵向思维变为横向思维。
我们的思路大概是(以抽取product和Attraction之间的关系为例):
①按行遍历列表
②取出Attraction中以;分割开的,包含的所有的景点实体名称
③从之前创建出的景点实体字典中取出其对应的value也就是景点的编码值,然后将该product的编码和Attraction中的每一个景点的编码都写入csv文件中。

以下是关系抽取+写入csv文件的函数:

def relationship_extracted(entity1,entity2,entity_dic,OutPut):
    mulu = '你的目录'
    with open(mulu+str(OutPut),'w',newline='',encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['product',entity2])
        df_1 = df[[entity1,entity2]]
        data = pd.DataFrame(df_1)
        for indexs in data.index:
            l = data.loc[indexs].values[0:]
            a = pd.isnull(l[1])
            if a == False:
                c = l[1].split(';')
                for i in c:
                    writer.writerow([product_e[l[0]],entity_dic[i]])
    print('写入完成!')

下面是得到的结果:
【知识图谱可视化】实体抽取结果预处理,Neo4j数据导入(学习记录)_第3张图片
(例如:第一行就表示,编号为704的产品中对应了101这个景点)

你可能感兴趣的:(知识图谱,学习,人工智能)