1. 程式人生 > >golang知識圖譜NLP實戰第二節——解析依存句法分析結果

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), &ltp)
	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 構建流程 知識