会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 HarmonyOS Sample之AI能力之NLU引擎服务!

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

时间:2025-11-05 08:30:28 来源:益强数据堂 作者:系统运维 阅读:606次

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

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

https://harmonyos.51cto.com

1.介绍

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

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

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

2.效果展示

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 核心类

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

 5.1.2 使用流程

1.NluClient静态类进行初始化

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

2.获取分词结果

// 1.同步接口 ResponseResult responseResult =  NluClient.getInstance().getWordSegment(requestData,NluRequestType.REQUEST_TYPE_LOCAL); //2.异步接口 NluClient.getInstance() .getWordSegment(requestData,NluRequestType.REQUEST_TYPE_LOCAL,         asyncResult -> {             //发送分词结果             sendResult(asyncResult.getResponseResult(), 0);             release();         }); 

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}

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

4.释放资源

NluClient.getInstance().destroy(slice); 

 5.1.3 分词粒度测试

type=0 requestData:{“text”:我明天下午三点要去江宁万达广场看速度与激情,“type”:0} 分词结果: {“code”:0,“message”:“success”,“words”: [“我”,“明天”,“下午”,“三点”,“要”,“去”,“江宁万达广场”,“看”,“速度”,“与”,“激情”]} type=1 requestData:{“text”:我明天下午三点要去江宁万达广场看速度与激情,“type”:1} 分词结果: {“code”:0,“message”:“success”,“words”: [“我”,“明天”,“下午”,“三点”,“要”,“去”,“江宁万达广场”,“看”,“速度与激情”]} type=9223372036854775807 requestData:{“text”:我明天下午三点要去江宁万达广场看速度与激情,“type”:9223372036854775807} 分词结果: {“code”:0,“message”:“success”,“words”: [“我”,“明天下午三点”,“要去”,“江宁万达广场”,“看”,“速度与激情”]} 

5.2 词性标注(getWordPos)

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

5.2.1 用法

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

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

5.2.2 词性标注结果

requestData:

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

responseResult:

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

词性: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: 内容标题,可选

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

5.3.2 提取关键词结果展示

requestData:

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

 responseResult:

