GithubHelp home page GithubHelp logo

qq547276542 / agriculture_knowledgegraph Goto Github PK

View Code? Open in Web Editor NEW
3.8K 170.0 1.5K 334.72 MB

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

License: GNU General Public License v3.0

Python 89.71% Jupyter Notebook 10.22% Shell 0.06%
knowledge-graph named-entity-recognition relation-extraction question-answering

agriculture_knowledgegraph's Introduction

Agricultural Knowledge Graph

由于工作原因,该项目已停止维护。因此项目代码仅供参考,项目中包含的数据可免费用于学术等非商业用途。

相关工作请引用paper:

  • AgriKG: An Agricultural Knowledge Graph and Its Applications[C]. DASFAA (3) 2019: 533-537

项目介绍:

本项目是上海市《农业信息服务平台及农业大数据综合利用研究》子课题《上海农业农村大数据共享服务平台建设和应用》的研究成果。

该课题是由上海市农业委员会信息中心主持,以“致富农民、服务市民、提高行政管理效能”为目标,充分发挥大数据在农业农村发展中的重要功能和巨大潜力,重点建设上海市级农业农村大数据中心,促进信息资源的共建共享和创新应用。

华东师范大学数据科学与工程学院(以下简称华师大数据学院)作为课题主要参与单位以实现智慧农业为目标,探索农业大数据分析、挖掘和综合应用。华师大课题组在前期国家重点研发计划《大数据知识工程基础理论及其应用研究》研究基础上,在本项目中,基于碎片化农业大数据,构建面向智慧农业的知识图谱及其应用系统。

华东师范大学数据科学与工程学院

情境计算&知识图谱项目组

学院官网:http://dase.ecnu.edu.cn

项目组Github: https://github.com/ECNUdase

参与成员:

Title Name Homepage
Professor Ming Gao http://faculty.ecnu.edu.cn/s/2844/t/30305/main.jspy
http://dase.ecnu.edu.cn/mgao
Master Yuanzhe Chen https://github.com/qq547276542
Master Jung kuang https://github.com/CrisJk

目录结构:

.
├── 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中的关系

可复用资源

  • hudong_pedia.csv : 已经爬好的农业实体的百科页面的结构化csv文件
  • labels.txt: 5000多个手工标注的实体类别
  • predict_labels.txt: KNN算法预测的15W多个实体的类别
  • /wikidataSpider/wikidataProcessing/wikidata_relation.csv: predict_labels.txt中实体在wikidata中对应的三元组关系
  • attributes.csv: 部分实体的属性(互动百科页面中直接得到)
  • wikidataSpider/weatherData/static_weather_list.csv: 气候类型列表
  • wikidataSpider/weatherData/weather_plant.csv:气候与植物的种植关系
  • wikidataSpider/weatherData/city_weather.csv:城市与气候的关系

项目配置

0.安装基本环境:

确保安装好python3和Neo4j(任意版本)

安装一系列pip依赖: cd至项目根目录,运行 sudo pip3 install -r requirement.txt

1.导入数据:

将hudong_pedia.csv导入neo4j:开启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

以上两步的意思是,将hudong_pedia.csv导入neo4j作为结点,然后对titile属性添加UNIQUE(唯一约束/索引)

(如果导入的时候出现neo4j jvm内存溢出,可以在导入前,先把neo4j下的conf/neo4j.conf中的dbms.memory.heap.initial_size 和dbms.memory.heap.max_size调大点。导入完成后再把值改回去)

进入/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)

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

将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使用同一个索引
                                                            
          
                                                                                                                         

导入气候名称:

将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

导入气候与植物的关系


将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)

以上步骤是导入爬取到的关系

2.下载词向量模型:(如果只是为了运行项目,步骤2可以不做,预测结果已经离线处理好了)

http://s3-us-west-1.amazonaws.com/fasttext-vectors/wiki.zh.zip
将wiki.zh.bin放入 KNN_predict 目录 。

3.修改Neo4j用户

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

4.启动服务

进入demo目录,然后运行脚本:

sudo sh django_server_start.sh

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


(update 2018.11.11)

添加了农业知识问答

(update 2018.10.26)

  • 修改部分配置信息
  • 关系查询中,添加了2个实体间的最短路查询,从而挖掘出实体之间一些奇怪的隐含关系

image

