1. 程式人生 > >golang知識圖譜NLP實戰第一節——整體思路

golang知識圖譜NLP實戰第一節——整體思路

最大的願望是給engineercms工程師知識管理系統新增人工智慧——知識圖譜功能

它包含了自然語言處理(NLP)的十大任務裡的幾項(Salesforce總結的十大任務,簡單來說包括:問答、機器翻譯、摘要、自然語言推理、情感分析、語義角色標註、關係抽取、目標導向對話、語義分析、常識代詞消解。)

最最簡單的可操作的實現方式如下:

較複雜的如下:

最簡單的實現思路為:

給定文章(一段文字)——a用hanlp進行依存句法解析——b用上述(1)方法提取關係——c存入圖資料庫dgraph——d查詢得到關係圖譜……

下圖是dgraph展示的關係資料查詢效果(另外文章記錄dgraph的docker安裝和使用)

上文思路中,最最麻煩的是關係提取,其實還包含了實體確定吧,最近看得暈……但是上文(1)採用簡化處理,就不去糾結了。

當然,一些人的觀點我很贊同,這些演算法都是有現成的程式碼,已經實現了,問題是我們組裝起來,在自己系統裡整合,去實現它們一整套流程……

下面是hanlp的安裝和使用:目的就是上文思路的a步驟,提取句子的依存關係,基於《基於神經網路的高效能依存句法分析器

提取出了依存關係如下圖:

package engineercms;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLSentence;
import com.hankcs.hanlp.corpus.dependency.CoNll.CoNLLWord;
 
public class TestHanlp {
 
	public static void main(String[] args) {
		System.out.println(HanLP.segment("你好,歡迎使用HanLP!"));
		System.out.println(HanLP.parseDependency("李白的詩有哪些?"));
		System.out.println(HanLP.parseDependency("徐先生還具體幫助他確定了把畫雄鷹、松鼠和麻雀作為主攻目標。"));
		String text = "演算法工程師\n 演算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間複雜度與時間複雜度來衡量。演算法工程師就是利用演算法處理事物的人。\n \n 1職位簡介\n 演算法工程師是一個非常高階的職位;\n 專業要求:計算機、電子、通訊、數學等相關專業;\n 學歷要求:本科及其以上的學歷,大多數是碩士學歷及其以上;\n 語言要求:英語要求是熟練,基本上能閱讀國外專業書刊;\n 必須掌握計算機相關知識,熟練使用模擬工具MATLAB等,必須會一門程式語言。\n\n2研究方向\n 視訊演算法工程師、影象處理演算法工程師、音訊演算法工程師 通訊基帶演算法工程師\n \n 3目前國內外狀況\n 目前國內從事演算法研究的工程師不少,但是高階演算法工程師卻很少,是一個非常緊缺的專業工程師。演算法工程師根據研究領域來分主要有音訊/視訊演算法處理、影象技術方面的二維資訊演算法處理和通訊物理層、雷達訊號處理、生物醫學訊號處理等領域的一維資訊演算法處理。\n 在計算機音視訊和圖形影象技術等二維資訊演算法處理方面目前比較先進的視訊處理演算法:機器視覺成為此類演算法研究的核心;另外還有2D轉3D演算法(2D-to-3D conversion),去隔行演算法(de-interlacing),運動估計運動補償演算法(Motion estimation/Motion Compensation),去噪演算法(Noise Reduction),縮放演算法(scaling),銳化處理演算法(Sharpness),超解析度演算法(Super Resolution),手勢識別(gesture recognition),人臉識別(face recognition)。\n 在通訊物理層等一維資訊領域目前常用的演算法:無線領域的RRM、RTT,傳送領域的調製解調、通道均衡、訊號檢測、網路優化、訊號分解等。\n 另外資料探勘、網際網路搜尋演算法也成為當今的熱門方向。\n";
		System.out.println(HanLP.extractPhrase(text, 10));
		CoNLLSentence sentence = HanLP.parseDependency("徐先生還具體幫助他確定了把畫雄鷹、松鼠和麻雀作為主攻目標。");
		for (CoNLLWord word : sentence)
        {
            System.out.printf("%s --(%s)--> %s\n", word.LEMMA, word.DEPREL, word.HEAD.LEMMA);
        }
	}
}

下一步參考文章(1)進行關係提取,存入圖資料庫。

當然,依存句法的實現有很多api介面可用,比如baiduai……但是想整合到系統內,還是找現成開源的。

問題是沒有go語言的類似hanlp的工具。dgraph是go語言的,但是也需要在docker中執行。