知網知識庫呼叫

思源發表於2017-09-05

機器之心曾採訪過語知科技的董強先生,在那一篇文章中,我們詳細討論了基於知網知識庫的 NLP 解決方案。雖然我們已經瞭解了這種方法的潛力,但只有真正實現了呼叫過程,並明確體會到知網知識庫的強大之處,我們才真正對這種方法有一個直觀的理解。

基於知網(HowNet)知識庫的方法在實踐和研究中確實大大提升了 NLP 的效能。在最近的 ACL 2017 會議中,清華大學牛藝霖、謝若冰、劉知遠和孫茂松等人發表了一篇名為《Improved Word Representation Learning with Sememes》的論文。該論文首次將義原資訊考慮到詞向量的學習任務中,在很大程度上提升了詞向量的表示能力。該論文是以經典的 skip-gram 模型為基礎提出來的改進模型,相對於 skip-gram 模型只考慮了上下文資訊,該論文提出的模型同時考慮詞的義原資訊以及義原資訊與詞義之間的關係。

除此之外,清華大學袁星馳,謝若冰,劉知遠,孫茂松等人還在 IJCAIL 2017 上發表了一篇名為《Lexical Sememe Prediction via Word Embeddings and Matrix Factorization》的論文。該論文介紹了義原資訊(sememe)在提高詞向量表示能力方面的作用,並且首次提出從已有的人工標註資料集學習詞彙與義原的通用的關係,藉助協同過濾和矩陣分解的方法,自動構造出新詞的義原。

由此可見,知網知識庫確實為 NLP 提供了一個強大的平臺。下面在詳細解釋呼叫 API 之前,我們先簡要了解知網知識庫的結構與概念。之後我們再詳細說明整個 API 的引數與呼叫過程。

義原的定義

知識是一個系統,是一個包含著各種概念與概念之間的關係,以及概念的屬性與屬性之間的關係的系統。富有知識的人不僅掌握了更多的概念,同時也掌握了更多的概念之間的關係以及概念的屬性與屬性之間的關係。所以知網是一種可以被稱為知識系統的常識性知識庫。它以通用的概念為描述物件,建立並描述這些概念之間的關係。

董強先生表明,義原(Sememe)是最基本的、不易於再分割的意義的最小單位。例如:「人」雖然是一個非常複雜的概念,它可以是多種屬性的集合體,但我們也可以把它看作為一個義原。我們設想所有的概念都可以分解成各種各樣的義原。同時我們也設想應該有一個有限的義原集合,其中的義原可以組合成一個無限的概念集合。如果我們能夠把握這一有限的義原集合,並利用它來描述概念之間的關係以及屬性與屬性之間的關係,我們就有可能建立我們設想的知識系統。

董強先生說:「義原的是知網基本應用的描述單位,它是基於我們的觀察而得出,比如說現代漢語詞典,它僅使用 2000 多漢字就能解釋所有的詞條。所以知網的方法就是對大約六千個漢字進行考察和分析來提取有限的義原集合。以事件類為例,在中文中具有事件義原的漢字(單純詞)中曾提取出 3200 個義原。但我們需要對重複義原進行合併,3200 個事件義原在初步合併後可得到 1700 個,進一步歸類後得到大約 800 多個義原。因為這些義原完全不涉及多音節的詞語,所以我們需要將其作為標註集去標註多音節的詞。最後我們需要對所有 2800 多個義原進行編碼,編碼採用助記符的形式表達,如詞語「開啟」,其中一個概念是「開啟一個東西(盒子)」的動作,用義原 {open|開啟} 表示,另外一個意思例如「開啟一盞燈」,義原的表示的方式就是 {turn on|開啟}。」

概念的表徵

知網還著力要反映概念之間和概念的屬性之間的關係。知網知識網路體系明確地提供給了計算機,因此我們可以輸入形式化的知識而構建計算機系統來實現自然語言處理任務。我們不僅需要義原,同時還需要它們之間的關係來表示知識。通常一個詞其具體的概念會採用樹型的結構利用義原和關係描述該概念。例如「醫院」這一個詞的概念根據具體語境可定義為 DEF={InstitutePlace|場所:domain={medical|醫},{doctor|醫治:content={disease|疾病},location={~}}},我們可以看到整個詞的概念屬性可以由多個義原按照關係和層次進行定義。

整個知識網路都是以義原為基礎建立起來的概念性系統。義原是透過關係描述概念的最小單位,知網認為它是一種最基本的概念,任何複雜的概念都是由基本概念透過某種關係構建而成,而知網用基本單位描述這種關係的方法我們稱之為 KDML(Knowledge Database Markup Language),這種描述方法將複雜中多個義原巢狀和多個關係巢狀的問題解決了。

關於知網更多資訊請檢視:http://www.keenage.com/zhiwang/c_zhiwang.html

