golang知識圖譜NLP實戰第二節——解析依存句法分析結果
1 參考資料
2 思路過程
可以用hanlp做句子的依存句法分析,得到欄位如下:問題,怎樣得到json資料?怎樣讓hanlp提供服務?
1 房頂 房頂 n n _ 2 定中關係 _ _
2 上 上 nd f _ 3 狀中結構 _ _
3 站 站 v v _ 0 核心關係 _ _
4 著 著 u u _ 3 右附加關係 _ _
5 一 一 m m _ 6 定中關係 _ _
6 只 只 q q _ 7 定中關係 _ _
7 小鳥 小鳥 n n _ 3 動賓關係 _ _
也可以用語言云API,得到json資料如下
[ [ [ { "id": 0, "cont": "房頂", "pos": "n", "ne": "O", "parent": 1, "relate": "ATT", "semparent": 2, "semrelate": "Loc", "arg": [], "sem": [ { "id": 0, "parent": 2, "relate": "Loc" } ] }, { "id": 1, "cont": "上", "pos": "nd", "ne": "O", "parent": 2, "relate": "ADV", "semparent": 0, "semrelate": "mRang", "arg": [], "sem": [ { "id": 0, "parent": 0, "relate": "mRang" } ] }, { "id": 2, "cont": "落", "pos": "v", "ne": "O", "parent": -1, "relate": "HED", "semparent": -1, "semrelate": "Root", "arg": [ { "id": 0, "type": "LOC", "beg": 0, "end": 1 }, { "id": 1, "type": "A1", "beg": 4, "end": 6 } ], "sem": [ { "id": 0, "parent": -1, "relate": "Root" } ] }, { "id": 3, "cont": "著", "pos": "u", "ne": "O", "parent": 2, "relate": "RAD", "semparent": 2, "semrelate": "mTime", "arg": [], "sem": [ { "id": 0, "parent": 2, "relate": "mTime" } ] }, { "id": 4, "cont": "一", "pos": "m", "ne": "O", "parent": 5, "relate": "ATT", "semparent": 5, "semrelate": "Quan", "arg": [], "sem": [ { "id": 0, "parent": 5, "relate": "Quan" } ] }, { "id": 5, "cont": "只", "pos": "q", "ne": "O", "parent": 6, "relate": "ATT", "semparent": 6, "semrelate": "Qp", "arg": [], "sem": [ { "id": 0, "parent": 6, "relate": "Qp" } ] }, { "id": 6, "cont": "小鳥", "pos": "n", "ne": "O", "parent": 2, "relate": "VOB", "semparent": 2, "semrelate": "Exp", "arg": [], "sem": [ { "id": 0, "parent": 2, "relate": "Exp" } ] } ] ] ]
那麼有了以上資料,從go語言角度,如何實現關係抽取呢?按照上述的參考文章,先將資料轉為struct,然後進行判斷邏輯關係,無論是主謂關係,定中關係……還是空間方位……通過程式碼找出三元體吧。下一節貼出。以下是先實現了2種資料轉為struct。
package main import ( // "bytes" // "crypto/aes" // "crypto/cipher" // "crypto/rand" "encoding/json" "fmt" // "io" // "io/ioutil" "log" // "os" // "github.com/bitly/go-simplejson" // for json get "strings" ) type Hanlp struct { ID string `json:"id"` FORM string `json:"form"` LEMMA string `json:"lemma"` CPOSTAG string `json:"cpostag"` POSTAG string `json:"postag"` FEATS string `json:"feats"` HEAD string `json:"head"` DEPREL string `json:"deprel"` } type Ltp2 struct { Ltptwo []Ltp1 } type Ltp1 struct { //這個辦法不行,保留! Ltpone []Ltp } type Ltp struct { Id int64 `json:"id"` Cont string `json:"cont"` Pos string `json:"pos"` Ne string `json:"ne"` Parent int64 `json:"parent"` Relate string `json:"relate"` Semparent int64 `json:"semparent"` Semrelate string `json:"semrelate"` Arg []Arg1 `json:"arg"` Sem []Sem1 `json:"sem"` } type Sem1 struct { Id int64 `json:"id"` Parent int64 `json:"parent"` Relate string `json:"relate"` } type Arg1 struct { Id int64 `json:"id"` Type string `json:"type"` Beg int64 `json:"beg"` End int64 `json:"end"` } func main() { jsonHanlpStr := `1 房頂 房頂 n n _ 2 定中關係 _ _ 2 上 上 nd f _ 3 狀中結構 _ _ 3 站 站 v v _ 0 核心關係 _ _ 4 著 著 u u _ 3 右附加關係 _ _ 5 一 一 m m _ 6 定中關係 _ _ 6 只 只 q q _ 7 定中關係 _ _ 7 小鳥 小鳥 n n _ 3 動賓關係 _ _` // var hanlp []Hanlp hanlp := make([]Hanlp, 0) //這裡不能加*號 aa := make([]Hanlp, 1) array := strings.Split(jsonHanlpStr, "\n") for _, v := range array { array1 := strings.Split(v, " ") // for _, w := range array1 { aa[0].ID = array1[0] aa[0].FORM = array1[1] aa[0].LEMMA = array1[3] aa[0].CPOSTAG = array1[5] aa[0].POSTAG = array1[6] aa[0].FEATS = array1[7] aa[0].HEAD = array1[8] aa[0].DEPREL = array1[9] // } hanlp = append(hanlp, aa...) } fmt.Println(hanlp) // jsonLtpStr := `[[[{"id": 0,"cont": "房頂","pos": "n","ne": "O","parent": 1, //"relate": "ATT","semparent": 2,"semrelate": "Loc","arg": [],"sem": [{"id": 0, //"parent": 2,"relate": "Loc"}]}]]]` jsonLtpStr := `[ [ [ { "id": 0, "cont": "房頂", "pos": "n", "ne": "O", "parent": 1, "relate": "ATT", "semparent": 2, "semrelate": "Loc", "arg": [], "sem": [ { "id": 0, "parent": 2, "relate": "Loc" } ] }, { "id": 1, "cont": "上", "pos": "nd", "ne": "O", "parent": 2, "relate": "ADV", "semparent": 0, "semrelate": "mRang", "arg": [], "sem": [ { "id": 0, "parent": 0, "relate": "mRang" } ] }, { "id": 2, "cont": "落", "pos": "v", "ne": "O", "parent": -1, "relate": "HED", "semparent": -1, "semrelate": "Root", "arg": [ { "id": 0, "type": "LOC", "beg": 0, "end": 1 }, { "id": 1, "type": "A1", "beg": 4, "end": 6 } ], "sem": [ { "id": 0, "parent": -1, "relate": "Root" } ] }, { "id": 3, "cont": "著", "pos": "u", "ne": "O", "parent": 2, "relate": "RAD", "semparent": 2, "semrelate": "mTime", "arg": [], "sem": [ { "id": 0, "parent": 2, "relate": "mTime" } ] }, { "id": 4, "cont": "一", "pos": "m", "ne": "O", "parent": 5, "relate": "ATT", "semparent": 5, "semrelate": "Quan", "arg": [], "sem": [ { "id": 0, "parent": 5, "relate": "Quan" } ] }, { "id": 5, "cont": "只", "pos": "q", "ne": "O", "parent": 6, "relate": "ATT", "semparent": 6, "semrelate": "Qp", "arg": [], "sem": [ { "id": 0, "parent": 6, "relate": "Qp" } ] }, { "id": 6, "cont": "小鳥", "pos": "n", "ne": "O", "parent": 2, "relate": "VOB", "semparent": 2, "semrelate": "Exp", "arg": [], "sem": [ { "id": 0, "parent": 2, "relate": "Exp" } ] } ] ] ]` //json字串解析到結構體,以便進行追加 var ltp [][][]Ltp err := json.Unmarshal([]byte(jsonLtpStr), <p) if err != nil { // beego.Error(err) log.Fatal(err) } fmt.Println(ltp) fmt.Println(ltp[0][0][0].Parent) //json str 轉struct // var config ConfigStruct // if err := json.Unmarshal([]byte(jsonStr), &config); err == nil { // fmt.Println("================json str 轉struct==") // fmt.Println(config) // fmt.Println(config.Host) // } }
列印結果
D:/Go/bin/go.exe build -i [D:/gowork/src/test_go] 成功: 程序退出程式碼 0. D:/gowork/src/test_go/test_go.exe [D:/gowork/src/test_go] table `user` already exists, skip [{1 房頂 房頂 n n _ 2 定中關係} {2 上 nd f _ 3 狀中結構 } {3 站 v _ 0 核心關係 _} {4 著 u _ 3 右附加關係 _ _} {5 一 m _ 6 定中關係 _} {6 只 q _ 7 定中關係 _} {7 小鳥 小鳥 n n _ 3 動賓關係}] [[[{0 房頂 n O 1 ATT 2 Loc [] [{0 2 Loc}]} {1 上 nd O 2 ADV 0 mRang [] [{0 0 mRang}]} {2 落 v O -1 HED -1 Root [{0 LOC 0 1} {1 A1 4 6}] [{0 -1 Root}]} {3 著 u O 2 RAD 2 mTime [] [{0 2 mTime}]} {4 一 m O 5 ATT 5 Quan [] [{0 5 Quan}]} {5 只 q O 6 ATT 6 Qp [] [{0 6 Qp}]} {6 小鳥 n O 2 VOB 2 Exp [] [{0 2 Exp}]}]]] 1 成功: 程序退出程式碼 0.
相關推薦
golang知識圖譜NLP實戰第二節——解析依存句法分析結果
1 參考資料 2 思路過程 可以用hanlp做句子的依存句法分析,得到欄位如下:問題,怎樣得到json資料?怎樣讓hanlp提供服務? 1 房頂 房頂 n n _ 2 定中關係 _ _ 2 上 上 nd f _ 3 狀中結構 _
golang知識圖譜NLP實戰第一節——整體思路
最大的願望是給engineercms工程師知識管理系統新增人工智慧——知識圖譜功能 它包含了自然語言處理(NLP)的十大任務裡的幾項(Salesforce總結的十大任務,簡單來說包括:問答、機器翻譯、摘要、自然語言推理、情感分析、語義角色標註、關係抽取、目標導向
golang知識圖譜NLP實戰第四節——關係抽取完善邏輯
用golang應用提交文字給這個hanlp服務,返回json資料格式的依存句法分析結果。 //這個是專門解析json的 package main import ( "encoding/json" "fmt" "log" "net/url" "github.
NLP(十二)依存句法分析的視覺化及圖分析
依存句法分析的效果雖然沒有像分詞、NER的效果來的好,但也有其使用價值,在日常的工作中,我們免不了要和其打交道。筆者這幾天一直在想如何分析依存句法分析的結果,一個重要的方面便是其視覺化和它的圖分析。 我們使用的NLP工具為jieba和LTP,其中jieba用於分詞,LTP用於詞性標註和句法分析,需要事
自然語言處理基礎技術之依存句法分析實戰
宣告:轉載請註明出處,謝謝:https://blog.csdn.net/m0_37306360/article/details/84645682 另外,更多實時更新的個人學習筆記分享,請關注: 知乎:https://www.zhihu.com/people/yuquanle/columns
nlp-形式語言與自動機-ch08-句法分析
1、(空) 2、(空) 3、句法分析(syntactic parsing)是自然語言處理中的關鍵技術之一,其基本任務是確定句子的句法結構(syntactic structure)或句子中詞彙之間的依存關係。 一般來說,句法分析並不是一個自然語言處理任務的最終目標,但是,它往
大規模知識圖譜資料儲存實戰解析
本文轉自公眾號PlantData知識圖譜實戰(ID:KGPlantData),本文摘錄自上海海翼知資訊科技有限公司胡芳槐博士4月14日在北京理工大學分享的《大規模知識圖譜資料儲存》PPT。 作者對知識圖譜的儲存進行了全面的介紹,內容包括:什麼是知識圖譜,知
第二節 JVM優化應用以及知識總結
family initial 內存 -s window tom linu ast 類型 在JVM中。假設98%的時間是用於GC且可用的HeapSize不足2%時將會拋出OOM異常;HeapSize最大不要超過可用物理內存的80%,一般-Xms –Xmx設置為同樣,-
知識圖譜實戰開發案例剖析(1)
get n) exp nat lar ani fat 前言 image 一、前言 這是系列博文《知識圖譜實戰開發案例剖析》第1部分:知識圖譜基礎,第一節:知識圖譜完整案例演示。該系列內容同時已經錄制成視頻課程,感興趣的可以訪問網易雲課堂。作者:張子良,版權所有,轉載請註明
知識圖譜實戰開發案例剖析(2)
spl sof 服務層 water 架構 log block mil mission 一、前言這是系列博文《知識圖譜實戰開發案例剖析》第1部分:知識圖譜基礎,第2節:知識圖譜和人工智智能。該系列內容同時已經錄制成視頻課程,感興趣的可以訪問網易雲課堂。二、正文2.1 人工智能
第二節,基礎知識之更多的例子
表達式 form 偽隨機 CP ... 表示 同一時間 ner state 先聲明:theano模塊的內容大都是參考來源於網上,並親手實踐復現一遍,也有部分內容是自己補充 本文會列出所參考文章,如有版權問題,請聯系我,我會及時刪除 # -*- coding: utf-
JavaScript基本知識——第二節
5.變數的型別: 變數本身是沒有型別的,只是取決於它的值。五個基本的變數型別:number、string、boolean、underfined、null,還有一個複雜變數型別—object。 6.typeof操作符: 1.用來檢測變數的型別。 2.使用方法有兩種: 1.typeof(XX
知識圖譜完整專案實戰(附原始碼)(1)
一、前言 本文是《知識圖譜完整專案實戰(附原始碼)》系列博文的第一篇,主要介紹課程設定的初衷和綱要。知識圖譜的學習是一個基礎到實戰,從入門到精通的一個逐漸深入的、漸進式的過程。在這個過程中,一個完整的專案,起到的作用往往是對過往所學全部知識的串聯和融合。只有經過一個完整專案的實踐,才能真正把所學的、離散
全國計算機等級考試二級 Python 語 言程式設計考試大綱(2018 年版)解析(第二節)
這一節我們來解析考試內容的第三部分:程式的控制結構。 1:程式的三種控制結構。 第一種為if選擇分支結構,if 語句的子句(也就是緊跟 if 語句的語句塊), 將在語句的條件為 True 時執行。如果條件為 False,子句將跳過。 在英文中, if 語
專案實戰--知識圖譜初探
實踐了下怎麼建一個簡單的知識圖譜,兩個版本,一個從 0 開始(start from scratch),一個在 CN-DBpedia 基礎上補充,把 MySQL,PostgreSQL,Neo4j 資料庫都嘗試了下。自己跌跌撞撞摸索可能踩坑了都不知道,歡迎討論。 CN-DBpedia 構建流程 知識庫可以分為
NLP, 知識圖譜參考資源
NLP 書籍 網站 工具 Natural Language Toolkit(NLTK) OpenNLP FudanNLP Stanford CoreNLP THUCTC THUCTC(
今晚8點開播 | 深度解析知識圖譜發展關鍵階段技術脈絡
作為知識圖譜領域形成過程的親歷者之一,AI科技大本營此次邀請到文因互聯 CEO 鮑捷,他將對知識圖譜的歷史淵源進行梳理,對該領域幾次發展的主要技術突破做深度解析,並分析其工業落地的幾個關鍵點。歡迎大家踴躍報名。 知識圖譜是人工智慧三大分支之一——符號主義—
白雪 | NLP加持知識圖譜在金融事件挖掘中的應用
本文轉載自公眾號:阡尋科技。9月15日訊,涵蓋金融科技、人工智慧及區塊鏈領域的2018恆生技術開
乾貨 | 陪伴我學習NLP、知識圖譜的那些資源(教程+書籍+網站+工具+論文...可以說很全面了)...
Word Hashing是非常重要的一個trick,以英文單詞來說,比如good,他可以寫成#good#,然後按tri-grams來進行分解為#go goo ood od#,再將這個tri-grams灌入到bag-of-word中,這種方式可以非常有效的解決vocabulary太大的問題(因為在真實的web
專案實戰:如何構建知識圖譜
實踐了下怎麼建一個簡單的知識圖譜,兩個版本,一個從 0 開始(start from scratch),一個在 CN-DBpedia 基礎上補充,把 MySQL,PostgreSQL,Neo4j 資料庫都嘗試了下。自己跌跌撞撞摸索可能踩坑了都不知道,歡迎討論。 1. CN-DBpedia 構建流程 知識