zl程序教程

您现在的位置是:首页 >  其他

当前栏目

HarmonyOS Sample之AI能力之NLU引擎服务

2023-03-14 11:26:12 时间

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

1.介绍

NLU(the natural language understanding)自然语言理解引擎服务。

该引擎服务提供了 分词、词性标注、实体识别、意图识别、关键词提取等接口,有同步和异步两种方法。

这一期的内容包括:分词能力、词性标注、关键字提取、实体识别。相关代码都增加了注释说明和调试日志,方便理解和学习。

2.效果展示

HarmonyOS Sample 之  AI能力之NLU引擎服务-鸿蒙HarmonyOS技术社区

3.搭建环境

安装DevEco Studio,详情请参考DevEco Studio下载

设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:

如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作

如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境

下载源码后,使用DevEco Studio 打开项目,模拟器运行即可。

真机运行需要将config.json中的buddleName修改为自己的,如果没有请到AGC上进行配置,参见 使用模拟器进行调试

4.项目结构

5.代码讲解

5.1 分词能力(getWordSegment)

分词API的主要功能是将一个汉字序列切分成一个一个单独的词,可自定义分词的粒度。

场景:1.搜索引擎开发场景,搜索结果的相关度排序;2.用户选择用户选择文本的场景,例如双击选择分本时,按照分词进行选中等。

5.1.1 核心类

  1. import ohos.ai.nlu.NluClient; //提供调用自然语言理解 (NLU) 引擎服务的方法。 
  2. import ohos.ai.nlu.NluRequestType; //定义调用 NLU 引擎功能的请求类型。 
  3. import ohos.ai.nlu.ResponseResult; //以JSON格式提供NLU识别结果。 

 5.1.2 使用流程

HarmonyOS Sample 之  AI能力之NLU引擎服务-鸿蒙HarmonyOS技术社区

1.NluClient静态类进行初始化

  1. NluClient.getInstance().init(Context context,  
  2. OnResultListener<Integer> listener,boolean isLoadModel) 

2.获取分词结果

  1. // 1.同步接口 
  2. ResponseResult responseResult =  
  3. NluClient.getInstance().getWordSegment(requestData,NluRequestType.REQUEST_TYPE_LOCAL); 
  4.  
  5. //2.异步接口 
  6. NluClient.getInstance() 
  7. .getWordSegment(requestData,NluRequestType.REQUEST_TYPE_LOCAL, 
  8.         asyncResult -> { 
  9.             //发送分词结果 
  10.             sendResult(asyncResult.getResponseResult(), 0); 
  11.             release(); 
  12.         }); 

requestData:JSON格式,参数名包括{text,type,callPkg,callType,callVersion,callState},其中,

text:待分析的文本,必填项;

type:分词的粒度,枚举值,0:基本词 ;1:在基本词的基础上,做实体合并;223372036854775807:在type为1的基础上,把实体时间、地点等整体结构合并,出现符号隔开不合并,并把一些常用短语合并,默认为0。

requestType: 枚举值,NluRequestType.REQUEST_TYPE_LOCAL 表示调用本地引擎。

3.解析返回结果

