环境要求:先确保自己的电脑上安装了jdk,另外还要安装对应的Neo4j(如果没有安装请自行参考相关博客安装)

绿茶产品知识图谱构建目标

随着科技的进步,茶叶商家纷纷转向网络销售,以更加便捷的方式推广茶叶,这也使得茶叶行业的竞争变得更加激烈。同时越来越多的消费者选择电商购买茶叶。然而,这种方式下暴露了一些问题。

电商平台上的商品信息冗杂且参差不齐,缺乏系统组织和整合。随着“信息超载”现象日益严重,消费者在寻找更加符合自身需求的商品时,不得不耗费更多的时间。然而,由于电商平台缺乏对商品信息的有效提取和整合,使得消费者很难获取到容易理解的知识。尤其是茶叶商品,其信息繁杂多样,消费者在挑选过程中,需要花费大量的精力,比如查看商品简介、浏览顾客评论,以便更好地了解其基本信息和产品特点。当前,市场上的大多数电子商务平台仅仅提供了茶叶的基本信息,并展示了顾客的评论。然而,这些平台并未能将大量复杂的信息进行整合,从而形成一个更容易被消费者理解并直接使用的知识体系。因此,本文试图构建一个绿茶产品的知识图谱。

数据来源与数据预处理

爬取京东商品评论

本研究使用Python3.8工具,从京东的商城中搜索出销量Top100的绿茶产品的用户反馈文本信息,每款产品收集了1000条用户评论文本,共计10万条评论。利用Python经过一些预处理,加上人工手动处理,删掉了一些不相关的内容,最后得到了98673条有效数据。便于更好地反映用户的真实反馈,增强数据的可靠性。

实体设计与关系抽取

实体设计和关系抽取的目的是按照之前的知识图谱生成模型设计对数据完成结构化处理。绿茶产品的知识图谱中的实体包含两部分:一部分是绿茶产品最基本的实体包括绿茶商品名称,售价。毛重,茶叶形状。另一部分是结合科特勒产品层次理论实体特点设计分成三个层次:分别是核心产品层次、形式产品层次和附加产品层次。核心产品层次由口感品鉴构成,形式产品层次由包装形式、茶叶品牌、饮用功效、外观设计、产品品质构成。附加产品层次由增值服务评价构成。本文中的文本依存关系主要是“主-谓-宾”关系。以产品“京东京造信阳毛尖”举例。该款茶叶的名称就成为绿茶商品名称实体。“京东京造信阳毛尖-售价-99”形成一个商品售价三元组。“京东京造信阳毛尖-形状-尖形”形成一个商品形状三元组。“京东京造信阳毛尖-口感品鉴-口感甘甜”形成一个核心产品层次口感品鉴三元组。“京东京造信阳毛尖-饮用功效-清热解火”形成一个形式产品层次中饮用功效三元组。“京东京造信阳毛尖-增值服务评价-9.1分”形成一个附件产品层次中对增值服务评价的三元组。将提取到的每一个实体都按上述的方式建立起相应的关系最后得到结构化的文本,存放在CSV文件中,同时将CSV文件拆分成多个CSV文件。

知识图谱的存储

为了有效地展示最终得出的三元组,以便于将其存储在合适的数据库中,采用图存储的方式,这种存储方式比传统的关系型数据库更有效地处理大规模的数据。Neo4j数据库是当前非常流行的图数据库,具有导入数据方便,支持可视化展示的优点。导入过程如下:

首先,需要将CSV文件中的数据按对应的格式导入到Neo4j数据库中。Neo4j数据库自身提供的LOAD CSV命令可以将CSV文件中的三元组数据读入到Neo4j中。在LOAD命令里,需要指定CSV文件的路径和文件中每列数据的字段名,以便Neo4j可以正确地读取数据。

接下来,需要创建节点和关系类型,以表示知识图谱中的实体和它们之间的关系。通过Neo4j提供的CREATE命令,可以创建多种形式的节点和关系,这些节点可以是实体、概念,也可以是特定的标签和属性。此外,还可以根据知识图谱中的实体和关系类型,为它们赋予不同的名称,从而更好地理解它们之间的联系。

最后,根据CSV文件中的三元组连接节点和关系。为此,我们可以使用Neo4j提供的MERGE命令,根据实体名称在数据库中创建节点,并创建它们之间的关系。通过以上步骤,成功将从CSV文件中提取的三元组存储到Neo4j图数据库中。下面是图文步骤。

