本篇内容:
初始数据:进行实体抽取之后的结果数据↓
(这里方便举例,只拿出了小部分数据。这里解释一下数据含义,最左边是每个旅游产品的ID,第二列表示的是旅游产品中包含的景点,第三列是途径城市,第四列是住宿地点。后边同理)
下面我们就正式开始!
我们知道,图数据库的基本数据结构是“实体-关系-实体”。将这些原始数据构建成图网络,首先应该根据需要确定我们需要提取的实体和关系。
在这里,我们确定具体需求为:
(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('写入完成!')
将关系写入文件:
既然实体已经抽取完成,那么我们接下来的工作就要分别抽取出”产品“这个实体与其他每个实体的关系。这时我们就要改变之前的纵向思维变为横向思维。
我们的思路大概是(以抽取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('写入完成!')