HarmonyOS Sample之AI能力之NLU引擎服務
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
1.介紹
NLU(the natural language understanding)自然語言理解引擎服務。
該引擎服務提供了 分詞、詞性標注、實體識別、意圖識別、關(guān)鍵詞提取等接口,有同步和異步兩種方法。
這一期的內(nèi)容包括:分詞能力、詞性標注、關(guān)鍵字提取、實體識別。相關(guān)代碼都增加了注釋說明和調(diào)試日志,方便理解和學習。
2.效果展示

3.搭建環(huán)境
安裝DevEco Studio,詳情請參考DevEco Studio下載。
設置DevEco Studio開發(fā)環(huán)境,DevEco Studio開發(fā)環(huán)境需要依賴于網(wǎng)絡環(huán)境,需要連接上網(wǎng)絡才能確保工具的正常使用,可以根據(jù)如下兩種情況來配置開發(fā)環(huán)境:
如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作。
如果網(wǎng)絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發(fā)環(huán)境。
下載源碼后,使用DevEco Studio 打開項目,模擬器運行即可。
真機運行需要將config.json中的buddleName修改為自己的,如果沒有請到AGC上進行配置,參見 使用模擬器進行調(diào)試 。
4.項目結(jié)構(gòu)
5.代碼講解
5.1 分詞能力(getWordSegment)
分詞API的主要功能是將一個漢字序列切分成一個一個單獨的詞,可自定義分詞的粒度。
場景:1.搜索引擎開發(fā)場景,搜索結(jié)果的相關(guān)度排序;2.用戶選擇用戶選擇文本的場景,例如雙擊選擇分本時,按照分詞進行選中等。
5.1.1 核心類
- import ohos.ai.nlu.NluClient; //提供調(diào)用自然語言理解 (NLU) 引擎服務的方法。
- import ohos.ai.nlu.NluRequestType; //定義調(diào)用 NLU 引擎功能的請求類型。
- import ohos.ai.nlu.ResponseResult; //以JSON格式提供NLU識別結(jié)果。
5.1.2 使用流程

