項目簡介
農業知識圖譜(AgriKG):農業領域的信息檢索,命名實體識別,關係抽取,智能問答,輔助決策。
項目以實現智慧農業為目標,探索農業大數據分析、挖掘和綜合應用。課題組在前期國家重點研發計劃《大數據知識工程基礎理論及其應用研究》研究基礎上,在本項目中,基於碎片化農業大數據,構建面向智慧農業的知識圖譜及其應用系統。
設計思路
命名實體識別:
使用thulac工具進行分詞,詞性標註,命名實體識別(僅人名,地名,機構名) 為了識別農業領域的特定實體,我們需要:
- 分詞,詞性標註,命名實體識別
- 以識別為命名實體(person,location,organzation)的,若實體庫沒有,可以標註出來
- 對於非命名實體部分,採用一定的詞組合和詞性規則,在O(n)時間掃描所有分詞,過濾掉不可能為農業實體的部分(例如動詞肯定不是農業實體)
- 對於剩餘詞及詞組合,匹配知識庫中以分好類的實體。如果沒有匹配到實體,或者匹配到的實體屬於0類(即非實體),則將其過濾掉。
- 實體的分類算法見下文。
特徵提取:
分類器: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
開源協議
暫無,項目代碼可供參考,項目中包含的數據可免費用於學術等非商業用途。