「智慧农业」基于碎片化的农业大数据,构建农业知识图谱(AgriKG)

项目简介

农业知识图谱(AgriKG):农业领域的信息检索,命名实体识别,关系抽取,智能问答,辅助决策。

项目以实现智慧农业为目标,探索农业大数据分析、挖掘和综合应用。课题组在前期国家重点研发计划《大数据知识工程基础理论及其应用研究》研究基础上,在本项目中,基于碎片化农业大数据,构建面向智慧农业的知识图谱及其应用系统。

设计思路

命名实体识别:

使用thulac工具进行分词,词性标注,命名实体识别(仅人名,地名,机构名) 为了识别农业领域的特定实体,我们需要:

  1. 分词,词性标注,命名实体识别
  2. 以识别为命名实体(person,location,organzation)的,若实体库没有,可以标注出来
  3. 对于非命名实体部分,采用一定的词组合和词性规则,在O(n)时间扫描所有分词,过滤掉不可能为农业实体的部分(例如动词肯定不是农业实体)
  4. 对于剩余词及词组合,匹配知识库中以分好类的实体。如果没有匹配到实体,或者匹配到的实体属于0类(即非实体),则将其过滤掉。
  5. 实体的分类算法见下文。

特征提取:

「智慧农业」基于碎片化的农业大数据,构建农业知识图谱(AgriKG)

分类器:KNN算法

定义两个页面的相似度sim(p1,p2):

标签

节点

示例

0

Invalid(不合法)

“色调”,“文化”,“景观”,“条件”,“A”,“234年”(不是具体的实体,或一些脏数据)

1

Person(人物,职位)

“袁隆平”,“副市长”

2

Location(地点,区域)

“福建省”,“三明市”,“大明湖”

3

Organization(机构,会议)

“华东师范大学”,“上海市农业委员会”

4

Political economy(政治经济名词)

“惠农补贴”,“基本建设投资”

5

Animal(动物学名词,包括畜牧类,爬行类,鸟类,鱼类,等)

“绵羊”,“淡水鱼”,“麻雀”

6

Plant(植物学名词,包括水果,蔬菜,谷物,草药,菌类,植物器官,其他植物)

“苹果”,“小麦”,“生菜”

7

Chemicals(化学名词,包括肥料,农药,杀菌剂,其它化学品,术语等)

“氮”,“氮肥”,“硝酸盐”,“吸湿剂”

8

Climate(气候,季节)

“夏天”,“干旱”

9

Food items(动植物产品)

“奶酪”,“牛奶”,“羊毛”,“面粉”

10

Diseases(动植物疾病)

“褐腐病”,“晚疫病”

11

Natural Disaster(自然灾害)

“地震”,“洪水”,“饥荒”

12

Nutrients(营养素,包括脂肪,矿物质,维生素,碳水化合物等)

“维生素A”,"钙"

13

Biochemistry(生物学名词,包括基因相关,人体部位,组织器官,细胞,细菌,术语)

“染色体”,“血红蛋白”,“肾脏”,“大肠杆菌”

14

Agricultural implements(农机具,一般指机械或物理设施)

“收割机”,“渔网”

15

Technology(农业相关术语,技术和措施)

“延后栽培",“卫生防疫”,“扦插”

16

other(除上面类别之外的其它名词实体,可以与农业无关但必须是实体)

“加速度",“cpu”,“计算机”,“爱鸟周”,“人民币”,“《本草纲目》”,“花岗岩”

关系抽取

使用远程监督方法构建数据集,利用tensorflow训练PCNN模型。

快速部署

开发/部署环境:python3,neo4j图数据库(版本没特殊要求),各python依赖包。

所以需确保安装好python3和Neo4j(任意版本),python安装可自己去查找,neo4j可参考我以前写的文章《知识图谱构建利器:图数据库Neo4j的环境部署和简单使用》。

1.下载源码

git clone https://github.com/qq547276542/Agriculture_KnowledgeGraph.git

下载完成后安装一系列的pip依赖,步骤为: cd至项目根目录,运行 sudo pip3 install -r requirement.txt,等待安装完成即可。

目录结构及介绍如下图所示:

.  MyCrawler      // scrapy爬虫项目路径(已爬好)
      MyCrawler
          data
          spiders
  data processing    // 数据清洗(已无用)
      data
  demo     // django项目路径
      Model  // 模型层,用于封装Item类,以及neo4j和csv的读取
      demo   // 用于写页面的逻辑(View)
      label_data    // 标注训练集页面的保存路径
          handwork
      static    // 静态资源
          css
          js
          open-iconic
      templates   // html页面
      toolkit   // 工具库,包括预加载,命名实体识别
      KNN_predict   
  KNN_predict    // KNN算法预测标签
  dfs_tree_crawler     // 爬取互动百科农业实体树形结构的爬虫
  wikidataSpider    //  爬取wiki中的关系

