「智慧農業」基於碎片化的農業大數據,構建農業知識圖譜(AgriKG)

hellocoder 發佈 2022-07-04T05:21:22.589709+00:00

課題組在前期國家重點研發計劃《大數據知識工程基礎理論及其應用研究》研究基礎上,在本項目中,基於碎片化農業大數據,構建面向智慧農業的知識圖譜及其應用系統。

項目簡介

農業知識圖譜(AgriKG):農業領域的信息檢索,命名實體識別,關係抽取,智能問答,輔助決策。

項目以實現智慧農業為目標,探索農業大數據分析、挖掘和綜合應用。課題組在前期國家重點研發計劃《大數據知識工程基礎理論及其應用研究》研究基礎上,在本項目中,基於碎片化農業大數據,構建面向智慧農業的知識圖譜及其應用系統。

設計思路

命名實體識別:

使用thulac工具進行分詞,詞性標註,命名實體識別(僅人名,地名,機構名) 為了識別農業領域的特定實體,我們需要:

  1. 分詞,詞性標註,命名實體識別
  2. 以識別為命名實體(person,location,organzation)的,若實體庫沒有,可以標註出來
  3. 對於非命名實體部分,採用一定的詞組合和詞性規則,在O(n)時間掃描所有分詞,過濾掉不可能為農業實體的部分(例如動詞肯定不是農業實體)
  4. 對於剩餘詞及詞組合,匹配知識庫中以分好類的實體。如果沒有匹配到實體,或者匹配到的實體屬於0類(即非實體),則將其過濾掉。
  5. 實體的分類算法見下文。

特徵提取:

分類器: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摺疊交叉驗證+網格搜索得到

標籤

節點

示例

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.農業知識問答

2.農業實體識別+實體分類

點擊實體的超連結,可以跳轉到詞條頁面(詞雲採用了詞向量技術):

3.實體查詢

實體查詢部分,我們能夠搜索出與某一實體相關的實體,以及它們之間的關係:


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

開源協議

暫無,項目代碼可供參考,項目中包含的數據可免費用於學術等非商業用途。


關鍵字: