天天看點

Android語音識别SDK語義了解與解析方法

百度語義了解開放平台面向網際網路開發者提供自然語言文本的解析服務,也就是可以根據文本的意圖解析成相應的表示。

為了易于人閱讀,同時也友善機器解析和生成,意圖表示協定采用 json 語言進行描述,采用 gb18030 編碼。 

json 語言的基本概念: 

1、屬性名/屬性值 

即鍵值對(key-value) 

2、數組 

在 json 中是“[]”括起來的内容,資料結構為 ["value1","value2",...],取值方式和所有語言中一樣,使用索引擷取,屬性值的類型可以是數字、字元串、數組、對象。 

3、對象 

在 json 中表示為“{}”括起來的内容,資料結構為 {key1:value1,key2:value2,...}的鍵值對的結構。在面向對象的語言中,key 為對象的屬性,value 為對應的屬性值,是以很容易了解,取值方法為對象.key 擷取屬性值,這個屬性值的類型可以是數字、字元串、數組、對象幾種。 

自然語言文本(以下簡稱 query)。query 的意圖表示由如下鍵值對和數組構成: 

1、raw_text:使用者的原始輸入文本 

2、parsed_text:經過分詞,糾錯,改寫處理後的文本 

3、version:協定版本号 

4、results:意圖表示數組 

從伺服器中得到的json資料就是按照這樣的幾個部分組成的,例如 “北京天氣”對應的json結構如下

[plain]  view plain copy

Android語音識别SDK語義了解與解析方法
Android語音識别SDK語義了解與解析方法
  1. query:北京明天天氣   
  2. {   
  3.  "raw_text":"北京明天天氣",   
  4.  "parsed_text":"北京 明天 天氣",   
  5.  "results":[   
  6.  {   
  7.  "domain":"weather",   
  8.  "intent":"query",   
  9.  "score":1,    
  10.  "object":{   
  11.  "date": "2013-09-25,2013-09-25",   
  12. "region":"北京"   
  13.  }   
  14.  }   
  15.  ]   
  16. }  

在“百度語義了解開放平台 意圖表示協定”文檔中有詳細的介紹,這篇文章主要介紹如何通過代碼對這樣的語義模型結果進行解析,并對解析的結果進行相應的操作。

下面的代碼就是對伺服器傳回的json資料結構進行解析的過程,開發者首先需要了解json資料是怎麼的鍵值對,然後一層一層解析就可以,根據不同的語義,分發到不同的操作中。

[java]  view plain copy

Android語音識别SDK語義了解與解析方法
Android語音識别SDK語義了解與解析方法
  1. private void handleResult(String result) {  
  2.         try {  
  3.             JSONObject r = new JSONObject(result);  
  4.             result = r.optString("json_res");  
  5.             r = new JSONObject(result);  
  6.             String query = r.optString("raw_text");  
  7.             if (!TextUtils.isEmpty(query)) {  
  8.                 mAdapter.add(new ChatItem(query));  
  9.                 mAdapter.notifyDataSetChanged();  
  10.             }  
  11.             JSONArray commands = r.optJSONArray("results");  
  12.             JSONObject command = null;  
  13.             String type = null;  
  14.             if (commands != null && commands.length() > 0) {  
  15.                 command = commands.optJSONObject(0);  
  16.                 type = command.optString("domain");  
  17.             } else {  
  18.                 commands = r.optJSONArray("commandlist");  
  19.                 if (commands != null && commands.length() > 0) {  
  20.                     command = commands.optJSONObject(0);  
  21.                     type = command.optString("commandtype");  
  22.                 }  
  23.             }  
  24.             if (!TextUtils.isEmpty(type)) {  
  25.                 Log.i("TYPE", type);  
  26.                 new CommandProcessorTask().execute(mProcessors.getProcessor(type), command);  
  27.             }  
  28.         } catch (JSONException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.     }  

結果是以String格式傳回的,是以首先,将該字元串轉為JSONObject,然後解析"json_res"對應的字元串,再生産JSONObject,之後解析"raw_text"對應的文本,然後一步步的把每個鍵值對應的資料提取出來,其中“domain”對應的是語義的領域,可以作為區分語意的type類型分發到不同操作。