农业实体识别+实体分类

image

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

image

实体查询

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

关系查询

关系查询即查询三元组关系entity1-[relation]->entity2 , 分为如下几种情况:

  • 指定第一个实体entity1
  • 指定第二个实体entity2
  • 指定第一个实体entity1和关系relation
  • 指定关系relation和第二个实体entity2
  • 指定第一个实体entity1和第二个实体entity2
  • 指定第一个实体entity1和第二个实体entity2以及关系relation

下图所示,是指定关系relation和第二个实体entity2的查询结果

知识的树形结构

农业知识概览部分,我们能够列出某一农业分类下的词条列表,这些概念以树形结构组织在一起:

image

农业分类的树形图:

image

训练集标注

我们还制作了训练集的手动标注页面,每次会随机的跳出一个未标注过的词条。链接:http://localhost:8000/tagging-get , 手动标注的结果会追加到/label_data/labels.txt文件末尾:

我们将这部分做成了小工具,可复用:https://github.com/qq547276542/LabelMarker

image

(update 2018.04.07) 同样的,我们制作了标注关系提取训练集的工具,如下图所示

如果Statement的标签是对的,点击True按钮;否则选择一个关系,或者输入其它关系。若当前句子无法判断,则点击Change One按钮换一条数据。

说明: Statement是/wikidataSpider/TrainDataBaseOnWiki/finalData中train_data.txt中的数据,我们将它转化成json,导入到mongoDB中。标注好的数据同样存在MongoDB中另一个Collection中。关于Mongo的使用方法可以参考官方tutorial,或者利用这篇文章简单了解一下MongoDB

我们在MongoDB中使用两个Collections,一个是train_data,即未经人工标注的数据;另一个是test_data,即人工标注好的数据。

使用方法: 启动neo4j,mongodb之后,进入demo目录,启动django服务,进入127.0.0.1:8000/tagging即可使用

思路

命名实体识别:

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

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

实体分类:

特征提取:

image

分类器:KNN算法

  • 无需表示成向量,比较相似度即可
  • K值通过网格搜索得到

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

  • title之间的词向量的余弦相似度(利用fasttext计算的词向量能够避免out of vocabulary)
  • 2组openType之间的词向量的余弦相似度的平均值
  • 相同的baseInfoKey的IDF值之和(因为‘中文名’这种属性贡献应该比较小)
  • 相同baseInfoKey下baseInfoValue相同的个数
  • 预测一个页面时,由于KNN要将该页面和训练集中所有页面进行比较,因此每次预测的复杂度是O(n),n为训练集规模。在这个过程中,我们可以统计各个分相似度的IDF值,均值,方差,标准差,然后对4个相似度进行标准化:(x-均值)/方差
  • 上面四个部分的相似度的加权和为最终的两个页面的相似度,权值由向量weight控制,通过10折叠交叉验证+网格搜索得到

Labels:(命名实体的分类)

Label NE Tags Example
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模型 详情见: relationExtraction

agriculture_knowledgegraph's People

Contributors

crisjk avatar dukeenglish avatar qq547276542 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

agriculture_knowledgegraph's Issues

实体类别 是否可以扩展?

您好,实体类别 是否可以扩展?
机构名里是否可以再继续细分?譬如说:

  1. “A公司起诉B公司”。那么A和B都是机构名,但是我想继续细分:A公司是原告,B公司是被告
    如果可以的话,是不是只要在标注的时候进行扩展?

请教

我想问一下,比如一个句子中出现了多个实体你是怎么识别他们之间的关系呢?
比如一个句子出现了3个实体,那你怎么判断他们之间的关系呢?
还要就是在进行测试的时候识别出来的实体和关系类别不匹配怎么办?
比如识别出来实体1 实体2 关系类别 可是可能识别出来的实体类别并不是改中关系类型的实体。

NEO4J的语句有一处小错误

导入实体属性(数据来源: 互动百科)环节:
原来为:
LOAD CSV WITH HEADRS FROM "file:///attributes.csv" AS line
应该为:
LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
写错啦~

感谢开源!

demo链接无效?

你们项目里面提供的demo链接无法打开
demo

是否更新了链接,能否提供,实际体验下?

图谱演示

你好,请问问答界面上的图谱演示(推理过程)是这么实现的呢?

在调试智能问答时无法返回答案