1.import文件中提前存入csv文件

2.启动Neo4j

在neo4j安装目录下cmd输入 neo4j.bat console

3.浏览器打开Neo4j

4.导入节点

LOAD CSV FROM 'file:///lc_name.csv' AS line CREATE (:绿茶商品名称 { name: line[0] });     
LOAD CSV FROM 'file:///lc_price.csv' AS line CREATE (:售价 { name: line[0], price: line[1]});
LOAD CSV FROM 'file:///lc_pinpai.csv' AS line CREATE (:品牌 { name: line[0], pinpai: line[1]});
LOAD CSV FROM 'file:///lc_package.csv' AS line CREATE (:包装形式 { name: line[0], package: line[1]});
LOAD CSV FROM 'file:///lc_gweight.csv' AS line CREATE (:毛重 { name: line[0], gweight: line[1]});
LOAD CSV FROM 'file:///lc_shape.csv' AS line CREATE (:形状 { name: line[0], shape: line[1]});
LOAD CSV FROM 'file:///lc_pinjian.csv' AS line CREATE (:品鉴 { name: line[0], pinjian: line[1]});
LOAD CSV FROM 'file:///lc_sheji.csv' AS line CREATE (:设计 { name: line[0], sheji: line[1]});
LOAD CSV FROM 'file:///lc_pinzhi.csv' AS line CREATE (:品质 { name: line[0], pinzhi: line[1]});
LOAD CSV FROM 'file:///lc_gongxiao.csv' AS line CREATE (:功效 { name: line[0], gongxiao: line[1]});
LOAD CSV FROM 'file:///lc_zengzhi.csv' AS line CREATE (:增值 { name: line[0], zengzhi: line[1]});                                                                               
LOAD CSV FROM 'file:///lc_wuliu.csv' AS line CREATE (:物流 { name: line[0], wuliu: line[1]})    

可以看到一个个单独的实体

5.导入对应关系

LOAD CSV WITH HEADERS FROM "file:///lc_pinpai.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (t:品牌 {pinpai: csv.pinpai})                              
            CREATE (n)-[:品牌]->(t);
LOAD CSV WITH HEADERS FROM "file:///lc_price.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (p:售价 {price: csv.price})
            CREATE (n)-[:售价]->(p);
LOAD CSV WITH HEADERS FROM "file:///lc_package.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})             
            MERGE (pa:包装形式 {package: csv.package})
            CREATE (n)-[:包装形式]->(pa);
LOAD CSV WITH HEADERS FROM "file:///lc_gweight.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (gw:毛重 {gweight: csv.gweight})
            CREATE (n)-[:毛重]->(gw);
LOAD CSV WITH HEADERS FROM "file:///lc_shape.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})             
            MERGE (s:形状 {shape: csv.shape})
            CREATE (n)-[:形状]->(s);
LOAD CSV WITH HEADERS FROM "file:///lc_pinjian.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (pj:品鉴 {pinjian: csv.pinjian})
            CREATE (n)-[:品鉴]->(pj);
LOAD CSV WITH HEADERS FROM "file:///lc_sheji.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (sj:设计 {sheji: csv.sheji})
            CREATE (n)-[:设计]->(sj);
LOAD CSV WITH HEADERS FROM "file:///lc_pinzhi.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (pz:品质 {pinzhi: csv.pinzhi})
            CREATE (n)-[:品质]->(pz);
LOAD CSV WITH HEADERS FROM "file:///lc_gongxiao.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (gx:功效 {gongxiao: csv.gongxiao})
            CREATE (n)-[:功效]->(gx);
LOAD CSV WITH HEADERS FROM "file:///lc_zengzhi.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (zz:增值 {zengzhi: csv.zengzhi})
            CREATE (n)-[:增值]->(zz);
LOAD CSV WITH HEADERS FROM "file:///lc_wuliu.csv" AS csv
            MERGE (n:绿茶商品名称 {name: csv.name})
            MERGE (wl:物流 {wuliu: csv.wuliu})
            CREATE (n)-[:物流]->(wl) 

部分图谱展示效果

图谱展开效果图

至此一个最基本的知识图谱就构建好了,下面我们可以基于这个图谱实现简单的问答搜索功能。