{"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

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

5.4.2 分析实体结果展示

requestData:

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

responseResult:

{     "entity": {         "movie": [{             "oriText": "速度与激情",             "sequence": 1,             "origin": "1637301307158",             "heat": 0,             "standardName": "速度与激情",             "charOffset": 16,             "normalValue": "速度与激情",             "user.extend": false,             "isCorrected": false         }],         "location": [{             "sequence": 1,             "origin": "1637301307158",             "oriText": "江宁万达广场",             "key": "江宁万达广场",             "type": "nspHB",             "coreLocation": {                 "value": "江宁万达广场",                 "location": {                     "value": "江宁万达广场"                 }             },             "isAbstract": "0",             "cost": "29",             "charOffset": 9,             "normalValue": "江宁万达广场",             "user.extend": false,             "isCorrected": false         }],         "time": [{             "normalTime": {                 "start": {                     "timestamp": 1637391600000,                     "section": "P",                     "standardTime": "2021年11月20日15时00分00秒"                 }             },             "oriText": "明天下午三点",             "sequence": 1,             "origin": "1637301307158",             "charOffset": 1,             "normalValue": "明天下午三点",             "user.extend": false,             "isCorrected": false         }],         "varietyshow": [{             "oriText": "速度与激情",             "sequence": 1,             "origin": "1637301307158",             "heat": 0,             "standardName": "速度与激情",             "charOffset": 16,             "normalValue": "速度与激"         }]     } } 

6.思考总结

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

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

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

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

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

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

https://harmonyos.51cto.com

(责任编辑:数据库)

最新内容
推荐内容
  • 操作系统安装教程(一步步教你安装操作系统,让电脑焕发新生)
  • 电脑强制关机后不显示错误解决方法(解决电脑强制关机后屏幕无错误提示的方法)
  • 解决电脑显示菜单错误的有效方法(排除电脑无法打开显示菜单问题的实用技巧)
  • ubuntu出现有线已连接却无法上网,执行下面的命令可以解决复制代码代码如下:sudo sysctl net.ipv4.conf.default.rp_filter=0sudo sysctl net.ipv4.conf.all.rp_filter=0sudo sysctl net.ipv4.ip_forward=1sudo sysctl net.ipv6.conf.all.forwarding=1或者直接追加到/etc/sysctl.conf假如遇到“设备未托管”,一般是台式机默认移动ip后禁用网络。那么修改/etc/NetworkManager/NetworkManager.conf,设置managed=true,reboot有时候遇到即使改了上面四条仍旧无法连接网络,那么就是由于managed=true引起的,再改成false即可连接网页。
  • 解决U盘写保护问题的有效方法(终结U盘写保护困扰,实现格式化的妙招)
  • Webalizer是一款免费的应用程序,可用于分析网站服务器日志。这样一来,你就能更清楚地了解你的网站或服务器收到的流量大小。它是一种使用广泛的开源工具,提供了非常详细的报告。这个工具的使用和安装很简单,cPanel之类的许多高级托管控制面板使用该工具,为用户提供流量方面的详细信息。功能特性这款工具的功能很强大,足以解析不同格式的访问日志。它还可以从压缩文件中获取信息,不需要先解压缩文件。你从命令行和图形化用户界面都可以使用该工具,以你觉得方便的方式来查看报告。它支持多种语言,开发团队正在努力添加支持另外许多语言的功能。它能够解析任何大小或复杂程度的日志文件。它同时支持IPV4和IPV6,还有原生的地理位置服务和DNS服务器软件。在Ubuntu上安装和配置WebalizerWebalizer需要Apache网站服务器软件安装在Linux系统上,因为它要读取和解析Apache错误日志,从而分析流量。假如Apache之前没有安装在你的系统上,你试图看一看webalizer是如何工作的,那么启动终端,运行下面这个命令,即可将Apache安装在你的Ubuntu上:复制代码代码如下:sudo /etc/init.d/apache2 start现在启动你的浏览器,装入http://localhost,核实http在正常运行,它应该会显示诸如此类的页面:Apache默认页面注意:默认情况下,Apache的文档根目录是/var/www/html/,所以你需要把脚本放在这个位置,那样Apache网站服务器就能提供这些脚本。由于Apache已安装在我们的Ubuntu系统上并运行起来,现在运行下面这个命令,安装webalizer。恭喜你,webalizer已安装完毕。现在我们需要配置它。配置webalizer你可能也注意到,在安装过程中,webalizer目录已经创建在/var/www/路径上,我们需要把它移到/var/www/html,那样Apache才能顺利该目录。在终端上运行下面这个命令来完成这项任务。复制代码代码如下:sudo gedit /etc/webalizer/webalizer.conf务必要确保Apache访问日志文件路径在该文件中正确无误(下列屏幕截图中高亮显示的部分)。假如路径这一项出错,就纠正路径,并保存文件。好了,我们离成功只有一步之遥了。测试Webalizer配置运行下面这个命令,核实webalizer已成功安装和配置。测试webalizer启动浏览器,装入http://localhost/webalizer/ URL。它应该会装入webalizer页面,并且附有系统当前HTTP活动的报告。可以执行webalizer –h得到所有命令行参数:复制代码代码如下:#!/bin/shrun=/usr/sbin/webalizer$run -F clf -p -n   -t www.test.com-o /var/www/html/log /var/log/httpd/access_log说明:-F clf 指明我们的web日志格式为标准的一般日志文件格式(Common Logfile Format)-p 指定使用递增模式,这就是说每作一次分析后,webalizer会生产一个历史文件,这样下一次分析时就可以不分析已经处理过的部分。这样我们就可以在短时间内转换我们的日志文件,而不用担心访问量太大时日志文件无限增大了。-n “ “ 指定服务器主机名为空,这样输出结果会美观一些。-o “www.test.com” 指定输出结果标题./var/log/httpd/access_log:指定日志文件然后在/etc/crontab中加入:01 1 * * * root /etc/rc.d/webalizer即每天凌晨1点执行该脚本。然后运行/etc/rc.d/init.d/crond reload重载入crond服务。结束语Webalizer是在微软Windows、Linux和Mac OS上广泛使用的一种工具,可用于分析系统上的Web活动。它是相当简单的工具,可以解析网站服务器日志,即便它受到数百万次的访问。这个工具的重要性对系统和网站管理员来说毋容置疑。
热点内容