1.NluClient靜態(tài)類進行初始化
- NluClient.getInstance().init(Context context,
- OnResultListener<Integer> listener,boolean isLoadModel)
2.獲取分詞結(jié)果
- // 1.同步接口
- ResponseResult responseResult =
- NluClient.getInstance().getWordSegment(requestData,NluRequestType.REQUEST_TYPE_LOCAL);
- //2.異步接口
- NluClient.getInstance()
- .getWordSegment(requestData,NluRequestType.REQUEST_TYPE_LOCAL,
- asyncResult -> {
- //發(fā)送分詞結(jié)果
- sendResult(asyncResult.getResponseResult(), 0);
- release();
- });
requestData:JSON格式,參數(shù)名包括{text,type,callPkg,callType,callVersion,callState},其中,
text:待分析的文本,必填項;
type:分詞的粒度,枚舉值,0:基本詞 ;1:在基本詞的基礎(chǔ)上,做實體合并;223372036854775807:在type為1的基礎(chǔ)上,把實體時間、地點等整體結(jié)構(gòu)合并,出現(xiàn)符號隔開不合并,并把一些常用短語合并,默認為0。
requestType: 枚舉值,NluRequestType.REQUEST_TYPE_LOCAL 表示調(diào)用本地引擎。
3.解析返回結(jié)果
ResponseResult responseResult 返回JSON格式字符串,JSON格式,參數(shù)名包括:{code,message,words}
- //{"code":0,"message":"success","words":["我","明天","下午","三點",
- //"要","去","江寧萬達廣場","看","速度","與","激情"]}
- // 將分詞結(jié)果轉(zhuǎn)換成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))) {
- // 未識別到分詞結(jié)果,返回"no keywords"
- lists = new ArrayList<>(1);
- lists.add("no keywords");
- } else {
- lists = Arrays.asList(words.split(","));
- }
- //構(gòu)建事件
- event = InnerEvent.get(TWO, ZERO, lists);
- }
- }
4.釋放資源
- NluClient.getInstance().destroy(slice);
5.1.3 分詞粒度測試
- type=0
- requestData:{“text”:我明天下午三點要去江寧萬達廣場看速度與激情,“type”:0}
- 分詞結(jié)果:
- {“code”:0,“message”:“success”,“words”:
- [“我”,“明天”,“下午”,“三點”,“要”,“去”,“江寧萬達廣場”,“看”,“速度”,“與”,“激情”]}
- type=1
- requestData:{“text”:我明天下午三點要去江寧萬達廣場看速度與激情,“type”:1}
- 分詞結(jié)果:
- {“code”:0,“message”:“success”,“words”:
- [“我”,“明天”,“下午”,“三點”,“要”,“去”,“江寧萬達廣場”,“看”,“速度與激情”]}
- type=9223372036854775807
- requestData:{“text”:我明天下午三點要去江寧萬達廣場看速度與激情,“type”:9223372036854775807}
- 分詞結(jié)果:
- {“code”:0,“message”:“success”,“words”:
- [“我”,“明天下午三點”,“要去”,“江寧萬達廣場”,“看”,“速度與激情”]}
5.2 詞性標注(getWordPos)
詞性標注提供了getWordPos()接口,該接口可以根據(jù)分詞粒度,為分詞結(jié)果中的每個單詞標注一個正確的詞性。
5.2.1 用法
用法和分詞能力類似,獲取詞性標注的接口是getWordPos(),傳入的requestData參數(shù)和返回對象ResponseResult都是一樣的。
- ResponseResult responseResult =
- NluClient.getInstance().getWordPos(requestData, NluRequestType.REQUEST_TYPE_LOCAL);
5.2.2 詞性標注結(jié)果
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 提取關(guān)鍵詞(getKeywords)
關(guān)鍵字提取API提供了一個提取關(guān)鍵字的接口,通過該API可以在大量信息中提取出文本想要表達的核心內(nèi)容,可以是具有特定意義的實體,如:人名,地點,電影等。也可以是一些基礎(chǔ)但是在文本中很關(guān)鍵的詞匯。通過該API可以對提取的關(guān)鍵字按照在文本中所占權(quán)重由高到低排序。排序越靠前,權(quán)重越高,對文本的核心內(nèi)容的提取越準確。
5.3.1 用法
用法和分詞能力類似,提取關(guān)鍵詞接口是getKeywords(),requestData輸入數(shù)據(jù)的JSON 格式參數(shù)有所變化 {body,number,title}
body:要分析文本,必選,如新聞或email內(nèi)容或文章;
number:提取關(guān)鍵詞個數(shù),必選;title: 內(nèi)容標題,可選
- ResponseResult responseResult =
- NluClient.getInstance().getKeywords(requestData, NluRequestType.REQUEST_TYPE_LOCAL);
5.3.2 提取關(guān)鍵詞結(jié)果展示
requestData:
- {"body":"對接各資源服務中心接入衛(wèi)健、醫(yī)保、人社、民政等橫向單位數(shù)據(jù),逐步完善和豐富退役軍人健康檔案信息","number":5,"title":"退役軍人"}
- 1.
- 1.
- 1.
- 1.
responseResult:
- {"keywords":["退役","軍人","衛(wèi)健","醫(yī)保","對接"],"code":0,"message":"成功"}
5.4 實體識別(getEntity)
實體識別能夠從自然語言中提取出具有特定意義的實體,并在此基礎(chǔ)上完成搜索等一系列相關(guān)操作及功能。
5.4.1 用法
用法和分詞能力類似,獲取實體識別的接口是getEntity(),requestData輸入數(shù)據(jù)的JSON 格式參數(shù)有所變化 {text,module,callPkg,callType,callVersion,callState}
text:分析文本,必選,如新聞或email內(nèi)容;
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 分析實體結(jié)果展示
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.思考總結(jié)
1.上述的AI能力不需要申請權(quán)限
2.這些AI能力使用起來還是非常方便的,開箱即用,可以靈活運用到應用開發(fā)中。
文章相關(guān)附件可以點擊下面的原文鏈接前往下載
https://harmonyos.51cto.com/resource/1514
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)