HarmonyOS学习路之开发篇—AI功能开发(词性标注)

2023-10-15 08:52:54 浏览数 (1)

词性标注概述

随着信息技术的发展,网络中的信息量成几何级增长逐步成为当今社会的主要特征。准确提取文本关键信息,是搜索引擎等领域的技术基础,而分词作为文本信息提取的第一步则尤为重要。

分词作为自然语言处理领域的基础研究,衍生出各类不同的文本处理相关应用。

词性标注包括分词以及为分词结果中的每个单词标注一个正确的词性(标注每个词是名词、动词、形容词或其他词性)。开发者可自定义分词的粒度。

运作机制

词性标注提供了文本自动分词并给出词性的接口。对于输入的一段文本,自动通过词性标注接口对其进行分词,并为分词结果中的每个单词标注一个正确的词性。词性标注提供不同的分词粒度,开发者可以根据需要自定义分词粒度。

约束与限制

  • 当前只支持中文语境。
  • 词性标注文本限制在500个字符以内,超过字数将返回参数错误,文本需要为UTF-8格式,格式错误不报错,但会导致分析结果错误。
  • Engine支持多用户同时接入,但是不支持同一用户并发调用同一特性。若同一特性被同一进程同一时间多次调用,则返回系统忙错误;不同进程调用同一特性,则同一时间只能处理一个进程业务,其他进程进入队列排队。

词性标注开发

场景介绍

  • 应用于搜索引擎开发。对于搜索引擎来说,在上百亿的网页中找到所有结果没有意义,重要的是把最相关的结果呈现在最前面,也称为相关度排序。分词的准确与否,会直接影响到对搜索结果的相关度排序。
  • 应用于语义分析相关软件的开发。在语义分析中,通过分词理解文本所要表达的正确含义,并通过词性标注得到词性,准确地判断出某个词是名词、动词、形容词等,使得语义分析更方便扩展。

接口说明

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

主要接口

接口名

描述

ResponseResult getWordPos(String requestData, int requestType)

采用同步方式进行词性标注。

ResponseResult getWordPos(final String requestData, final int requestType, final OnResultListener<ResponseResult> listener)

采用异步方式进行词性标注。

void init(Context context, OnResultListener<Integer> listener, boolean isLoadModel)

初始化NLU服务。在调用NLU等功能接口前需要先调用此接口,在OnResultListener的onResult(T)方法中获取到回调结果后,再调用NLU功能接口。开发者传入listener参数作为回调,用于等待NLU功能接口的调用过程和结果。

void destroy(Context context)

取消所有NLU任务,销毁NLU引擎服务。调用此方法后,无法再使用NLU服务。如果需要重新使用NLU服务,需要重新调用init(Context, OnResultListener<Integer>, boolean)}来初始化NLU服务。

接口输入值说明

类型

说明

static int

REQUEST_TYPE_LOCAL = 0 本地请求

参数名

是否必选

类型

说明

text

ture

String

待分析的文本,UTF-8编码,限制500个字符以内。

type

false

long

分词的粒度,默认为0。 0:基本词,粒度较小。例如:“我要看速度与激情”,分成“我/要/看/速度/与/激情”。1:在基本词的基础上,做实体合并。例如:“我要去江宁万达广场看速度与激情”分成“我/要/去/江宁万达广场/看/速度/与/激情”。 对于没有可合并实体的文本信息,其分词效果与type为0的分词效果相同。例如:“明天下午3点一起看电影”分成“明天/下午/3点/一起/看/电影”。 9223372036854775807(2的63次方减1):在type为1的基础上,把实体时间、地点等整体结构合并(出现符号隔开则不合并),并把一些常用短语合并。 例如:“形容词 的”,“单字动词 单字名词”等,简化句子成分。根据以上原则,“明天下午三点到五点我在江宁瑞都金逸影城看电影”将分成“明天下午三点/到/五点/我/在/江宁瑞都金逸影城/看/电影”。

callPkg

false

String

调用者名称。

callType

false

int

调用者类型: 0:普通应用(默认)1:快应用

callVersion

false

String

调用者版本号。

callState

false

int

调用者状态: -1:未知(默认)0:前台1:后台

接口返回值说明