下面,我們將開始介紹知網知識庫的 API 引數與呼叫過程,此外這一部分還提供了呼叫案例,讀者可根據該例項嘗試呼叫知網知識庫。

一、API引數集

引數名說明備註
api_key註冊使用者的認證唯一標識,使用者註冊登入後即可看到介面呼叫必傳引數
text需要分析的文字,適用於中、英文語義分析介面UTF-8編碼格式,語義解析必傳引數
word1相似性/相關性介面的傳入詞語一中、英文詞語均可,必傳引數
word2相似性/相關性介面的傳入詞語二中、英文詞語均可,必傳引數
unitId詞語在知網詞典中的義項ID號,語義解析介面的衍生介面,從語義解析介面返回的結果中即可提取出“unitId”每個字(詞)擁有唯一unitId,詳情參考【呼叫示例】
patternpos:詞性標註;st:語義標註;sd:語義判定;all:全文解析用以指定所需提供的分析結果


二、呼叫方式

  • 註冊成為知網使用者,獲得知網使用者唯一標識apiKey
  • 按照樣例呼叫介面獲取相應服務
  • 注意:當日呼叫介面的次數不得超過5000次
  • 引數傳遞建議使用post提交


三、呼叫示例

呼叫示例中為目前網站免費提供的介面,鑑於中、英文分析介面相對複雜,如有疑問請參考【介面呼叫流程演示】或聯絡管理員

介面功能示例URL返回值Method
中文分析http://yuzhinlp.com/api/call_chn.do
&apiKey=xxxxxxxx
&input="我愛中國,我愛世界。"
Json字串,詳情檢視【介面呼叫流程演示】post
英文分析http://yuzhinlp.com/api/call_eng.do
&apiKey=xxxxxxxx
&input="I love China, I love this world!"
Json字串,詳情檢視【介面呼叫流程演示】post
詞語相似度檢測http://yuzhinlp.com/api/call_similarity.do
&apiKey=xxxxxxxx
&word1=doctor
&word2=護士
Json字串,例:{"similarity":"0.018605"},其中"similarity"為key,"0.018605"代表相似度結果post
詞語相關性檢測http://yuzhinlp.com/api/call_relevance.do
&apiKey=xxxxxxxx
&word1=doctor
&word2=護士
Json字串,例:{"relevance":"1"},其中"relevance"為key,"1"為值,1代表相關,0代表不相關post
根據UNITID查詢詳細詞性http://yuzhinlp.com/api/call_UnitIdApi.do
&unitId=202591
Json字串,詳情檢視【介面呼叫流程演示】post

四、介面呼叫流程演示

1、編寫介面呼叫工具類