ResponseResult responseResult 返回JSON格式字符串,JSON格式,参数名包括:{code,message,words}

  1. //{"code":0,"message":"success","words":["我","明天","下午","三点"
  2. //"要","去","江宁万达广场","看","速度","与","激情"]} 
  3.  
  4. // 将分词结果转换成list 
  5. if (result.contains("\"message\":\"success\"")) { 
  6.     switch (operateType) { 
  7.         //分词 
  8.         case 0: 
  9.             String words = result.substring(result.indexOf(WORDS) + STEP, 
  10.                     result.lastIndexOf("]")).replaceAll("\""""); 
  11.             if ((words == null) || ("".equals(words))) { 
  12.                 // 未识别到分词结果,返回"no keywords" 
  13.                 lists = new ArrayList<>(1); 
  14.                 lists.add("no keywords"); 
  15.             } else { 
  16.                 lists = Arrays.asList(words.split(",")); 
  17.             } 
  18.             //构建事件 
  19.             event = InnerEvent.get(TWO, ZERO, lists); 
  20.     } 

4.释放资源

  1. NluClient.getInstance().destroy(slice); 

 5.1.3 分词粒度测试

  1. type=0 
  2. requestData:{“text”:我明天下午三点要去江宁万达广场看速度与激情,“type”:0} 
  3. 分词结果: 
  4. {“code”:0,“message”:“success”,“words”: 
  5. [“我”,“明天”,“下午”,“三点”,“要”,“去”,“江宁万达广场”,“看”,“速度”,“与”,“激情”]} 
  6.  
  7. type=1 
  8. requestData:{“text”:我明天下午三点要去江宁万达广场看速度与激情,“type”:1} 
  9. 分词结果: 
  10. {“code”:0,“message”:“success”,“words”: 
  11. [“我”,“明天”,“下午”,“三点”,“要”,“去”,“江宁万达广场”,“看”,“速度与激情”]} 
  12.  
  13. type=9223372036854775807 
  14. requestData:{“text”:我明天下午三点要去江宁万达广场看速度与激情,“type”:9223372036854775807} 
  15. 分词结果: 
  16. {“code”:0,“message”:“success”,“words”: 
  17. [“我”,“明天下午三点”,“要去”,“江宁万达广场”,“看”,“速度与激情”]} 

5.2 词性标注(getWordPos)

词性标注提供了getWordPos()接口,该接口可以根据分词粒度,为分词结果中的每个单词标注一个正确的词性。

5.2.1 用法

用法和分词能力类似,获取词性标注的接口是getWordPos(),传入的requestData参数和返回对象ResponseResult都是一样的。

  1. ResponseResult responseResult =  
  2. NluClient.getInstance().getWordPos(requestData, NluRequestType.REQUEST_TYPE_LOCAL); 

5.2.2 词性标注结果

requestData:

  1. {"text":"我明天下午三点要去江宁万达广场看速度与激情","type":0} 

responseResult:

  1. {"code":0,"message":"success","pos":[ 
  2. {"word":"我","tag":"rr"}, 
  3. {"word":"明天","tag":"t"}, 
  4. {"word":"下午","tag":"t"},{"word":"三点","tag":"t"},{"word":"要","tag":"v"},{"word":"去","tag":"vf"}, 
  5. {"word":"江宁万达广场","tag":"n"},{"word":"看","tag":"v"},{"word":"速度","tag":"n"},{"word":"与","tag":"cc"},{"word":"激情","tag":"n"
  6. ]} 

词性:rr:人称代词,t:时间词,v:动词,vf:趋向动词,n:名词,cc:并列连词

tag词性值就不一一列举了,详情查看

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ai-pos-tagging-guidelines-0000001050732512

5.3 提取关键词(getKeywords)

关键字提取API提供了一个提取关键字的接口,通过该API可以在大量信息中提取出文本想要表达的核心内容,可以是具有特定意义的实体,如:人名,地点,电影等。也可以是一些基础但是在文本中很关键的词汇。通过该API可以对提取的关键字按照在文本中所占权重由高到低排序。排序越靠前,权重越高,对文本的核心内容的提取越准确。

5.3.1 用法

用法和分词能力类似,提取关键词接口是getKeywords(),requestData输入数据的JSON 格式参数有所变化 {body,number,title}

body:要分析文本,必选,如新闻或email内容或文章;

number:提取关键词个数,必选;title: 内容标题,可选

  1. ResponseResult responseResult =  
  2. NluClient.getInstance().getKeywords(requestData, NluRequestType.REQUEST_TYPE_LOCAL); 

5.3.2 提取关键词结果展示

requestData:

  1. {"body":"对接各资源服务中心接入卫健、医保、人社、民政等横向单位数据,逐步完善和丰富退役军人健康档案信息","number":5,"title":"退役军人"
  2. 1. 
  3. 1. 
  4. 1. 
  5. 1. 

 responseResult:

  1. {"keywords":["退役","军人","卫健","医保","对接"],"code":0,"message":"成功"

 5.4 实体识别(getEntity)

实体识别能够从自然语言中提取出具有特定意义的实体,并在此基础上完成搜索等一系列相关操作及功能。

5.4.1 用法

用法和分词能力类似,获取实体识别的接口是getEntity(),requestData输入数据的JSON 格式参数有所变化 {text,module,callPkg,callType,callVersion,callState}

text:分析文本,必选,如新闻或email内容;

module:需要分析的实体,可选,默认所有实体均会分析。

分析某个实体,传实体键值,例如:只需要分析时间实体,传“time”。可传多个,表示分析多个实体,以半角逗号“,”分隔,例如:分析时间和地点,传“time,location”。

取值范围:name、time、location、phoneNum、email、url、movie、tv、anime、league、team、trainNo、flightNo、expressNo、idNo、verificationCode、app、carNo

  1. ResponseResult responseResult =  
  2. NluClient.getInstance().getEntity(requestData, NluRequestType.REQUEST_TYPE_LOCAL); 

5.4.2 分析实体结果展示

requestData:

  1. {"text":"我明天下午三点要去江宁万达广场看速度与激情"

responseResult:

  1.     "entity": { 
  2.         "movie": [{ 
  3.             "oriText""速度与激情"
  4.             "sequence": 1, 
  5.             "origin""1637301307158"
  6.             "heat": 0, 
  7.             "standardName""速度与激情"
  8.             "charOffset": 16, 
  9.             "normalValue""速度与激情"
  10.             "user.extend"false
  11.             "isCorrected"false 
  12.         }], 
  13.         "location": [{ 
  14.             "sequence": 1, 
  15.             "origin""1637301307158"
  16.             "oriText""江宁万达广场"
  17.             "key""江宁万达广场"
  18.             "type""nspHB"
  19.             "coreLocation": { 
  20.                 "value""江宁万达广场"
  21.                 "location": { 
  22.                     "value""江宁万达广场" 
  23.                 } 
  24.             }, 
  25.             "isAbstract""0"
  26.             "cost""29"
  27.             "charOffset": 9, 
  28.             "normalValue""江宁万达广场"
  29.             "user.extend"false
  30.             "isCorrected"false 
  31.         }], 
  32.         "time": [{ 
  33.             "normalTime": { 
  34.                 "start": { 
  35.                     "timestamp": 1637391600000, 
  36.                     "section""P"
  37.                     "standardTime""2021年11月20日15时00分00秒" 
  38.                 } 
  39.             }, 
  40.             "oriText""明天下午三点"
  41.             "sequence": 1, 
  42.             "origin""1637301307158"
  43.             "charOffset": 1, 
  44.             "normalValue""明天下午三点"
  45.             "user.extend"false
  46.             "isCorrected"false 
  47.         }], 
  48.         "varietyshow": [{ 
  49.             "oriText""速度与激情"
  50.             "sequence": 1, 
  51.             "origin""1637301307158"
  52.             "heat": 0, 
  53.             "standardName""速度与激情"
  54.             "charOffset": 16, 
  55.             "normalValue""速度与激" 
  56.         }] 
  57.     } 

6.思考总结

1.上述的AI能力不需要申请权限

2.这些AI能力使用起来还是非常方便的,开箱即用,可以灵活运用到应用开发中。

文章相关附件可以点击下面的原文链接前往下载

https://harmonyos.51cto.com/resource/1514

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com