返回值ResponseResult中responseResult为JSON字符串,体现词性标注的结果:

参数名

是否必选

值类型

说明

code

int

词性标注的结果码。取值包括: 0:成功1:系统正在初始化2:参数错误3:系统忙4:系统异常5:任务超时6:其它错误

message

String

错误信息。

pos

JSONArray

切分出的词数组,数组里的类型为JSONObject。

word

String

切分出的词。

tag

String

词性,type为1或9223372036854775807时,人名实体的词性为nr,时间实体的词为t,地点实体的词性为ns,其他实体统一为ne。具体词性类型可参表1。

  • 0:成功
  • 1:系统正在初始化
  • 2:参数错误
  • 3:系统忙
  • 4:系统异常
  • 5:任务超时
  • 6:其它错误

message 是 String 错误信息。 pos 否 JSONArray 切分出的词数组,数组里的类型为JSONObject。 word 否 String 切分出的词。 tag 否 String 词性,type为1或9223372036854775807时,人名实体的词性为nr,时间实体的词为t,地点实体的词性为ns,其他实体统一为ne。具体词性类型可参表1

词性

说明

词性

说明

词性

说明

n

名词

rr

人称代词

u

助词

nr

人名

rz

指示代词

uzhe

助词“着”

ns

地名

rzt

时间指示代词

ule

助词“了”“喽”

ne

只在实体合并时使用,除人名、时间、地点之前,其他实体统一返回ne

rzs

处所指示代词

uguo

助词“过”

t

时间词

rzv

谓词性指示代词

ude1

助词“的”

tg

时间词性语素

ry

疑问代词

ude2

助词“地”

s

处所词

ryt

时间疑问代词

ude3

助词”得”

f

方位词

rys

处所疑问代词

usuo

助词”所“

v

动词

ryv

谓词性疑问代词

udeng

助词“等”“等等”

vd

副动词

rg

代词性语素

uyy

助词”一样”“一般”“似的”“般”

vn

名动词

m

数词

udh

助词“的话”

vshi

动词“是”

mq

数量词

uls

助词“来讲”“来说”“而言”“说来”

vyou

动词“有”

q

量词

uzhi

助词“之“

vf

趋向动词

qv

动量词

ulian

助词“连”

a

形容词

qt

时量词

e

叹词

ad

副形词

d

副词

y

语气词

an

名形词

p

介词

o

拟声词

b

区别词

pba

介词“把”

h

前缀

bl

区别词性惯用语

pbei

介词“被”

k

后缀

z

状态词

c

连词

x

字符串

r

代词

cc

并列连词

idiom

成语

w

标点符号

-

-

-

-

开发步骤

在使用词性标注的接口时,将实现词性标注的相关类添加至工程。

代码语言:javascript复制
import ohos.ai.nlu.NluRequestType;
import ohos.ai.nlu.NluClient;
import ohos.ai.nlu.OnResultListener;
import ohos.ai.nlu.ResponseResult;

使用NluClient静态类进行初始化,通过异步方式获取服务的连接。

  • context:应用上下文信息,应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。
  • listener:初始化结果的回调,可以传null。
  • isLoadModel:是否加载模型,如果传true,则在初始化时加载模型;如果传false,则在初始化时不加载模型。
代码语言:javascript复制
NluClient.getInstance().init(context, new OnResultListener<Integer>(){
        @Override
        public void onResult(Integer result){
         // 初始化成功回调,在服务初始化成功调用该函数
        }
}, true);

调用词性标注的接口。

采用同步方式进行词性标注:

代码语言:javascript复制
String requestData = "{"text":"我要看速度与激情","type":0}";
ResponseResult responseResult = NluClient.getInstance().getWordPos(requestData, NluRequestType.REQUEST_TYPE_LOCAL);

采用异步方式进行词性标注:

代码语言:javascript复制
NluClient.getInstance().getWordPos(requestData,
            NluRequestType.REQUEST_TYPE_LOCAL, new OnResultListener<ResponseResult>() {
                @Override
                public void onResult(ResponseResult result) {
                    //异步返回处理
                }
            });

销毁NLU服务。

代码语言:javascript复制
NluClient.getInstance().destroy(context);

0 人点赞