該流程是建立於【呼叫方式】的基礎上,以中文語義解析介面為例,請務必設定為post提交,並設定引數編碼為UTF-8

  import java.util.ArrayList;
    import java.util.List;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import com.alibaba.fastjson.JSONObject;
     
    public class ApiTest {
        public static void main(String[] args){
            //建立post請求
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpPost httpPost = new HttpPost("http://yuzhinlp.com/api/call_chn.do");

            //post請求傳入引數
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("apiKey", "YourApiKey"));
            parameters.add(new BasicNameValuePair("input", "它好你也好"));
            CloseableHttpResponse response = null;
            try {
                UrlEncodedFormEntity formEntity; 
//設定引數編碼
                formEntity = new UrlEncodedFormEntity(parameters, "UTF-8"); 
                httpPost.setEntity(formEntity);
                // 執行請求
                response = httpclient.execute(httpPost);
                // 判斷返回狀態是否為200
                if (response.getStatusLine().getStatusCode() == 200) {
                    //呼叫結果
                     String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                    JSONObject object = JSONObject.parseObject(content);
                    String result = object.get("success").toString();
                    //列印到控制檯        
                    System.out.println(result);                     
                 }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {  
                    if (response != null) {
                        response.close();
                    }
                    httpclient.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }


2、介面執行返回結果

執行後返回Json格式資料結果,其中包含連個父節點分別為"sentence"(您輸入的文字內容)和"nodes"(分析結果),"nodes"節點下包含另一個Json格式的資料,即為您所輸入的每一個字/詞的詳細分析結果,其中子節點中的引數含義請參照【引數節點描述】

     [{
            "sentence": "你來跑,我來追,追上你我就嘿嘿嘿。", 
            "nodes": [{
                    "NoID_1": "000", 
                    "MaskID": "", 
                    "NoID_2": "000", 
                    "expression": "ROOT", 
                    "FH": "", 
                    "Son": "", 
                    "ES": "", 
                    "YS": "", 
                    "DP": "", 
                    "DeepSon": "", 
                    "log": "", 
                    "DeepLog": "", 
                    "POS": "", 
                    "UnitID": ""
                },
                ...,
                {
                    "NoID_1": " 18", 
                    "MaskID": " ", 
                    "NoID_2": " 18", 
                    "expression": "嘿嘿", 
                    "FH": "000", 
                    "Son": "                              ", 
                    "ES": "   ", 
                    "YS": "   ", 
                    "DP": "   ", 
                    "DeepSon": "         ", 
                    "log": "", 
                    "DeepLog": "", 
                    "POS": "echo", 
                    "UnitID": "074279"
                },{
                    "NoID_1": " 21", 
                    "MaskID": " ", 
                    "NoID_2": " 21", 
                    "expression": "。", 
                    "FH": "000", 
                    "Son": "                              ", 
                    "ES": "   ", 
                    "YS": "   ", 
                    "DP": "   ", 
                    "DeepSon": "         ", 
                    "log": "", 
                    "DeepLog": "", 
                    "POS": "pun", 
                    "UnitID": "010349"
                }]
        }]

3、返回結果引數含義明細表

名稱描述
NoID_1輸入文字經過詞法處理後各定形詞語在文字中排列的序號
MaskID加工過程中,為了簡化句子複雜度暫時遮蔽的標記
NoID_2輸入文字經過命名體識別和語義判定後在文字中排列的序號
expression各個定形後的詞語
FH詞語的父節點的序號
Son詞語的子節點的序號
ES詞語的姐姐節點的序號
YS詞語的妹妹節點的序號
DP詞語的深層父節點的序號
DeepSon詞語的深層子節點的序號
log詞語的邏輯語義關係
DeepLog詞語的深層邏輯語義關係
POS詞語的詞性
UnitID詞語在知網詞典中的義項ID號


4、關於UNITID詳細詞性的查詢

在中、英文語義解析的基礎上,呼叫“call_UnitIdApi.do”介面,並傳入引數apiKey和UnitID。其中apiKey為您的憑證,UnitID引數則從剛才中、英文語義解析介面返回的資料中提取。返回結果如下:

UnitID 詳細資料:
      NO.=074279
      W_C=嘿嘿
      G_C=echo [2] [hei1 hei1]
      S_C=
      E_C=
      W_E=hey
      G_E=noun [3 heynoun-0static聲 ]
      S_E=
      E_E=
      DEF={sound|聲:{MakeSound|發聲:content={~},time={laugh|笑}}}
      RMK=

5、UntiID屬性引數對照表

名稱描述
NO.記錄編號
W_C中文詞語
G_C中文資訊
S_C中文情感標識
E_C中文樣例
W_E英文詞語
G_E英文資訊
S_E英文情感標識
E_E英文樣例
DEF概念定義
RMK備註

五、資訊提取服務

知網知識庫呼叫


六、技術優勢


  • 完善的多語種的知識系統
  • 獨有的義原分類體系
  • 獨有的概念描述方式(KDML)
  • 完善的事件關係與角色框架
  • 事件關係與角色轉換規則,賦予系統推理能力
  • 可使深度學習直接在語義層面進行計算
  • 無需為每種語言分別建立學習模型

七、應用場景

  • 語音指令解析:以分詞和詞性標註為基礎,分析語音命令中的關鍵名詞、動詞、數量、時間等,準確理解命令的含義,提高使用者體驗
  • 多輪互動式搜尋:透過專名識別定位多輪對話中的核心實體,自動判斷後續對話中對該實體的進一步資訊需求
  • 實體資料庫構建:透過挖掘實體之間、實體與關鍵詞之間的關聯,構建實體資訊(如人物、機構)資料庫
  • 語言理解:透過分析使用者Query的依存句法結構資訊,抽取其中的語義主幹及相關語義成分,幫助智慧產品實現對使用者意圖的精準理解
  • 知識發掘:對大規模非結構化文字資料進行句法結構分析,從中抽取實體、概念、語義關係等資訊,幫助構建領域知識或世界知識
  • 語言結構匹配:基於語言對(Query-WebTitle)之間的句法結構資訊進行語言的匹配計算,幫助提升語義匹配計算的準確率
  • 搜尋query改寫:透過尋找搜尋query中詞語的相似詞,進行合理的替換,從而達到改寫query的目的,提高搜尋結果的多樣性
  • 專有名詞挖掘:透過詞語間語義相關性計算尋找人名、地名、機構名等詞的相關詞,擴大專有名詞的詞典,更好的輔助應用
  • 深度學習訓練(技術結合):集合DNN深度學習大量樣本訓練模型,完成詞語的向量化,建立高精度的詞向量表示體系
  • 資訊檢索:在很多應用中都需要根據文字來檢索其相似文字,需求場景非常普遍。不僅適用於純文字檢索,還可以利用標籤等來檢索圖片、影片
  • 新聞推薦:透過使用者剛剛瀏覽的新聞標題,檢索出其他的相似新聞推薦給使用者
  • 智慧客服:使用者輸入一個問題時,自動為使用者尋找相似的問題和答案

相關文章