首页 > 代码库 > 百度Android语音识别SDK语义理解与解析方法

百度Android语音识别SDK语义理解与解析方法

百度语义理解开放平台面向互联网开发人员提供自然语言文本的解析服务,也就是能够依据文本的意图解析成对应的表示。

为了易于人阅读,同一时候也方便机器解析和生成,意图表示协议採用 json 语言进行描写叙述,採用 gb18030 编码。 

json 语言的基本概念: 
1、属性名/属性值 
即键值对(key-value) 
2、数组 
在 json 中是“[]”括起来的内容,数据结构为 ["value1","value2",...],取值方式和全部语言中一样,使用索引获取,属性值的类型能够是数字、字符串、数组、对象。 
3、对象 
在 json 中表示为“{}”括起来的内容,数据结构为 {key1:value1,key2:value2,...}的键值对的结构。在面向对象的语言中,key 为对象的属性,value 为相应的属性值,所以非常easy理解,取值方法为对象.key 获取属性值,这个属性值的类型能够是数字、字符串、数组、对象几种。 

自然语言文本(下面简称 query)。query 的意图表示由例如以下键值对和数组构成: 
1、raw_text:用户的原始输入文本 
2、parsed_text:经过分词,纠错,改写处理后的文本 
3、version:协议版本 
4、results:意图表示数组 

从server中得到的json数据就是依照这种几个部分组成的,比如 “北京天气”相应的json结构例如以下

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
  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. }  
在“百度语义理解开放平台 意图表示协议”文档中有具体的介绍,这篇文章主要介绍怎样通过代码对这种语义模型结果进行解析,并对解析的结果进行对应的操作。

以下的代码就是对server返回的json数据结构进行解析的过程,开发人员首先须要了解json数据是怎么的键值对,然后一层一层解析就能够,依据不同的语义,分发到不同的操作中。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  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.             }  
  25.             if (!TextUtils.isEmpty(type)) {  
  26.                 Log.i("TYPE", type);  
  27.                 new CommandProcessorTask().execute(mProcessors.getProcessor(type), command);  
  28.             }  
  29.         } catch (JSONException e) {  
  30.   
  31.             e.printStackTrace();  
  32.         }  
  33.     }  

结果是以String格式返回的,所以首先,将该字符串转为JSONObject,然后解析"json_res"相应的字符串,再生产JSONObject,之后解析"raw_text"相应的文本,然后一步步的把每一个键值相应的数据提取出来,当中“domain”相应的是语义的领域,能够作为区分语意的type类型分发到不同操作。