当前位置:   article > 正文

golang知识图谱NLP实战第二节——解析依存句法分析结果_句法依存知识图谱

句法依存知识图谱

 golang知识图谱NLP实战第一节——整体思路

golang知识图谱NLP实战第二节——解析依存句法分析结果

golang知识图谱NLP实战第三节——关系抽取

1 参考资料

基于依存句法分析的开放式中文实体关系抽取https://blog.csdn.net/heuguangxu/article/details/80088489

基于神经网络的高性能依存句法分析器http://www.hankcs.com/nlp/parsing/neural-network-based-dependency-parser.html

基于依存关系的空间关系抽取算法https://blog.csdn.net/sinat_28901239/article/details/52184531

语言云API使用文档https://www.ltp-cloud.com/document/

https://api.ltp-cloud.com/analysis/?api_key=U1H0S1Z1CkcUtrLouJvyHVNSOWkY9ycmAVahcduW&text=%E6%88%BF%E9%A1%B6%E4%B8%8A%E8%90%BD%E7%9D%80%E4%B8%80%E5%8F%AA%E5%B0%8F%E9%B8%9F&pattern=all&format=xml

2 思路过程

可以用hanlp做句子的依存句法分析,得到字段如下:问题,怎样得到json数据?怎样让hanlp提供服务?

  1. 1 房顶 房顶 n n _ 2 定中关系 _ _
  2. 2 上 上 nd f _ 3 状中结构 _ _
  3. 3 站 站 v v _ 0 核心关系 _ _
  4. 4 着 着 u u _ 3 右附加关系 _ _
  5. 5 一 一 m m _ 6 定中关系 _ _
  6. 6 只 只 q q _ 7 定中关系 _ _
  7. 7 小鸟 小鸟 n n _ 3 动宾关系 _ _

也可以用语言云API,得到json数据如下

  1. [
  2. [
  3. [
  4. {
  5. "id": 0,
  6. "cont": "房顶",
  7. "pos": "n",
  8. "ne": "O",
  9. "parent": 1,
  10. "relate": "ATT",
  11. "semparent": 2,
  12. "semrelate": "Loc",
  13. "arg": [],
  14. "sem": [
  15. {
  16. "id": 0,
  17. "parent": 2,
  18. "relate": "Loc"
  19. }
  20. ]
  21. },
  22. {
  23. "id": 1,
  24. "cont": "上",
  25. "pos": "nd",
  26. "ne": "O",
  27. "parent": 2,
  28. "relate": "ADV",
  29. "semparent": 0,
  30. "semrelate": "mRang",
  31. "arg": [],
  32. "sem": [
  33. {
  34. "id": 0,
  35. "parent": 0,
  36. "relate": "mRang"
  37. }
  38. ]
  39. },
  40. {
  41. "id": 2,
  42. "cont": "落",
  43. "pos": "v",
  44. "ne": "O",
  45. "parent": -1,
  46. "relate": "HED",
  47. "semparent": -1,
  48. "semrelate": "Root",
  49. "arg": [
  50. {
  51. "id": 0,
  52. "type": "LOC",
  53. "beg": 0,
  54. "end": 1
  55. },
  56. {
  57. "id": 1,
  58. "type": "A1",
  59. "beg": 4,
  60. "end": 6
  61. }
  62. ],
  63. "sem": [
  64. {
  65. "id": 0,
  66. "parent": -1,
  67. "relate": "Root"
  68. }
  69. ]
  70. },
  71. {
  72. "id": 3,
  73. "cont": "着",
  74. "pos": "u",
  75. "ne": "O",
  76. "parent": 2,
  77. "relate": "RAD",
  78. "semparent": 2,
  79. "semrelate": "mTime",
  80. "arg": [],
  81. "sem": [
  82. {
  83. "id": 0,
  84. "parent": 2,
  85. "relate": "mTime"
  86. }
  87. ]
  88. },
  89. {
  90. "id": 4,
  91. "cont": "一",
  92. "pos": "m",
  93. "ne": "O",
  94. "parent": 5,
  95. "relate": "ATT",
  96. "semparent": 5,
  97. "semrelate": "Quan",
  98. "arg": [],
  99. "sem": [
  100. {
  101. "id": 0,
  102. "parent": 5,
  103. "relate": "Quan"
  104. }
  105. ]
  106. },
  107. {
  108. "id": 5,
  109. "cont": "只",
  110. "pos": "q",
  111. "ne": "O",
  112. "parent": 6,
  113. "relate": "ATT",
  114. "semparent": 6,
  115. "semrelate": "Qp",
  116. "arg": [],
  117. "sem": [
  118. {
  119. "id": 0,
  120. "parent": 6,
  121. "relate": "Qp"
  122. }
  123. ]
  124. },
  125. {
  126. "id": 6,
  127. "cont": "小鸟",
  128. "pos": "n",
  129. "ne": "O",
  130. "parent": 2,
  131. "relate": "VOB",
  132. "semparent": 2,
  133. "semrelate": "Exp",
  134. "arg": [],
  135. "sem": [
  136. {
  137. "id": 0,
  138. "parent": 2,
  139. "relate": "Exp"
  140. }
  141. ]
  142. }
  143. ]
  144. ]
  145. ]