2.导入数据

2.1将hudong_pedia.csv导入neo4j作为结点,然后对titile属性添加UNIQUE(唯一约束/索引)

操作步骤为:打开启neo4j,进入neo4j控制台。将hudong_pedia.csv放入neo4j安装目录下的/import目录。在控制台依次输入:

// 将hudong_pedia.csv 导入
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})  

// 新增了hudong_pedia2.csv
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia2.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})  
// 创建索引
CREATE CONSTRAINT ON (c:HudongItem)
ASSERT c.title IS UNIQUE

2.2 进入/wikidataSpider/wikidataProcessing中,将new_node.csv,wikidata_relation.csv,wikidata_relation2.csv三个文件放入neo4j的import文件夹中(运行relationDataProcessing.py可以得到这3个文件),然后分别运行

// 导入新的节点
LOAD CSV WITH HEADERS FROM "file:///new_node.csv" AS line
CREATE (:NewNode { title: line.title })

//添加索引
CREATE CONSTRAINT ON (c:NewNode)
ASSERT c.title IS UNIQUE

//导入hudongItem和新加入节点之间的关系
LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation2.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem}) , (entity2:NewNode{title:line.NewNode})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem1}) , (entity2:HudongItem{title:line.HudongItem2})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

2.3 导入实体属性(数据来源: 互动百科)

将attributes.csv放到neo4j的import目录下,然后执行

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
                                                            
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
                                                            
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);
                                                            
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2)  

//我们建索引的时候带了label,因此只有使用label时才会使用索引,这里我们的实体有两个label,所以一共做2*2=4次。当然,可以建立全局索引,即对于不同的label使用同一个索引
                                                            
          
                                                                                                                         

2.4 导入气候名称:

将wikidataSpider/weatherData/static_weather_list.csv放在指定的位置(import文件夹下)

//导入节点
LOAD CSV WITH HEADERS FROM "file:///static_weather_list.csv" AS line
MERGE (:Weather { title: line.title })

//添加索引
CREATE CONSTRAINT ON (c:Weather)
ASSERT c.title IS UNIQUE

2.5 导入气候与植物的关系

将wikidataSpider/weatherData/weather_plant.csv放在指定的位置(import文件夹下)
//导入hudongItem和新加入节点之间的关系
LOAD CSV  WITH HEADERS FROM "file:///weather_plant.csv" AS line
MATCH (entity1:Weather{title:line.Weather}) , (entity2:HudongItem{title:line.Plant})
CREATE (entity1)-[:Weather2Plant { type: line.relation }]->(entity2)
导入城市的气候

将city_weather.csv放在指定的位置(import 文件夹下)
(这步大约需要15分钟左右)
//导入城市对应的气候
LOAD CSV WITH HEADERS FROM "file:///city_weather.csv" AS line
MATCH (city{title:line.city}) , (weather{title:line.weather})
CREATE (city)-[:CityWeather { type: line.relation }]->(weather)

3.修改Neo4j用户

进入demo/Model/neo_models.py,修改第9行的neo4j账号密码,改成你自己的

4.启动服务
进入demo目录,然后运行脚本:

django_server_start.bat

这样就成功地启动了django。我们进入8000端口主页面,输入文本,即可看到以下命名实体和分词的结果(确保django和neo4j都处于开启状态)。

功能展示
1.农业知识问答

「智慧农业」基于碎片化的农业大数据,构建农业知识图谱(AgriKG)

2.农业实体识别+实体分类

「智慧农业」基于碎片化的农业大数据,构建农业知识图谱(AgriKG)

点击实体的超链接,可以跳转到词条页面(词云采用了词向量技术):

「智慧农业」基于碎片化的农业大数据,构建农业知识图谱(AgriKG)

3.实体查询

实体查询部分,我们能够搜索出与某一实体相关的实体,以及它们之间的关系:

「智慧农业」基于碎片化的农业大数据,构建农业知识图谱(AgriKG)


「智慧农业」基于碎片化的农业大数据,构建农业知识图谱(AgriKG)

其它功能可查看官方文档:https://github.com/qq547276542/Agriculture_KnowledgeGraph

开源协议

暂无,项目代码可供参考,项目中包含的数据可免费用于学术等非商业用途。


展开阅读全文

页面更新:2024-04-10

标签:农业   分词   数据   向量   图谱   节点   碎片   实体   索引   智慧   关系   页面   项目   农业知识

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top