【鸿蒙开发】第二十四章 AI -Natural Language Kit(自然语言理解服务)
目录
1 简介
2 约束与限制
3. 分词
3.1 适用场景
3.2 约束与限制
3.3 开发步骤
3.4 开发实例
4 实体抽取
4.1 适用场景
4.2 约束与限制
4.3 开发步骤
4.4 开发实例
1 简介
Natural Language Kit(自然语言理解服务)提供了多项文本语义理解相关的基础能力,帮助开发者更好地处理和分析文本数据。具体包括以下几个方面:
- 分词:可以将一段文本切分成独立的词语单元,识别出句子中的每个词汇。这是进行自然语言处理的基础步骤,为后续的语义分析、信息提取等任务奠定基础。
- 实体抽取:能够从文本中识别出具有特定意义的实体,例如人名、地名、时间日期、数字、电话号码、邮箱地址等。这些实体信息在很多场景下都有重要作用,如信息检索、知识图谱构建、智能问答等。
2 约束与限制
AI能力 | 约束 |
---|---|
分词 |
|
实体抽取 |
|
说明
Natural Language Kit的特性支持多用户同时接入,但是不支持同一用户并发调用同一个特性,如同一个特性被同一进程同一时间多次调用,则返回系统繁忙错误,不同进程调用同一特性,则同一时间只有一个进程业务在处理,其他进程进入队列排队。
3. 分词
3.1 适用场景
分词的目的是让文本文件的中文、英文、数字内容变成一个一个的单词或者词组,从而为后续的转变为词向量提供基础。使用场景例如搜索引擎会将用户输入的文本分词处理后提取关键词送搜索。
3.2 约束与限制
该能力当前不支持模拟器。
3.3 开发步骤
1. 引用相关类添加至工程。
import { textProcessing } from '@kit.NaturalLanguageKit';
2. 配置输入文本框和按钮,调用分词textProcessing.getWordSegment接口。
let inputText: string = '';
TextInput({ placeholder: '请输入文本' })
.height(40)
.fontSize(16)
.width('90%')
.margin(10)
.onChange((value: string) => {
this.inputText = value;
})
Button('获取分词结果')
.type(ButtonType.Capsule)
.fontColor(Color.White)
.width('45%')
.margin(10)
.onClick(async () => {
try {
let result = await textProcessing.getWordSegment(this.inputText);
this.outputText = this.formatWordSegmentResult(result);
} catch (err) {
console.error(`getWordSegment errorCode: ${err.code}, errorMessage: ${err.message}`);
}
})
3. 在界面上展示分词结果。
private formatWordSegmentResult(segments: textProcessing.WordSegment[]): string {
let output = 'Word Segments:\n';
segments.forEach((segment, index) => {
output += `Word[${index}]: ${segment.word}, Tag: ${segment.wordTag}\n`;
});
return output;
}
3.4 开发实例
import { textProcessing } from '@kit.NaturalLanguageKit';
@Entry
@Component
struct Index {
private inputText: string = '';
@State outputText: string = '';
build() {
Column() {
TextInput({ placeholder: '请输入文本' })
.height(40)
.fontSize(16)
.width('90%')
.margin(10)
.onChange((value: string) => {
this.inputText = value;
})
Scroll() {
Text(this.outputText)
.fontSize(16)
.width('90%')
.margin(10)
}
.height('40%')
//调用分词接口
Row() {
Button('获取分词结果')
.type(ButtonType.Capsule)
.fontColor(Color.White)
.width('45%')
.margin(10)
.onClick(async () => {
try {
let result = await textProcessing.getWordSegment(this.inputText);
this.outputText = this.formatWordSegmentResult(result);
} catch (err) {
console.error(`getWordSegment errorCode: ${err.code}, errorMessage: ${err.message}`);
}
})
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
//分词结果转义
private formatWordSegmentResult(segments: textProcessing.WordSegment[]): string {
let output = 'Word Segments:\n';
segments.forEach((segment, index) => {
output += `Word[${index}]: ${segment.word}, Tag: ${segment.wordTag}\n`;
});
return output;
}
}
4 实体抽取
4.1 适用场景
实体抽取是自然语言处理服务的一项关键能力。以综合上下文信息,从文本中准确识别出多种类型的实体:
- 日期时间(DATETIME):提取文本中的具体日期,如“2024年6月18日”等。
- 电子邮件(EMAIL):识别文本中的电子邮件地址,如“example@abc.com”。
- 快递单号(EXPRESS_NO):抽取文本中的快递单号信息。
- 航班号(FLIGHT_NO):定位文本中的航班号,如“CA1234”等。
- 地址(LOCATION):从文本中提取详细的地址描述。
- 人名(NAME):找出文本中出现的人名信息。
- 手机号(PHONE_NO)识别文本中的手机号码。
- 网址(URL):抽取文本中的网址链接。
- 验证码(VERFICATION_CODE):定位文本中的验证码数字。
- 身份证号(ID_NO):识别文本中的身份证号码信息。
通过准确抽取以上多种类型的实体信息,该项能力可以广泛应用于新闻阅读、信息检索、客户服务、社交聊天、金融运营等多种场景。例如,在新闻阅读场景中,可以对新闻正文进行实体抽取,并对人名、地名、时间、网址等关键实体信息进行高亮标识,帮助读者快速获取文章要点;在客服场景,通过抽取用户留言中的手机号、快递单号、验证码等信息,客服人员能够更高效地定位问题并给出解决方案。实体抽取为各行业的智能化应用提供了坚实的基础支持。
4.2 约束与限制
该能力当前不支持模拟器。
4.3 开发步骤
1. 在使用实体抽取功能时,将实现实体抽取的类添加至工程。
import { textProcessing, EntityType } from '@kit.NaturalLanguageKit';
2. 配置输入文本框。
let inputText: string = '';
TextInput({ placeholder: '请输入文本' })
.height(40)
.fontSize(16)
.width('90%')
.margin(10)
.onChange((value: string) => {
this.inputText = value;
})
3. 配置按钮,调用实体抽取textProcessing.getEntity接口。
Button('获取实体结果')
.type(ButtonType.Capsule)
.fontColor(Color.White)
.width('45%')
.margin(10)
.onClick(async () => {
try {
let result = await textProcessing.getEntity(this.inputText, {entityTypes: [EntityType.NAME, EntityType.PHONE_NO]});
this.outputText = this.formatEntityResult(result);
} catch (err) {
console.error(`getEntity errorCode: ${err.code}, errorMessage: ${err.message}`);
this.outputText = 'Error occurred while getting entities.';
}
})
4. 在界面上展示实体抽取结果。
private formatEntityResult(entities: textProcessing.Entity[]): string {
if (!entities || !entities.length) {
return 'No entities found.';
}
let output = 'Entities:\n';
for (let i = 0; i < entities.length; i++) {
let entity = entities[i];
output += `Entity[${i}]:\n`;
output += ` oriText: ${entity.text}\n`;
output += ` charOffset: ${entity.charOffset}\n`;
output += ` entityType: ${entity.type}\n`;
output += ` jsonObject: ${entity.jsonObject}\n\n`;
}
return output;
}
4.4 开发实例
import { textProcessing, EntityType } from '@kit.NaturalLanguageKit';
@Entry
@Component
struct Index {
private inputText: string = '';
@State outputText: string = '';
build() {
Column() {
TextInput({ placeholder: '请输入文本' })
.height(40)
.fontSize(16)
.width('90%')
.margin(10)
.onChange((value: string) => {
this.inputText = value;
})
Scroll() {
Text(this.outputText)
.fontSize(16)
.width('90%')
.margin(10)
}
.height('40%')
//调用实体抽取接口
Row() {
Button('获取实体结果')
.type(ButtonType.Capsule)
.fontColor(Color.White)
.width('45%')
.margin(10)
.onClick(async () => {
try {
let result = await textProcessing.getEntity(this.inputText, {entityTypes: [EntityType.NAME, EntityType.PHONE_NO]});
this.outputText = this.formatEntityResult(result);
} catch (err) {
console.error(`getEntity errorCode: ${err.code}, errorMessage: ${err.message}`);
this.outputText = 'Error occurred while getting entities.';
}
})
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
//实体结果转义
private formatEntityResult(entities: textProcessing.Entity[]): string {
if (!entities || !entities.length) {
return 'No entities found.';
}
let output = 'Entities:\n';
for (let i = 0; i < entities.length; i++) {
let entity = entities[i];
output += `Entity[${i}]:\n`;
output += ` oriText: ${entity.text}\n`;
output += ` charOffset: ${entity.charOffset}\n`;
output += ` entityType: ${entity.type}\n`;
output += ` jsonObject: ${entity.jsonObject}\n\n`;
}
return output;
}
}