基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱

目录

爬取数据

数据处理

前期准备

Neo4j安装

使用Python处理

生成图谱


爬取数据

电脑打开京东首页,搜索冰箱、空调、电视机、洗衣机、热水器、电饭煲等常用的家用电器关键词,复制弹出的搜索结果界面的链接。

下载安装“八爪鱼”爬虫工具,这是一个通过定义规则自动生成脚本抓取数据的工具,注册免费版即可使用常用功能,也可以用教育邮箱注册一年专业版。

可以先学习官方提供的新手入门教程,就能快速学会自定义模板。比如自动点击下一页,自动点击每个商品链接,自动爬取价格、品牌、详情等数据。爬取足够数量的数据后导出,选择以Excel格式保存为.xlsx文件。

基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第1张图片

数据处理

前期准备

将表格内第一行删除(一般是一行无用数据,如字段名,由于京东页面元素的问题,这里没有必要设置),然后开始处理。

基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第2张图片

本项目中,根据三元组抽取实体与关系,导入neo4j数据库生成初步的知识图谱,所以先要把表格数据转换为三元组,存储于文本文档中(比如:海尔变频空调1型,价格,3899.00)。

Neo4j安装

在neo4j官网或者我的百度网盘链接(提取码4b9x)下载社区版zip压缩包或安装版exe文件。

在win10的此电脑-属性-高级系统设置-环境变量中,添加系统变量NEO4J_HOME,路径为安装包所在的路径如D:\neo4j-community-3.5.5。

再配置Path路径,系统变量的Path中添加一行%NEO4J_HOME%\bin。

管理员身份启动命令行输入neo4j.bat console测试安装结果。

安装成功后在浏览器中输入http://localhost:7474,以图形界面查看图数据库,用户名和密码一般都默认为neo4j,首次登陆后会让你修改密码。

管理员身份启动命令行输入neo4j install-service注册neo4j为计算机的服务项,输入neo4j start启动服务。

使用Python处理

已经爬取的表格形式的数据,可以用python的openpyxl包提供的方法来处理。

pip install openpyxl  #管理员命令行输入,安装openpyxl包
pip install --upgrade openpyxl  #更新openpyxl包
Python  -m pip install --upgrade pip  #更新pip
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl  #使用清华镜像
pip install -i http://pypi.douban.com/simple openpyxl  #使用豆瓣镜像

处理步骤(建议使用Python安装后自带的Shell,比PyCharm启动快):

1、在Python脚本中导入openpyxl模块。

2、调用openpyxl.load_workbook()功能获取一个Workbook对象。

3、读取active成员变量或调用get_sheet_by_name()工作簿方法获取一个Worksheet对象。

4、使用索引或通过row和column关键字参数调取Worksheet对象中的cell()表方法获取一个Cell对象。

5、读取Cell对象的value属性,即可获得单元格的内容。

处理思想:按行读取,将每行的第一格(商品名称)存至变量,将本行其余的每一个单元格前面加上变量的值存入csv文件中。

import csv 
import openpyxl

# 创建csv文件对象 #可以是别的名字,可以是绝对地址
f = open('init_csv_xyj.csv','w',encoding='utf-8',newline='')
# 基于文件对象构建csv写入对象
csv_writer = csv.writer(f)

#获取一个Workbook对象 #可以是别的名字,可以是绝对地址
wb = openpyxl.load_workbook('洗衣机.xlsx') 
#获取一个Worksheet对象
sheet = wb.get_sheet_by_name('Sheet1')

# 对行进行遍历,按行读取每个单元格内容
for row in sheet.rows:
    name = "123" #只是为了让变量不在循环结束前销毁,在这里创建
    for cell in row:
        if(cell.column == 1): #我的数据里第一列是商品名称
            name = cell.value
        elif(cell.column == 2): #京东的价格字段只有一个数,特殊处理一下
            # 写入csv文件内容
            if(cell.value != ''): #爬取时会有因为网络问题的空字段,这里去空一下
                csv_writer.writerow([name,'价格',cell.value])
        else:
            if(cell.value != ''):
                csv_writer.writerow([name,cell.value]) #不必写入第三个空参数

# 关闭csv文件
f.close()

处理完后,csv文件中是以这样的方式存储的,还需进一步处理。

基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第3张图片

这里直接使用记事本打开,使用编辑中的替换功能就可以完成处理。先将商品名称:替换为空,再将剩下的中文冒号替换为英文逗号。

 

基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第4张图片      基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第5张图片

 处理完后变成了标准三元组(这里还可以用正则表达式对其他带单位的数据进行处理,便于后期的问答),将几个家电的三元组文件合并为一个,便于处理。

基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第6张图片

接下来对总的三元组文件进行抽取实体和关系操作。

import pandas as pd
import csv

filePath = "init_csv.csv"
# 读取三元组文件
n_r_b_name = [":START_ID", "relationship", ":END_ID"]
#n_r_b = pd.read_csv("init_csv_csv.csv", sep=',', names=n_r_b_name)# 使用少量的测试数据#
n_r_b = pd.read_csv(filePath, sep=',', names=n_r_b_name)# 使用全量的数据

print(n_r_b.info())
print(n_r_b.head())

# 去除重复实体
entity = set()
entity_n = n_r_b[':START_ID'].tolist()
entity_b = n_r_b[':END_ID'].tolist()
for i in entity_n:
    entity.add(i)
for i in entity_b:
    entity.add(i)
# print(entity)

# 保存节点文件-entity.csv
csvf_entity = open("entity.csv", "w", newline='', encoding='utf-8')
w_entity = csv.writer(csvf_entity)
# 实体ID,要求唯一,名称,LABEL标签,可自己不同设定对应的标签
w_entity.writerow(("entity:ID", "name", ":LABEL"))
entity = list(entity)
entity_dict = {}
for i in range(len(entity)):
    w_entity.writerow(("e" + str(i), entity[i], "my_entity"))
    entity_dict[entity[i]] = "e"+str(i)
csvf_entity.close()

# 生成关系文件-relationship.csv
# 起始实体ID,终点实体ID,要求与实体文件中ID对应,:TYPE即为关系
n_r_b[':START_ID'] = n_r_b[':START_ID'].map(entity_dict)
n_r_b['name'] = n_r_b['relationship']
n_r_b[':END_ID'] = n_r_b[':END_ID'].map(entity_dict)
n_r_b[":TYPE"] = n_r_b['relationship']
n_r_b.pop('relationship')
n_r_b.to_csv("relationship.csv", index=False)

生成的实体与关系文件如图。 

基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第7张图片               基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第8张图片

生成图谱

将这两个文件导入neo4j数据库。

neo4j stop #先停止neo4j服务 
#然后删掉安装目录neo4j-community-3.5.5\data\databases里的默认数据库

neo4j-admin import --mode csv --database graph.db --nodes  "D:\entity.csv" --relationships "D:\relationship.csv" #注意文件路径

neo4j start #重启数据库
match(n) return n #查询所有节点

基于京东家电商品知识图谱的自动问答系统(一) -- Neo4j构建知识图谱_第9张图片

图数据库建立完成,但是精准与否全取决于数据获取和处理阶段。

 

 

你可能感兴趣的:(Python,人工智能)