在demo 的question_answering.py文件中,有一个方法
elif(xingzhengjibie == "镇"):
upper_address = get_xian_address(address)
if(len(ret_dict) == 0 and upper_address!=0):
ret_dict = get_xian_plant(upper_address,ret_dict)
if(len(ret_dict) >0 ):
ret_dict['list'].append({'entity1':address,'rel':'属于','entity2':upper_address,'entity1_type':'地点','entity2_type':'地点'})
其中get_xian_address(address)返回值为空,所以导致问答界面检索不出答案,请问这个方法可以改进吗?

启动django时报错

Neo.ClientError.Statement.SyntaxError: Invalid input 'u': expected 't/T', 'e/E' or 'n/N' (line 1, column 2 (offset: 1))
"sudo sh django_server_start.sh"

Syntax error in try.py and 'unicode' was removed in Python 3

flake8 testing of https://github.com/qq547276542/Agriculture_KnowledgeGraph on Python 3.6.3

$ flake8 . --count --select=E901,E999,F821,F822,F823 --show-source --statistics

./demo/static/assets/jquery-file-upload/server/gae-python/main.py:70:38: F821 undefined name 'unicode'
            if type(fieldStorage) is unicode:
                                     ^
./wikidataSpider/wikidataCrawler/try.py:1:1: E999 SyntaxError: invalid syntax
<!DOCTYPE html>
^
1     E999 SyntaxError: invalid syntax
1     F821 undefined name 'unicode'
2

cypher语句有问题,导致报exception

按照流程走下来,在任意页面上,点击按钮,均报exception
22_17_55__07_14_2019
22_17_17__07_14_2019

debug发现,cypher语句进行查询时,导致了exception
请问是怎么回事呢?

标记相关的几个问题

1、从代码看mongo有两个collection,一个是train_data,一个是test_data,前者在readme里说明了怎么准备,请问后者从哪里得到
2、我看修改tag只是写到txt里,而显示实体详情里,分类则是使用predict里的标签,那么这个修改如何奏效

请指教,谢谢

模型下载失败

KNN-predict上的自行下载中文模型的链接点击后显示:This XML file does not appear to have any style information associated with it. The document tree is shown below.

项目实现

你好,能否做个相关视频教程,演示一下全流程的实现过程?付费也没关系,你这个案例很典型。谢谢。

关于py2neo的问题

新版的py2neo在使用实体识别时会提示'Graph' object has no attribute 'find_one'。新版的py2neo已经更换了api,如果可以的话,能否给出你们使用的py2neo的版本。

并建议提供requirement.txt,方便快速的使用pip下载对应版本的包。

谢谢!

请问关系提取是如何实现的?

请问关系提取实现的具体代码在哪一部分,想学习下
看了ppt, 中提到用有监督学习的模式发现关系,可是看了md好像没有提及此部分。
谢谢~

MyCrawler

MyCrawler中爬虫的链接现在应该是不可以用了,他们的网站有很大的改版把,不知道作者最开始爬取的是哪个网站?

如何识别出特定邻域的命名实体

通常现成的库只能识别出人名、地名、机构名等实体,但是对于特定的领域来说,只有这三类实体往往是不够的,请问您是如何识别出特定领域(农业领域)的命名实体的呢?能介绍一下算法吗?
谢谢。

问题请教

你好,请问下楼主知识图谱补全是怎么做的呢

关于问答

请问问答是这么实现的?是基于模板还是神经网络呢

请教关于实体存储的方法

最近认真拜读了这个项目,感觉很有学习意义和落地指导作用.
但是在看实体的信息的时候,注意到baseInfoKeyList和baseInfoValueList是用"##"分割的.
我所疑惑的是为什么不作为property存储?是出于项目需求还是一般惯例?
多谢分享这么优秀的项目.

实体列表的获取

你好,我看程序最终获得的实体列表merge_table3.txt中实体数量很多,与dfs_tree_crawler中爬虫爬取的实体数量差很大。
我想问下最终得到merge_table3.txt还经历了哪些步骤,谢谢~

pyfasttext

您好,官方已经不再维护pyfasttext,pip无法安装,不知道这个问题怎么解决

wikidataAnalyse

您好,wikidataSpider下没有wikidataAnalyse的目录,看介绍说attributes.csv是这个目录下的extractEntityAttribute.py得到的

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.