当前位置: 首页 > article >正文

【鸿蒙开发】第二十四章 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(自然语言理解服务)提供了多项文本语义理解相关的基础能力,帮助开发者更好地处理和分析文本数据。具体包括以下几个方面:

  1. 分词:可以将一段文本切分成独立的词语单元,识别出句子中的每个词汇。这是进行自然语言处理的基础步骤,为后续的语义分析、信息提取等任务奠定基础。
  2. 实体抽取:能够从文本中识别出具有特定意义的实体,例如人名、地名、时间日期、数字、电话号码、邮箱地址等。这些实体信息在很多场景下都有重要作用,如信息检索、知识图谱构建、智能问答等。

2 约束与限制

AI能力

约束

分词

  • 支持的语言:简体中文、英文、繁体中文。
  • 文本长度:不超过1000字符。

实体抽取

  • 支持的语言:简体中文、英文、繁体中文。
  • 支持的实体:时间、地点、邮箱、快递单号、航班号、人名、电话号码、网址链接、验证码、证件号。
  • 文本长度:不超过1000字符。

说明

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 适用场景

实体抽取是自然语言处理服务的一项关键能力。以综合上下文信息,从文本中准确识别出多种类型的实体:

  1. 日期时间(DATETIME):提取文本中的具体日期,如“2024年6月18日”等。
  2. 电子邮件(EMAIL):识别文本中的电子邮件地址,如“example@abc.com”。
  3. 快递单号(EXPRESS_NO):抽取文本中的快递单号信息。
  4. 航班号(FLIGHT_NO):定位文本中的航班号,如“CA1234”等。
  5. 地址(LOCATION):从文本中提取详细的地址描述。
  6. 人名(NAME):找出文本中出现的人名信息。
  7. 手机号(PHONE_NO)识别文本中的手机号码。
  8. 网址(URL):抽取文本中的网址链接。
  9. 验证码(VERFICATION_CODE):定位文本中的验证码数字。
  10. 身份证号(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;
  }
}


http://www.kler.cn/a/542094.html

相关文章:

  • 前端技术学习——ES6核心基础
  • 掌握正则表达式_模式匹配的艺术
  • 1.【线性代数】——方程组的几何解释
  • 寒假2.8
  • Django学习笔记(第一天:Django基本知识简介与启动)
  • 【时序预测】-深度学习系列
  • SLF4J与Spring集成实战:替代JCL并绑定Log4j
  • 将Markdown格式文件与word文件相互转化方法
  • 【5】阿里面试题整理
  • STM32 软件SPI读写W25Q64
  • 论文笔记-CIKM2023-GALORE
  • 攻克AWS认证机器学习工程师(AWS Certified Machine Learning Engineer) - 助理级别认证:我的成功路线图
  • [漏洞篇]目录遍历漏洞详解
  • 活动预告 |【Part 2】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁
  • 说一下 jvm 有哪些垃圾回收器?
  • 在mac中安装Colima使用docker(替代Docker Desktop)
  • Vue 3 嵌套请求与数据重组:挑战与应对
  • ArcGIS Pro SDK (二十七)自定义许可
  • Go语言的内存分配原理
  • 泛型 什么是泛型 泛型的继承和通配符 二叉树
  • hbase快照同步到目标集群出现ERROR Multiple regions have the same startkey问题分析
  • OpenHarmony应用开发学习路线与资源指南
  • 请解释 JavaScript 中的函数式编程,优缺点是什么?
  • 三步本地部署deepseekr1,支持macOs,ubuntu,Windows
  • 基于STM32单片机智能教室管理系统设计与实现
  • 怎么在win10系统批量生成下面目录示例文件?