手把手教育构建农业常识图谱:农业范畴的信息检索+智能问答,命名实体辨认,联系抽取,实体联系查询

1.项目介绍:

作用展示:

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

  • 目录结构:
.
├── 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:城市与气候的联系

项目码源见文章顶部或文末

项目码源点击跳转

2.项目配置

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能够不做,猜测成果已经离线处理好了)

3.修正Neo4j用户

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

4.发动服务

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

sudo sh django_server_start.sh

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


2.1农业常识问答

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

2.2联系查询

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

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

2.3农业实体辨认+实体分类

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

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

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

2.3.1实体查询

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

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

2.3.2联系查询

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

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

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

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

2.4常识的树形结构

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

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

农业分类的树形图:

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

2.5练习集标示

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

咱们将这部分做成了小东西,可复用:github.com/qq547276542…

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

(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即可运用

3.命名实体辨认:

运用thulac东西进行分词,词性标示,命名实体辨认(仅人名,地名,机构名) 为了辨认农业范畴特定实体,咱们需求:

  1. 分词,词性标示,命名实体辨认
  2. 以辨认为命名实体(person,location,organzation)的,若实体库没有,能够标示出来
  3. 关于非命名实体部分,选用一定的词组合和词性规矩,在O(n)时间扫描所有分词,过滤掉不可能为农业实体的部分(例如动词必定不是农业实体)
  4. 关于剩下词及词组合,匹配常识库中以分好类的实体。假如没有匹配到实体,或许匹配到的实体归于0类(即非实体),则将其过滤掉。
  5. 实体的分类算法见下文。

3.1实体分类:

3.1.1特征提取:

手把手教学构建农业知识图谱:农业领域的信息检索+智能问答,命名实体识别,关系抽取,实体关系查询

3.1.2分类器: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折叠穿插验证+网格搜索得到

3.2 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”,“核算机”,“爱鸟周”,“人民币”,“《本草纲目》”,“花岗岩”

4.农业常识图谱联系抽取

运用长途监督办法构建数据集,运用tensorflow练习PCNN模型

4.1联系主动抽取

农业常识图谱联系抽取

  • data

处理数据集,得到联系抽取需求用到的json文件

过程:

  • 假如当前文件夹下没有filter_train_data_all_deduplication.txt, 那么进入wikidataSpider目录,依据TrainDataBaseOnWiki/readme.md中所述办法,取得filter_train_data_all_deduplication.txt (生成数据时间比较长,主张用揭露数据集测验。运用揭露数据集,直接从进入Algorithm,忽略之后所有的操作)
  • 运转python dosomething.py filter_dataset 得到filtered_data.txt
  • 运转python preprocessing.py rel2id 得到rel2id.json
  • 运转python preprocessing.py dataset.json得到dataset.json
  • 运转python preprocessing.py word2vecjson 得到word2vec.json
  • 运转python preprocessing.py entity2id得到entity2id.json
  • 运转python preprocessing.py dataset_split得到train_dataset.json和test_dataset.json

得到的rel2id.json,word2vec.json,entity2id.json,train_dataset.json和test_dataset.json为联系提取算法所需的数据,将其放在algorithm的data/agriculture目录下

4.2 联系提取的算法

联系提取的算法部分,tensorflow完成,代码结构以及PCNN的完成参照github.com/thunlp/Open…

更多优质内容请重视公号&知乎:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅览。

项目码源见文章顶部或文末

项目码源点击跳转