那么有了以上数据,从go语言角度,如何实现关系抽取呢?按照上述的参考文章,先将数据转为struct,然后进行判断逻辑关系,无论是主谓关系,定中关系……还是空间方位……通过代码找出三元体吧。下一节贴出。以下是先实现了2种数据转为struct。 

  1. package main
  2. import (
  3. // "bytes"
  4. // "crypto/aes"
  5. // "crypto/cipher"
  6. // "crypto/rand"
  7. "encoding/json"
  8. "fmt"
  9. // "io"
  10. // "io/ioutil"
  11. "log"
  12. // "os"
  13. // "github.com/bitly/go-simplejson" // for json get
  14. "strings"
  15. )
  16. type Hanlp struct {
  17. ID string `json:"id"`
  18. FORM string `json:"form"`
  19. LEMMA string `json:"lemma"`
  20. CPOSTAG string `json:"cpostag"`
  21. POSTAG string `json:"postag"`
  22. FEATS string `json:"feats"`
  23. HEAD string `json:"head"`
  24. DEPREL string `json:"deprel"`
  25. }
  26. type Ltp2 struct {
  27. Ltptwo []Ltp1
  28. }
  29. type Ltp1 struct { //这个办法不行,保留!
  30. Ltpone []Ltp
  31. }
  32. type Ltp struct {
  33. Id int64 `json:"id"`
  34. Cont string `json:"cont"`
  35. Pos string `json:"pos"`
  36. Ne string `json:"ne"`
  37. Parent int64 `json:"parent"`
  38. Relate string `json:"relate"`
  39. Semparent int64 `json:"semparent"`
  40. Semrelate string `json:"semrelate"`
  41. Arg []Arg1 `json:"arg"`
  42. Sem []Sem1 `json:"sem"`
  43. }
  44. type Sem1 struct {
  45. Id int64 `json:"id"`
  46. Parent int64 `json:"parent"`
  47. Relate string `json:"relate"`
  48. }
  49. type Arg1 struct {
  50. Id int64 `json:"id"`
  51. Type string `json:"type"`
  52. Beg int64 `json:"beg"`
  53. End int64 `json:"end"`
  54. }
  55. func main() {
  56. jsonHanlpStr := `1 房顶 房顶 n n _ 2 定中关系 _ _
  57. 2 上 上 nd f _ 3 状中结构 _ _
  58. 3 站 站 v v _ 0 核心关系 _ _
  59. 4 着 着 u u _ 3 右附加关系 _ _
  60. 5 一 一 m m _ 6 定中关系 _ _
  61. 6 只 只 q q _ 7 定中关系 _ _
  62. 7 小鸟 小鸟 n n _ 3 动宾关系 _ _`
  63. // var hanlp []Hanlp
  64. hanlp := make([]Hanlp, 0) //这里不能加*号
  65. aa := make([]Hanlp, 1)
  66. array := strings.Split(jsonHanlpStr, "\n")
  67. for _, v := range array {
  68. array1 := strings.Split(v, " ")
  69. // for _, w := range array1 {
  70. aa[0].ID = array1[0]
  71. aa[0].FORM = array1[1]
  72. aa[0].LEMMA = array1[3]
  73. aa[0].CPOSTAG = array1[5]
  74. aa[0].POSTAG = array1[6]
  75. aa[0].FEATS = array1[7]
  76. aa[0].HEAD = array1[8]
  77. aa[0].DEPREL = array1[9]
  78. // }
  79. hanlp = append(hanlp, aa...)
  80. }
  81. fmt.Println(hanlp)
  82. // jsonLtpStr := `[[[{"id": 0,"cont": "房顶","pos": "n","ne": "O","parent": 1,
  83. //"relate": "ATT","semparent": 2,"semrelate": "Loc","arg": [],"sem": [{"id": 0,
  84. //"parent": 2,"relate": "Loc"}]}]]]`
  85. jsonLtpStr := `[
  86. [
  87. [
  88. {
  89. "id": 0,
  90. "cont": "房顶",
  91. "pos": "n",
  92. "ne": "O",
  93. "parent": 1,
  94. "relate": "ATT",
  95. "semparent": 2,
  96. "semrelate": "Loc",
  97. "arg": [],
  98. "sem": [
  99. {
  100. "id": 0,
  101. "parent": 2,
  102. "relate": "Loc"
  103. }
  104. ]
  105. },
  106. {
  107. "id": 1,
  108. "cont": "上",
  109. "pos": "nd",
  110. "ne": "O",
  111. "parent": 2,
  112. "relate": "ADV",
  113. "semparent": 0,
  114. "semrelate": "mRang",
  115. "arg": [],
  116. "sem": [
  117. {
  118. "id": 0,
  119. "parent": 0,
  120. "relate": "mRang"
  121. }
  122. ]
  123. },
  124. {
  125. "id": 2,
  126. "cont": "落",
  127. "pos": "v",
  128. "ne": "O",
  129. "parent": -1,
  130. "relate": "HED",
  131. "semparent": -1,
  132. "semrelate": "Root",
  133. "arg": [
  134. {
  135. "id": 0,
  136. "type": "LOC",
  137. "beg": 0,
  138. "end": 1
  139. },
  140. {
  141. "id": 1,
  142. "type": "A1",
  143. "beg": 4,
  144. "end": 6
  145. }
  146. ],
  147. "sem": [
  148. {
  149. "id": 0,
  150. "parent": -1,
  151. "relate": "Root"
  152. }
  153. ]
  154. },
  155. {
  156. "id": 3,
  157. "cont": "着",
  158. "pos": "u",
  159. "ne": "O",
  160. "parent": 2,
  161. "relate": "RAD",
  162. "semparent": 2,
  163. "semrelate": "mTime",
  164. "arg": [],
  165. "sem": [
  166. {
  167. "id": 0,
  168. "parent": 2,
  169. "relate": "mTime"
  170. }
  171. ]
  172. },
  173. {
  174. "id": 4,
  175. "cont": "一",
  176. "pos": "m",
  177. "ne": "O",
  178. "parent": 5,
  179. "relate": "ATT",
  180. "semparent": 5,
  181. "semrelate": "Quan",
  182. "arg": [],
  183. "sem": [
  184. {
  185. "id": 0,
  186. "parent": 5,
  187. "relate": "Quan"
  188. }
  189. ]
  190. },
  191. {
  192. "id": 5,
  193. "cont": "只",
  194. "pos": "q",
  195. "ne": "O",
  196. "parent": 6,
  197. "relate": "ATT",
  198. "semparent": 6,
  199. "semrelate": "Qp",
  200. "arg": [],
  201. "sem": [
  202. {
  203. "id": 0,
  204. "parent": 6,
  205. "relate": "Qp"
  206. }
  207. ]
  208. },
  209. {
  210. "id": 6,
  211. "cont": "小鸟",
  212. "pos": "n",
  213. "ne": "O",
  214. "parent": 2,
  215. "relate": "VOB",
  216. "semparent": 2,
  217. "semrelate": "Exp",
  218. "arg": [],
  219. "sem": [
  220. {
  221. "id": 0,
  222. "parent": 2,
  223. "relate": "Exp"
  224. }
  225. ]
  226. }
  227. ]
  228. ]
  229. ]`
  230. //json字符串解析到结构体,以便进行追加
  231. var ltp [][][]Ltp
  232. err := json.Unmarshal([]byte(jsonLtpStr), &ltp)
  233. if err != nil {
  234. // beego.Error(err)
  235. log.Fatal(err)
  236. }
  237. fmt.Println(ltp)
  238. fmt.Println(ltp[0][0][0].Parent)
  239. //json str 转struct
  240. // var config ConfigStruct
  241. // if err := json.Unmarshal([]byte(jsonStr), &config); err == nil {
  242. // fmt.Println("================json str 转struct==")
  243. // fmt.Println(config)
  244. // fmt.Println(config.Host)
  245. // }
  246. }

打印结果

  1. D:/Go/bin/go.exe build -i [D:/gowork/src/test_go]
  2. 成功: 进程退出代码 0.
  3. D:/gowork/src/test_go/test_go.exe [D:/gowork/src/test_go]
  4. table `user` already exists, skip
  5. [{1 房顶 房顶 n n _ 2 定中关系} {2 上 nd f _ 3 状中结构 } {3 站 v _ 0 核心关系 _} {4 着 u _ 3 右附加关系 _ _} {5 一 m _ 6 定中关系 _} {6 只 q _ 7 定中关系 _} {7 小鸟 小鸟 n n _ 3 动宾关系}]
  6. [[[{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}]}]]]
  7. 1
  8. 成功: 进程退出代码 0.

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/342411
推荐阅读
相关标签
  

闽ICP备14008679号