说明:本人在知乎上也发布了这边文章,所以这里直接就转载那边的图片了,链接如下:https://zhuanlan.zhihu.com/p/77034128
本次搭建的小型知识图谱包括具体手机的分类信息和商品的具体信息,以及手机评论和评论人的详细信息。
数据集:是爬取的京东全站数据中挑选出来的,很小的部分京东手机数据,包括手机具体信息和手机评论。格式如下:


数据库:MYSQL,NEO4J
语言:Python
说明:爬虫爬下来的数据是存放在MYSQL中的,所以我是从MYSQL中取得原生态数据,然后自己进行数据清洗,存为CSV文件再存入NEO4J的。时间前后大约花费四五天的时间,数据是以前就爬取下来的,现在记录一下整个搭建过程。

1、数据获取
从MYSQL数据库中的jd_product_test和jd_review_test取得原始数据,部分代码如下:


其中也对评论内容作了情感极性分析,借助的是snownlp,这样取得的商品评论就有极性数值了,0-0.5为消极评论(比如,差,不好,性价比低,不好用),0.5-1为积极评论(比如,赞,很好,太喜欢了)。
最后结果保存为product.csv和review.csv。

2、数据清洗与处理
首先是product.csv的处理,这里我们将手机具体分类和品牌解析出来,比如category中“{'0': '手机通讯', '1': '手机', '2': '手机', '3': '华为(HUAWEI)', '4': '华为荣耀8X'}”,我们只需要后三项,手机-》华为-》华为荣耀8X,firstcateogry='手机',second_category = '华为',代码处理如下:


然后是review.csv的处理,因为JD评论中只有评论人昵称,评论具体内容和评论时间,所以针对评论人我们做了虚假性别和虚假年龄的补充以及评论人ID,而评论时间是具体到时分秒的,我们只需要年月日即可,我们将时分秒去除代码处理如下:

最后针对评论极性的处理,统一保留为4位小数,范围在[0.0001,0.9999]之间,处理如下:

最后结果保存为product.csv和str_review.csv,部分数据如下所示。

3、顶点构造与关系抽取
下一步进行关系的抽取,首先我们共有5类顶点("手机","手机品牌",“product”,"review","person"),4种关系("subcategory","product_of","reviewon","review_of"),我们挨个进行处理:
最上面的就是“手机”类,其次是“手机品牌”,而他们两个关系是“subcategory_of”,比如“手机”-》“apple”,“手机”-》“华为”。处理“手机”和“手机品牌”的函数分别bulid_first_category('data/product.csv', 'data/import/first.csv')和bulid_second_category('data/product.csv', 'data/import/second.csv'),而建立关系的函数为:build_first_second('data/import/first.csv', 'data/import/second.csv', 'data/import/first_second.csv')
然后是“product”,具体商品的处理,我们所需要一个具体商品的ID和姓名以及价格,而“product”和“品牌”之间的关系是“product_of”,比如“apple”-》"apple 8 plus","华为"-》“华为mate20”。处理的函数分别如下:build_product('data/product.csv', 'data/import/product.csv'),build_second_product( 'data/product.csv', 'data/import/second.csv')

其次是“review”顶点以及product和review之间的关系“review_on”的构造,处理他们的具体函数分别是build_review('data/str_review.csv','data/import/review.csv')和build_review_product('data/str_review.csv', 'data/import/review_product.csv')

最后是“person”顶点和person和review之间的关系“review_of”的构造,处理他们的具体函数分别是build_person('data/str_review.csv', 'data/import/person.csv')和build_person_review('data/str_review.csv', 'data/import/person_review.csv')

4、导入neo4j构造小型知识图谱
在这里我采用的是neo4j import的方式导入的CSV数据,关键语句为:
neo4j-import --into data\databases\graph.db --id-type string --nodes:first D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\first.csv --nodes:second D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\second.csv --nodes:product D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\product.csv --nodes:review D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\review.csv --nodes:person D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\person.csv --relationships:subcategory_of D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\first_second.csv --relationships:product_of D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\second_product.csv --relationships:review_on D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\review_product.csv --relationships:review_of D:\Neo4jDesktop\neo4jDatabases\database-08fa70b4-8a09-479d-90ff-6b963bb96305\installation-3.4.1\import\person_review.csv --skip-duplicate-nodes=true --skip-bad-relationships=true --stacktrace --bad-tolerance=50000000

本次一共导入5种nodes,4种relationships,这里我也弄了好一段时间,最后采用的是绝对路径的方法,总之坑也有很多!

可以看出一共导入66701个顶点,65922个关系,以及关键属性,因为挑选的数据集就很小,一共49个具体手机型号,所以量级也不是很大,本次只是牛刀小试,一个小尝试,如果将JD手机全部数据拿来构造,那量级就会比较客观了,至于JD全站数据拿来构造知识图谱就更大了。

最后效果图如下所示,这里拿华为P20pro为例:

黄色的点就是“手机”,红色的点就是“手机品牌”,蓝色的点就是具体的“product”,而青色的点是“review”,而深红色的点就是“person”,他们之间的关系也用有向边做了介绍,分别是"subcategoryof","productof",",review_on","review_of"。

相关代码以及数据集,放在本人github上了,如有需要,请移步:https://github.com/ForthEspada/JD_Cellphone_KnowledgeGraph。

欢迎大家指出不足~谢谢!