天天看点

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类型分发到不同操作。