EDUCBA-Azure-实践认知服务笔记-全-
EDUCBA Azure 实践认知服务笔记(全)
001:概述与账户创建
在本课程中,我们将学习Azure认知服务。这是一系列由微软Azure提供的服务,旨在帮助开发者和架构师轻松创建智能应用程序。
什么是Azure认知服务?
Azure认知服务是一系列由Azure提供的服务集合。借助这些服务,我们可以创建智能应用程序。如今,创建智能应用已非新鲜事,但在过去,若想构建使用机器学习或AI模型的应用程序,需要聘请精通机器学习或AI的专业人士。而借助Azure认知服务,我们可以轻松实现这些功能,无需直接的机器学习、AI或数据科学知识。这些服务易于配置和部署,能帮助开发者构建智能应用。
例如,在日常生活中,我们可能会遇到需要从一组图片中找出“异类”的情况。人类很容易识别,但若想让机器完成此任务,通常需要创建并训练一套机器学习模型,经过大量测试后才能投入生产环境。然而,借助Azure,我们可以创建和部署基于视觉的服务,它能帮助我们在此类场景中找出不同的图片。
传统机器学习流程
上一节我们介绍了认知服务的概念,本节中我们来看看传统的机器学习在行业中是如何工作的。
以下是典型的机器学习流程步骤:
-
收集训练集:首先需要收集大量的训练数据集。例如,若要创建处理日志的模型,就需要成千上万条日志;若要创建图像识别模型,则需要成千上万张图片。我们将这些数据输入模型,使其从中学习。
-
清理数据:收集训练集后,需要从现有机器中清理这些数据,因为它们会占用存储空间。我们通常不希望机器保留这些未来不再使用的“废”数据,因为模型已经学习过了。
-
选择模型:在使用多个机器学习模型后,我们会得到不同的结果。有些模型准确率约为90%,有些是98%,有些是95%。我们当然会选择准确率最高(例如98%)的模型作为最终方案。
-
训练与验证:选定模型后,我们会用更多数据集对其进行进一步训练和结果验证。
-
部署:经过测试和训练后,我们将机器学习模型部署到生产环境。
这个过程通常耗时很长。但Azure认知服务为我们提供了现成的模型,我们可以直接部署使用,无需关心如何每日训练这些模型,因为这些模型已经由工程师们进行了充分的尝试和测试。
Azure认知服务的使用流程
了解了传统流程的复杂性后,我们来看看使用Azure认知服务的简化流程。
以下是使用Azure认知服务的基本步骤:
-
配置服务:首先需要配置(Provision)Azure认知服务。正如之前提到的,这些服务易于部署,我们将在动手实践环节展示如何操作。
-
使用服务:配置完成后,即可开始为应用程序使用这些服务。有多种方式可以访问这些服务:最简单的是通过控制台;另一种方式是通过API调用。如果希望通过应用程序集成,则使用API调用;若想不通过任何应用程序或中间件直接使用,则可以前往控制台操作。
认知服务分类
在开始动手之前,我们先系统了解Azure认知服务提供的主要类别。Azure认知服务主要分为五类:
-
视觉:此类服务用于识别物体、场景和活动,进行活动检测、人脸识别等。借助人脸识别,还可以进行身份验证。例如,可以识别图像中的人物是否为名人,或者某个地标是否为已知景点。它还能帮助进行情绪识别(判断人物是开心还是悲伤),以及文本和手写体识别。对于视频,可以提取元数据、关键帧并进行内容分析。此外,它还用于检测平台(如Facebook、Instagram)上的露骨或攻击性内容,以及支持自定义图像识别。
-
语音:此类服务与日常语音处理相关。基础功能包括语音转录(如视频自动生成字幕)和语音合成(将文本转换为语音,并可选择语音调制方式)。此外,还有实时语音翻译、说话人识别与验证服务,以及用于转录和语音合成的自定义语音模型。
-
搜索:此类服务主要用于增强搜索功能。它提供无广告的网页、新闻、图片和视频搜索结果,显示视频和新闻的趋势,识别相似图片和产品。搜索认知服务可以帮助我们精确查找所需内容。
-
语言:此类服务用于处理文本语言。功能包括语言检测(如Google翻译自动检测输入语言)、文本情感分析、关键短语提取(例如从“我们将学习认知服务”中提取“学习”、“认知服务”)、拼写检查、语法检查、攻击性文本内容审核以及文本翻译。
-
知识:此类服务借助知识认知搜索,可帮助进行决策制定,并能创建问答服务以提供帮助。
本课程将逐一深入介绍这些服务及其不同的应用场景。


创建Azure免费账户
在开始动手实践之前,我们需要先创建一个Azure账户。我们将创建一个免费层级的账户。


以下是Azure免费账户提供的主要服务示例(具体配额可能随时间变化,请以官网为准):
- 12个月免费服务:例如,750小时的Azure虚拟机(Windows/Linux)、5GB的Blob存储、250GB的SQL数据库等。
- 始终免费的服务:包括一定配额的认知服务,例如“异常检测器”和“自定义视觉”服务。以“自定义视觉”为例,免费层通常每月提供一定数量的训练图像调用次数(例如5000次)。

现在,让我们一步步创建账户。
以下是创建Azure免费账户的步骤:
- 访问Azure官网注册页面。
- 选择创建免费账户。
- 输入电子邮件地址(任何邮箱均可,不限于微软账户)。
- 设置密码。
- 通过电子邮件或手机验证身份。
- 填写个人信息,包括姓名、国家/地区、电话号码等,并完成手机号验证。
- 同意订阅协议。
- 提供信用卡信息进行验证。此步骤主要用于身份验证和防止滥用。如果仅在免费额度内使用服务并及时清理资源,通常不会产生费用。Azure会在扣费前明确提示。
- 完成验证后,账户即创建成功,可以开始使用。
注意:务必妥善管理资源,使用完毕后及时删除,以避免在超出免费额度后产生意外费用。

本节课中,我们一起学习了Azure认知服务的核心概念、其相对于传统机器学习的优势、主要服务分类(视觉、语音、搜索、语言、知识)以及如何创建Azure免费账户来开始使用这些服务。从下一节开始,我们将进入具体的动手实践环节。
002:视觉API与计算机视觉概述 🧠
在本节课中,我们将要学习Azure认知服务中的视觉API,特别是计算机视觉服务。我们将了解它的基本功能、工作原理,并通过实际操作演示如何使用它来分析图像。
什么是视觉API?


当我们听到“视觉”这个词时,首先想到的通常是图像或视频。视觉API正是处理这类内容的服务。它能够帮助我们分析和识别传入图像或视频中的内容。


例如,我们看到一棵树的图片,人类可以轻易识别。但如果要创建一个智能应用,传统方法需要构建和训练复杂的模型。而使用Azure认知服务,我们只需部署一个服务即可开始使用。

如果我们将一张树的图片传递给该服务,会得到类似以下的结果:
- 标签: 树 (得分: 0.96)
- 描述: 一棵树

服务不仅识别出物体,还会返回一个置信度分数,例如96%确定这是一棵树。这就是视觉API的基本工作方式。
视觉API包含哪些服务?

视觉API下包含多个具体的服务,以下是主要组成部分:
- 计算机视觉
- 人脸
- 自定义视觉
- 视频索引器
- 识别器与表单识别器
本教程将逐一介绍这些服务。首先,我们从计算机视觉开始。
计算机视觉服务如何工作?
上一节我们介绍了视觉API的概览,本节中我们来看看核心服务——计算机视觉的具体功能。

计算机视觉服务能够从图像中提取丰富的细节。例如,分析一张地铁站图片后,服务可能返回以下信息:
- 描述: 地铁、火车、站台、车站、室内、轨道、行走的人群、等候的人群。
- 图像类型: JPG
- 图像尺寸
- 标签: 交通、建筑、人群
- 检测到的物体及其位置
此外,它还能识别图像中的主导颜色。如果我们选择分析颜色特征,服务会返回图像中占主导地位的色彩信息。
计算机视觉的核心功能
以下是计算机视觉服务提供的一些关键能力:
-
图像分类与场景识别
- 识别图像中的场景或活动。例如,识别出图片中的人物正在进行“滑板运动”。
-
名人识别
- 识别图像中出现的知名人物。例如,传入一张名人照片,服务会返回该名人的姓名。

- 地标识别
- 识别著名的地标性建筑。例如,识别出图片中是埃菲尔铁塔。


- 光学字符识别
- 从图像中提取印刷体或手写体文字。
- 印刷体示例: 扫描银行对账单,直接提取文字信息,无需手动录入。
- 手写体示例: 提取手写笔记中的文字内容。

- 缩略图生成
- 自动为图像生成合适尺寸的缩略图。
实践:创建并使用计算机视觉服务
了解了理论之后,现在让我们动手创建第一个认知服务并实际使用它。我们将使用Postman工具来调用API。
第一步:创建计算机视觉服务
- 登录Azure门户。
- 点击“创建资源”。
- 在搜索框中输入“认知服务”,选择“认知服务”。
- 点击“添加”以创建新服务。
- 在服务类型中,选择“计算机视觉”。
- 选择你的订阅(例如免费试用)。
- 创建或选择一个资源组(可将其视为一个文件夹)。
- 选择区域(例如“美国东部”)。
- 为服务命名(名称需全局唯一)。
- 选择定价层(例如“免费F0”)。
- 点击“查看 + 创建”,然后点击“创建”。部署过程需要几秒钟。
第二步:获取访问密钥和终结点
服务创建成功后,需要获取访问凭证:
- 在资源列表中进入你创建的计算机视觉服务。
- 在左侧菜单中选择“密钥和终结点”。
- 复制
KEY 1或KEY 2以及终结点地址。调用API时会用到它们。
第三步:使用Postman调用API
我们将参照官方文档,使用Postman发送请求来分析图像。
-
准备请求URL:
- 从计算机视觉的API文档中,找到“分析图像”的POST请求示例URL。
- 将文档中的示例终结点替换为你自己的终结点地址。
- URL格式大致如下:
{你的终结点}/vision/v3.2/analyze[?visualFeatures][&details][&language] - 在URL后添加查询参数,指定需要返回的信息,例如:
?visualFeatures=Categories,Color,Description,Objects,Tags&details=Landmarks
-
配置Postman请求:
- 方法: 选择
POST。 - Headers(请求头):
Content-Type:application/octet-streamOcp-Apim-Subscription-Key: 填入你复制的密钥
- Body(请求体):
- 选择
binary类型。 - 点击“Select File”并选择一张本地图片(支持JPG、PNG等格式,大小需小于4MB)。
- 选择
- 方法: 选择

- 发送请求并查看结果:
- 点击“Send”。
- 成功后,会在下方看到状态码
200 OK和JSON格式的响应结果。 - 结果中可能包含图像分类、描述、标签、检测到的物体、主导颜色以及地标识别信息等。
示例响应片段:
{
"categories": [{"name": "outdoor_", "score": 0.99609375}],
"description": {"captions": [{"text": "a wave crashing on a beach", "confidence": 0.895}]},
"color": {"dominantColors": ["White"]},
"tags": [{"name": "ocean", "confidence": 0.999}, {"name": "wave", "confidence": 0.995}]
}
通过更换不同的图片(如名人照片、地标建筑),可以测试服务的名人识别和地标识别功能。
人脸API概述
在上一节,我们通过实际操作学习了计算机视觉服务。它主要提供图像的整体分析。本节我们将深入另一个专门领域——人脸API,它能提供关于图像中人脸的更细致信息。
人脸API的核心功能包括:
-
人脸检测
- 检测图像或视频中是否存在一张或多张人脸。
- 提供每张人脸的详细信息,如年龄、性别、情绪(快乐、悲伤等)、面部特征点(眼睛、鼻子、嘴的位置)以及姿势。
-
人脸验证
- 比较两张人脸,判断它们是否属于同一个人。
- 公式:
verify(faceId1, faceId2) -> {isIdentical: true/false, confidence: 0.xx} - 日常应用:手机面部解锁(如Apple Face ID)。
-
人脸分组
- 将一组人脸照片根据视觉相似性自动分成不同的组。
- 适用于整理大量未标记的人像照片。
-
人脸识别
- 在已建立的人脸数据库(如员工库)中,识别一张新人脸对应的身份。
- 流程:
identify(faceId, personGroupId) -> [ {personId: xxx, confidence: 0.xx} ]
-
相似人脸查找
- 在数据库中查找与给定人脸视觉上相似的人脸。
- 注意: 长相相似不一定代表是同一个人。此API可用于开发趣味应用,例如“寻找与你相似的明星”。

实践:使用人脸检测API

让我们通过Postman体验人脸API中最基础的功能——人脸检测。
第一步:准备请求
- 参照人脸API文档,找到“Detect”接口的POST请求URL。
- 将终结点替换为你自己的(如果使用独立的人脸服务,需创建对应的资源并获取其密钥和终结点;计算机视觉服务也包含基础人脸功能,但功能可能不同)。
- 在URL中添加查询参数,指定需要返回的面部属性,例如:
?returnFaceId=true&returnFaceLandmarks=true&returnFaceAttributes=age,gender,emotion,glasses
第二步:配置并发送Postman请求
- 方法:
POST - Headers:
Content-Type:application/octet-streamOcp-Apim-Subscription-Key: 你的密钥
- Body: 选择
binary,上传一张含有人脸的图片。 - 点击“Send”。
第三步:解析结果
响应将是一个JSON数组,为图片中检测到的每张人脸返回一个对象。
示例响应片段:
[
{
"faceId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"faceRectangle": {"top": 100, "left": 150, "width": 80, "height": 80},
"faceAttributes": {
"age": 35.5,
"gender": "male",
"emotion": {"happiness": 0.99, ...},
"glasses": "No"
}
}
]
如果图片中有多个人,数组会包含多个对象,分别描述每个人脸的信息。通过这个API,我们可以快速获取人脸的详细分析数据。
总结
本节课中我们一起学习了Azure认知服务的视觉API。
- 我们首先了解了计算机视觉服务,它能够对图像进行整体分析,包括分类、描述、OCR、识别名人和地标等。
- 随后,我们通过Postman实际操作,创建了服务并调用API分析了不同图片,看到了返回的JSON结果。
- 接着,我们深入探讨了人脸API,它专注于人脸相关的分析,如检测、验证、分组和识别。
- 最后,我们实践了人脸检测API,成功获取了图片中人脸的年龄、性别、情绪等属性。

这些强大的API使得复杂的图像分析任务变得简单,开发者无需深厚的机器学习背景即可将其集成到应用程序中。
003:自定义视觉服务 🧠
在本节课中,我们将学习Azure认知服务中的自定义视觉服务。我们将了解它的核心概念、适用场景,并通过一个手把手的实践项目——创建一个树叶分类器,来掌握其完整的工作流程。
概述
自定义视觉服务是Azure视觉API下的一个类别。顾名思义,它允许我们为特定、独特的用例创建定制化的图像分类模型。与通用的计算机视觉API不同,自定义视觉服务专注于解决那些标准模型无法满足的个性化需求。
核心概念与适用场景
上一节我们介绍了自定义视觉服务的定位,本节中我们来看看它的核心功能和适用场景。
自定义视觉服务主要用于图像分类。这意味着,你可以训练一个模型,让它判断一张新图片是否属于你预先定义的某个类别(例如,类别A或类别B)。
关键点:
- 该服务仅用于图像分类任务。
- 它专为满足你的独特用例而设计。
我们已经讨论过计算机视觉API和人脸API。对于识别三位名人或地标这类通用场景,你可能不需要自定义视觉服务。但是,如果你有一个全新的分类需求,例如区分不同种类的树叶,那么自定义视觉服务就派上用场了。
你可以使用属于不同类别的图片来训练你的自定义视觉模型。例如,一个基础应用可以是根据材质(塑料或玻璃)对物品进行分类。更具体的例子是,如果你有不同树木的树叶图片,通用模型可能只能识别出“这是树叶”,而无法告诉你具体是哪种树的叶子。通过自定义视觉服务,我们可以训练一个模型,使其能精确识别出“这是芒果树叶子”或“这是尼姆树叶子”。
服务优势与工作原理
了解了适用场景后,我们来看看使用自定义视觉服务的优势及其背后的简化流程。
使用自定义视觉服务的最大优势在于,你无需处理底层的机器学习细节。你不需要收集成千上万的训练图片,也不需要自己选择算法或清洗数据。微软Azure已经为这类场景选择了合适的预训练模型。

你需要做的只是为每个你想分类的类别提供一些图片。例如,在我们的实践项目中,我们会为“芒果叶”和“尼姆叶”这两个类别分别上传一些图片。
以下是创建和使用自定义视觉模型的基本步骤:
- 准备图片集:微软建议每个类别至少准备30张图片。图片越多,训练效果通常越好。
- 上传图片:将准备好的图片上传到自定义视觉服务项目中。
- 训练模型:使用上传的图片集开始训练模型。
- 测试模型:模型训练完成后,使用新的测试图片来验证模型的预测结果是否符合预期。如果不符合,需要重新训练或添加更多图片。
- 部署模型:当模型达到满意的准确度后,将其部署为可调用的服务。
- 集成使用:在你的应用程序中,通过调用Azure提供的REST API来使用这个已部署的模型。
你可以通过上传更多图片并重新训练模型,来持续优化模型的性能。
动手实践:创建树叶分类器 🌿
理论部分已经介绍完毕,现在让我们进入动手实践环节。在接下来的部分,我们将一步步创建一个自定义视觉服务,用于区分芒果叶和尼姆叶。
第一步:创建自定义视觉资源
首先,我们需要在Azure门户中创建一个自定义视觉资源。

- 在Azure门户顶部的搜索栏中,搜索“自定义视觉”并选择该服务。
- 点击“+ 创建”按钮。
- 在创建页面中,进行如下配置:
- 预测资源:选择“是”。
- 订阅:选择你的订阅(例如“免费试用”)。
- 资源组:选择一个已有的资源组,或新建一个。
- 区域:选择“美国东部”或其他可用区域。
- 名称:为你的服务起一个唯一的名字(例如“LeafCategorizationService”)。
- 定价层:选择“F0”(免费层)。
- 在“网络”和“标签”部分保持默认设置,然后点击“查看 + 创建”。
- 验证信息无误后,点击“创建”。部署过程可能需要几分钟。
第二步:在自定义视觉门户中创建项目

资源创建完成后,我们可以通过多种方式使用它:获取API密钥、使用门户或调用SDK。这里我们使用门户进行操作。


- 在资源创建成功后,点击“转到资源”。
- 在资源概览页面,找到并点击“自定义视觉门户”的链接,这将打开一个新的浏览器标签页。
- 在自定义视觉门户中,点击“新建项目”。
- 配置新项目:
- 名称:
LeafCategorization - 描述:
Categorize the type of leaves. - 资源:选择你刚创建的自定义视觉资源。
- 项目类型:
分类 - 分类类型:
多标签(单个标签)(因为我们每张图只属于一个类别:芒果叶 或 尼姆叶)。 - 域:选择
常规(常规[A2])。
- 名称:
- 点击“创建项目”。

第三步:上传并标记训练图像


项目创建后,我们需要为每个类别上传并标记图片。
- 点击“添加图像”。
- 首先上传“芒果叶”类别的图片。选择所有芒果叶图片,点击“打开”。
- 在弹出窗口中,为这批图片创建新标签
mango leaf,然后点击“上传”。 - 重复上述过程,为“尼姆叶”类别上传图片,并创建标签
neem leaf。 - 上传完成后,你将在“训练图像”选项卡中看到所有已标记的图片。
第四步:训练模型

有了标记好的数据,我们就可以开始训练模型了。
- 点击顶部的“训练”按钮。
- 选择训练类型。有两种选择:
- 快速训练:适合快速原型验证,我们本次选择此项。
- 高级训练:允许设置更长的训练时间和预算,适合追求更高精度的生产环境。训练完成后可通过邮件通知。
- 点击“训练”开始快速训练。训练通常在一分钟内完成。
- 训练完成后,你会看到模型的性能指标,如精确度(Precision)和召回率(Recall),以及每个标签的单独性能。
第五步:快速测试模型
在部署前,我们先在门户内测试一下模型。
- 点击“快速测试”。
- 点击“浏览本地文件”,选择一张未用于训练的芒果叶或尼姆叶测试图片。
- 系统会显示预测结果,包括最可能的标签及其概率。例如,“芒果叶 - 99.7%”。
- 可以多测试几张图片,观察模型的准确性。


第六步:发布并使用预测API

如果测试结果满意,我们就可以发布模型,并通过API在外部应用中调用它。



- 点击“性能”选项卡下的“发布”按钮。
- 为发布的模型迭代起一个名字(如
LeafModel),然后点击“发布”。 - 发布成功后,点击“预测URL”。你将看到两种调用方式的示例:通过图像URL或直接上传图像二进制文件。
- 复制“如果你有图像文件”对应的URL。
- 使用API测试工具(如Postman)进行测试:
- 方法:
POST - URL:粘贴复制的预测URL。
- Header:
Prediction-Key: 在自定义视觉门户的“设置”(齿轮图标)>“密钥和终结点”页面获取。Content-Type:application/octet-stream
- Body:选择
binary,然后上传一张测试图片。
- 方法:
- 发送请求后,你将收到JSON格式的响应,其中包含预测的标签和概率。


第七步:清理资源(重要)
为避免产生不必要的费用,实践完成后请务必清理资源。
- 在自定义视觉门户中,进入“性能”选项卡,点击“取消发布”模型。
- 进入“设置”(齿轮图标)>“我的项目”,找到你的项目并点击“删除”。
- 回到Azure门户,找到你创建的自定义视觉资源,点击“删除”。


总结

本节课中我们一起学习了Azure自定义视觉服务。我们了解到,该服务专为独特的图像分类场景而设计,它极大地简化了定制化AI模型的创建过程,使我们无需具备深厚的机器学习知识即可构建实用的分类器。通过“树叶分类器”的实践,我们完整经历了从创建资源、准备数据、训练模型、测试验证到最终通过API集成使用的全流程。记住,对于通用识别任务,可优先考虑标准计算机视觉API;而对于像区分特定产品、检测特定缺陷这类个性化需求,自定义视觉服务是你的强大工具。
004:形态与墨水识别器概述 🧠
在本节课中,我们将学习Azure认知服务提供的另外两种视觉服务:视频索引器和表单识别器。我们将了解它们的功能、应用场景,并通过实际操作演示如何使用这些服务。
视频索引器服务概述
上一节我们介绍了基础的视觉服务,本节中我们来看看视频索引器。这项服务的主要目的是为视频建立索引。它通过分析我们传入的音频和视频文件,从中提取元数据来完成这项工作。
一旦从音视频中提取出元数据,这些数据就可以用来为视频文件打上标签。以下是该服务可以提取的元数据类型:
- 口述文字:视频中人物所说的内容。
- 书面文字:视频画面中出现的文本。
- 主题:视频内容的核心主题。
- 品牌:视频中出现的品牌标识。
- 人脸:识别视频中出现的人物。
- 说话者:区分不同的说话者。
- 情绪:分析人物的情绪状态。
这些是从音视频文件中提取的宝贵信息。该服务能节省大量时间和人力。例如,对于一个10分钟的视频,人工提取所有元数据需要完整观看并记录。而使用此服务,只需上传视频,即可自动获取所有元数据,过程简单高效。
这项服务有多种应用方式。例如,假设我们有一个视频库,用户想搜索特定视频。如果用户提供一些元数据(如“包含天空的户外场景”),我们可以利用此服务快速找到匹配的视频。另一种方式是,我们可以上传一个样本视频,获取其元数据,然后与现有视频库进行交叉比对,从而创建智能检索系统。
表单识别器服务概述
在视频索引器之后,我们来了解表单识别器服务。该服务旨在从表单中提取数据和表格。
许多机构(如银行、学校)会提供需要填写的电子表格。假设我收到一份由PDF编辑器填写好的学校表格。如果需要从这些已填写的表格中提取特定的键值对信息,传统方法是人工阅读和录入。而更高效的方式是,将这些表格传递给表单识别器服务。
该服务会以键值对的格式从表单中提取数据。例如,我们通过PDF编辑器填写了一份表单。将其传入表单识别器服务后,服务会从中提取键值对信息。这样,我们就可以根据需求对数据进行索引,无需手动处理。
数字墨迹识别器概述

在上一部分,我介绍了如何从数字填写的表单中提取数据。但有时,人们会手动填写某些信息,例如手写文字或绘制图形。
例如,我在这里写了一些文字。这类文本需要被提取。这种特定的笔迹轨迹被称为数字墨迹。我们可能用鼠标在电脑上绘制了这些文字,或者画了一幅图。
数字墨迹识别器服务会接收这些笔划轨迹,并返回识别出的文本和简单形状。屏幕上有一个示例:我手写了一段文字。我的服务会读取它,并基于此返回识别结果。它处理手写文本的方式也是如此。我们甚至可以尝试上传用笔在纸上书写内容的扫描件,服务也能以同样的方式提取文本。


视频索引器动手实践
在本次实践环节,我们将对上一节介绍的视频索引器服务进行实际操作。这是我的Azure门户,但当我在此搜索“视频索引器”时,并不会显示任何相关服务。
实际上,这项服务由Azure单独提供。我们需要访问 media.indexer.ai 这个特定网址。进入该网站后,需要再次创建账户。我将在此创建我的第一个账户,选择使用Google账户登录。
登录后,我们可以看到Azure视频分析器服务提供的功能。这里有媒体文件、模型定制和账户设置选项。在“媒体文件”下,有库、项目和样本。这是一个示例服务配置文件。我返回“库”并选择“上传”。
在上传部分,我们可以浏览文件,并有一些上传指南。指南指出,视频不应超过4GB,并且支持特定的文件格式。
现在关闭指南,选择文件。我转到下载文件夹,这里有一些我之前下载的免费视频(这些视频目前没有音频)。等待几秒钟,视频开始上传。
可以看到,一个视频已经上传完成,现在正在被索引。我返回并选择上传另一个视频。现在第二个视频也开始上传了。


可以看到,这个视频出现在最近上传列表中,并且正在索引。同时,第一个视频的索引进度已达到30%。处理方式有两种:对于我们现在上传的小视频,索引不会花太多时间;但如果你有更大的视频,上传后,该服务会向指定邮箱发送通知,告知视频索引已完成。
目前,一个视频索引进度为53%,另一个为30%。由于视频很小,应该很快就能完成。视频索引完成后,我们可以查看提取出的各种信息。如果认为某些信息缺失,我们还可以选择重新索引这些视频。
刷新页面,可以看到其中一个视频已经完成索引。点击播放,这是一个12秒的视频。在播放的同时,我们可以看到该视频的分析结果。由于这是一个免费样本视频,我们无需购买任何版权。
根据这个视频,我们得到了一些详细信息:视频中有两个人物,以及他们在视频中出现的百分比。第二个人物出现了23.19%。我认为它没有覆盖视频中的每一个人。第一个人物(主唱)出现了199.74%(注:此处百分比可能为显示或计算误差,实际应不超过100%)。

此外,服务还为我们捕获了19个标签。展开查看,包括:户外、人物、女性、天空、服装、套装、摩天大楼、人脸等。这些是基于传入视频生成的标签。还有一些被识别出的场景。这就是它为我们索引内容的方式。
我们可以选择查看不同的分析维度。这里有“洞察”、“字幕辅助功能”等选项。因为当前视频没有音频,所以没有生成字幕。我们甚至可以编辑某些内容,例如,如果想删除某个人物,也可以做到。

现在返回。在搜索框中,例如我搜索“bird”。可以看到,它为我们运行了查询,并指出在这个视频中出现了鸟,以及鸟在视频中被检测到的具体时间点。点击这个时间点。


这是鸟在天空中飞翔的视频片段。同时,我们得到了一些标签:“户外”标签同样存在,还有“鸟”等不同的标签。如果我返回并尝试搜索另一个关键词,例如“outdoor”,可以看到两个视频都被检索出来了。
如果搜索“girl”,这个特定视频会被Azure视频分析器推荐。如果搜索“outdoor music”,也可以传递该查询。这就是该服务在Azure前端的工作方式。但请注意,这项服务是Azure单独提供的,有其独立的URL。你可以前往该网站创建免费账户,可以使用Google账户、Microsoft账户或其他方式登录,之后就可以按需使用这项服务了。
表单识别器动手实践
现在,我们进行表单识别器的动手实践。这是我的Microsoft Azure门户,我需要在此搜索“表单识别器”服务。
启动该服务后,需要选择“创建”。我的订阅是免费试用版。接着,需要选择资源组,我将使用在本系列课程开始时创建的初始资源组。区域选择“美国东部”。然后,需要命名,我将其命名为“demo-form-recognizer”。接下来,设置定价层,我选择免费的F0层。然后点击“下一步”。
在“网络”部分,我选择“所有网络”。“身份”部分不做更改。不添加标签。然后点击“查看 + 创建”,最后选择“创建”。部署需要一些时间。
部署完成后,可以看到我们的“demo-form-recognizer”服务。点击进入。在“概览”页面,我们可以看到服务的一些详细信息,包括位置、服务名称等。这些和我们之前操作其他服务时类似。这里还有密钥,我们将在使用服务时用到它们。



现在,我需要使用我的表单识别器。基本上,我访问了Azure页面,在服务中查找“表单识别器”,通过其文档可以了解详细信息。文档部分有点复杂:表单识别器支持两种类型,一个是表单识别器API(版本2.1),另一个是较新的、目前处于预览版的API。我们暂时不看预览版,只关注2.1版本,并尝试使用它。
我们首先获得了演示URL。文档指出,我们需要端点等信息。根据文档,因为我们使用的区域是“美国东部”,所以选择对应的端点。我提前打开了文档,这是我的实际请求URL。
我需要打开记事本,复制这个URL。页面加载可能有点慢,我们可以稍等。或者,我已经提前复制好了。URL格式是:https://eastus.api.cognitive.microsoft.com/,后面跟着API名称(表单识别器版本),然后是/layout/analyze。之后,我们需要指定传递的内容类型以及订阅密钥等。
我将打开Postman,粘贴服务URL,请求类型设为POST。转到“Headers”选项卡,需要填写详细信息。首先需要传递我的密钥。我们知道从哪里获取密钥。粘贴密钥。接着,需要选择内容类型。我将传递一个PDF文件。所以内容类型是application/pdf。
然后,转到“Body”选项卡,选择“binary”,然后选择文件。我选择我的演示表单文件,然后发送请求。
现在,我们得到了一个202状态码(已接受),但还没有直接的结果返回。这是因为在第一次请求中,服务会为我们提供一个唯一的标识ID。我们需要在后续请求中使用这个ID来获取结果。
要获取这个ID,我需要查看从服务返回的响应头。在响应头中,有一个名为Operation-Location的字段,其中包含一个唯一的标识号。我复制这个URL。
然后,在Postman中创建一个新的GET请求,粘贴这个URL。在Headers中,只需要传递订阅密钥。然后发送请求。
现在,我们得到了响应,状态是200。响应中包含诸如状态、创建时间、最后更新时间等详细信息。还有分析结果,我们使用的版本是2.1。基于每一页,都有详细的边界框信息,描述了文档中文字的位置。稍后我会展示文档。
我们继续向下看,还有文本信息。这表明服务能够扫描我们传入的文档中的所有细节。
现在,我尝试处理另一个不同的文件。这是一个演示文件。我传递这个文件。这样做的原因是,每个我们发送的请求都会获得不同的唯一ID。可以看到,我们得到了一个新的URL,其中包含一个新的ID。在发送新请求获取结果之前,可以看到这个ID与之前使用的完全不同。这就是API的工作方式:每个请求获得一个唯一ID,服务根据这个ID存储结果。
我复制这个新ID,在Postman中创建一个新的GET请求,粘贴URL,在Headers中添加订阅密钥,然后再次发送请求。
成功获得响应。这就是该服务的工作方式。在文本字段中,我们可以找到传入表单中的具体数据、所有数据内容以及它们所在的位置框。
我使用了两种表单。让我打开下载文件夹查看。这些就是我们传入的文件。这是分析结果。例如,我尝试查找与“King John Way Coffee”相关的内容。可以看到,我们找到了“Exchange”这个词。如果再往下看,找到了“$477 per year”等信息。这就是它的工作方式。
至此,表单识别器服务在Azure上的操作就完成了。我们不再需要这个服务,因此可以将其删除。
课程总结
在本节课中,我们一起学习了Azure认知服务中的两项重要视觉服务:
- 视频索引器:用于自动分析视频内容,提取元数据(如文字、主题、人脸、品牌等),实现视频内容的智能检索、标签化和洞察分析。
- 表单识别器:用于从结构化或半结构化的文档(如表单、发票)中自动提取文字、键值对和表格数据,将非结构化文档信息转化为可索引、可搜索的结构化数据。

我们通过实际操作,演示了如何创建和使用这两项服务,包括上传视频进行索引分析,以及调用API处理PDF表单并提取数据。这些服务极大地自动化了内容理解和数据提取过程,为处理大量音视频和文档资料提供了高效的解决方案。
005:认知语音服务 🎤
在本节课中,我们将要学习Azure认知服务中的语音服务类别。我们将了解如何将语音转换为文本,以及如何将文本合成为语音,并通过实际操作演示这两个核心功能。
概述
上一节我们介绍了视觉类认知服务,本节中我们来看看语音服务。语音服务使我们能够处理和理解人类语音。借助这些服务,我们可以将口语转换为文本,或者将文本合成为听起来自然的语音。我们还可以翻译口语,并进行说话人验证。与视觉服务相比,此类别下的服务种类较少,主要有四种核心服务。
核心语音服务
以下是语音类别下的主要服务:

- 语音转文本:将口语转换为文本。
- 文本转语音:从文本生成听起来自然的语音。
- 语音翻译:将语音从一种语言翻译成另一种语言。
- 说话人识别:此服务目前处于预览阶段,不推荐用于生产工作负载。它可以用于实现未来风险功能,例如语音登录或身份验证。
让我们从语音类别下的第一个服务开始。
语音转文本服务 🗣️➡️📝
关于这项服务,无需过多解释,因为您可能已经确切知道它的功能。该服务接受预录制的音频文件作为输入,并输出语音对应的文字记录或文本。
核心流程可以表示为:
音频文件输入 -> 语音转文本API -> 文本输出
您可以在应用程序中使用返回的文本。发送给此API的音频文件质量越高,成功转换的几率就越大。想象一下,我们调用服务并接收回文本,那么我们可以用这些文本做什么呢?
以下是几个应用场景:
- 由于计算机无法直接处理语音,但可以处理文本,因此获取文本后,您可以存储它或将其传递给其他认知服务。
- 例如,在语音助手场景中:用户说话后,语音被转换为文本,然后传递给其他API。通过这些API,我们可以计算出用户的意图,从而实现语音助手功能。这正是您日常使用的语音助手(如Alexa)的工作原理。
- 您也可以将此文本传递给翻译服务,将一个人的语音翻译成您熟悉的语言(例如从英语翻译成法语、西班牙语等)。
- 我们甚至可以将此服务用于更传统的用例,例如转录。例如,您可以转录客服中心通话记录,以供未来调查使用。
这就是我们如何在日常用例中使用语音转文本服务。
实践:语音转文本
在本节中,我们将进行实际操作,尝试传递一段语音并从中提取文本数据。
-
创建语音服务资源
首先,在Azure门户中创建新的语音服务资源。- 搜索“认知服务”或直接搜索“语音服务”。
- 选择“创建”并填写详细信息:
- 资源组:选择现有或创建新的资源组。
- 区域:选择“East US”或其他可用区域。
- 名称:例如
speech-conversion-service。 - 定价层:选择“免费F0”层。
- 完成其他设置(网络、标签等)后,查看并创建资源。
-
获取访问密钥和终结点
资源部署完成后,进入该资源。- 在“密钥和终结点”部分,复制其中一个密钥以及服务区域(如
eastus)。稍后将用到它们。
- 在“密钥和终结点”部分,复制其中一个密钥以及服务区域(如
-
查阅API文档
我们需要使用REST API调用该服务。打开Azure认知语音服务的官方文档,找到“语音转文本”REST API部分。- 找到基本请求URL,格式通常为:
https://<REGION_IDENTIFIER>.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1 - 将
<REGION_IDENTIFIER>替换为您的服务区域,例如eastus。
- 找到基本请求URL,格式通常为:
-
使用Postman测试API
- 打开Postman,创建一个新的POST请求。
- URL:粘贴上面构建的请求URL。
- Headers:需要设置以下请求头:
Ocp-Apim-Subscription-Key: 粘贴您的语音服务密钥。Content-Type: 指定音频格式。支持audio/wav或audio/ogg。我们使用audio/wav。- (可选)
Accept: 可以设置为application/json。
- Body:选择“binary”,然后上传一个.wav格式的音频文件。
- 发送请求。如果成功,响应体(JSON格式)中将包含识别状态和转换后的文本,例如:
{ "RecognitionStatus": "Success", "DisplayText": "This is a sample audio file for Azure cognitive service..." }
文本转语音服务 📝➡️🗣️
接下来,我们看看语音类别下的第二个API:文本转语音。同样,您应该对其功能有很好的理解。您可以向该服务传递一些文本,之后它将处理该文本并返回一个生成的语音文件。您几乎可以在任何地方播放该语音文件。
这项API有几个重要的用例。最重要的是,您可以使用它来构建能够自然说话的应用程序和服务。此服务生成的语音不仅仅是单调、毫无生气的,甚至听起来也不像机器人声音。您可以从数十种声音中进行选择,包括不同口音的男声或女声。语音逼真,非机器人式。
您甚至可以更进一步,通过一种名为SSML的特殊XML语法来自定义语音。SSML(语音合成标记语言)是包括微软在内的许多服务提供商使用的标准标记语言。您还可以更进一步,创建自己的自定义语音。您需要做的就是录制自己的声音样本,然后将其传递给语音工作室,并基于您的声音训练一个模型。模型训练完成后,您就可以用它来生成具有自己声音特色的语音。这非常强大。
在跳转到演示之前,让我们简要概述一下实际操作如何进行。
实践:文本转语音
由于我们已在之前的会话中启动了语音服务,因此无需创建新服务。我们直接使用现有的语音服务资源。
-
获取身份验证令牌
文本转语音API的访问方式略有不同。我们需要先获取一个访问令牌。- 在API文档中找到“身份验证令牌服务”的URL,格式通常为:
https://<REGION_IDENTIFIER>.api.cognitive.microsoft.com/sts/v1.0/issueToken - 在Postman中,向此URL发送一个POST请求。
- 设置请求头
Ocp-Apim-Subscription-Key为您的语音服务密钥。 - 发送请求后,响应体中将返回一个访问令牌(一串长字符串)。复制此令牌。
- 在API文档中找到“身份验证令牌服务”的URL,格式通常为:
-
获取支持的声音列表
- 在文档中找到“获取声音列表”的GET请求URL。
- 在Postman中新建一个GET请求,使用该URL。
- 设置请求头
Authorization为Bearer <你的访问令牌>。 - 发送请求后,您将收到一个JSON响应,其中列出了所有支持的语言和声音(如“en-US-JennyNeural”)。记下您想使用的声音名称。
-
合成语音
- 在文档中找到文本转语音合成的POST请求URL。
- 在Postman中新建一个POST请求,使用该URL。
- 设置以下请求头:
Authorization:Bearer <你的访问令牌>Content-Type:application/ssml+xmlX-Microsoft-OutputFormat: 指定输出音频格式,例如audio-16khz-128kbitrate-mono-mp3。
- 在Body中,选择“raw”,并输入SSML格式的文本。例如:
<speak version='1.0' xml:lang='en-US'> <voice xml:lang='en-US' xml:gender='Female' name='en-US-JennyNeural'> Hi, this is our very first text to speech conversion call. Thank you. </voice> </speak>- 将
name属性替换为您在步骤2中选择的声音名称。
- 将
- 发送请求。如果成功,响应体将是一个音频文件(二进制数据)。您可以在Postman中将其保存为
.mp3或.wav文件并进行播放。
总结


本节课中我们一起学习了Azure认知语音服务的核心功能。我们深入探讨了语音转文本服务,它能够将音频内容转换为可编辑和处理的文字;以及文本转语音服务,它可以将文字合成为逼真、自然的语音。通过实际操作,我们分别在Azure门户中创建了服务资源,并使用Postman调用REST API成功完成了语音与文本之间的相互转换。这些服务为开发语音助手、无障碍应用、媒体转录和交互式语音响应系统等场景提供了强大的支持。
006:语音翻译服务概览 🎤

在本节课中,我们将要学习Azure认知服务中语音API的第三种服务:语音翻译服务。我们将了解它的工作原理、核心概念以及如何通过SDK实现一个简单的翻译程序。
概述
上一节我们介绍了文本转语音服务。本节中,我们来看看语音翻译服务。在日常生活中,我们经常听说翻译器。例如,一个人从美国搬到俄罗斯,他听到的主要语言是俄语。为了理解当地人的交流,他需要一个翻译器。这可以通过懂双语的人,或者使用翻译服务来实现。
Azure的语音翻译服务允许我们将一种语言的语音实时翻译成另一种语言的文本或语音。其核心流程是:传入一段源语言(如英语)的语音,并指定期望的输出语言(如俄语或德语),服务会根据配置返回翻译结果。
我们有两种翻译器:
- 通用翻译器:用于日常语言转换。
- 自定义翻译器:用于特定领域或行业的专业翻译。
这是一个非常强大的功能,在跨国会议等场景中已有应用。接下来,我们将学习如何利用此服务。
实现语音翻译服务

与之前使用的服务不同,语音翻译服务目前不提供REST API,我们必须使用Azure提供的SDK来构建服务。

以下是创建一个Java项目来实现语音翻译的步骤:
-
准备Azure资源
首先,在Azure门户中创建语音服务资源,并获取密钥和区域终结点。 -
创建项目并添加依赖
使用Spring Initializr创建一个新的Java项目。在项目的pom.xml文件中,添加Azure语音SDK的依赖。<dependency> <groupId>com.microsoft.cognitiveservices.speech</groupId> <artifactId>client-sdk</artifactId> <version>1.19.0</version> </dependency>

-
编写核心代码
在应用程序中,配置订阅密钥、服务区域、源语言和目标语言。import com.microsoft.cognitiveservices.speech.*; import com.microsoft.cognitiveservices.speech.translation.*; public class Translator { public static void main(String[] args) { // 配置密钥和区域 String speechSubscriptionKey = "你的订阅密钥"; String serviceRegion = "eastus"; // 你的服务区域 // 配置翻译:从英语翻译到德语、法语、中文 SpeechTranslationConfig config = SpeechTranslationConfig.fromSubscription(speechSubscriptionKey, serviceRegion); config.setSpeechRecognitionLanguage("en-US"); config.addTargetLanguage("de"); config.addTargetLanguage("fr"); config.addTargetLanguage("zh-CN"); // 创建翻译识别器,从麦克风获取音频 try (TranslationRecognizer recognizer = new TranslationRecognizer(config)) { System.out.println("请开始说话..."); TranslationRecognitionResult result = recognizer.recognizeOnceAsync().get(); if (result.getReason() == ResultReason.TranslatedSpeech) { // 输出识别和翻译结果 System.out.println("识别到的文本: " + result.getText()); for (Map.Entry<String, String> pair : result.getTranslations().entrySet()) { System.out.println("翻译到 '" + pair.getKey() + "': " + pair.getValue()); } } } catch (Exception ex) { System.out.println("发生错误: " + ex.getMessage()); } } }这段代码初始化了翻译服务,设置从美式英语翻译到德语、法语和中文。它通过麦克风捕获语音,并打印出识别出的原文及各语言的翻译结果。
-
运行与测试
运行程序,对着麦克风说话(例如:“Hello, how are you?”)。控制台将输出识别出的英文文本及其对应的多语言翻译。
总结

本节课中我们一起学习了Azure的语音翻译服务。我们了解了它的应用场景,知道了它与之前服务的区别在于必须使用SDK进行开发。通过一个简单的Java程序示例,我们实践了如何配置服务并从麦克风输入语音,实时获得多语言翻译文本。这为构建跨语言沟通应用提供了基础。
007:语言服务 🧠
在本节课中,我们将要学习Azure认知服务中的语言服务。语言服务能够帮助我们的应用程序理解非结构化文本的含义,并提供了多种强大的功能,例如情感分析、文本翻译和语言理解等。我们将逐一探索这些服务,并通过实际操作来理解它们的工作原理。
上一节我们介绍了语音识别服务,本节中我们来看看认知语言服务。
在实际场景中,我们经常会遇到需要处理用户评论或留言的情况。在特定时刻,我们很难快速判断这些文本是积极的还是消极的。因此,如果我们能将这些用户评论通过某种服务进行分析并得出情感倾向,那将非常有用。Azure提供了一系列服务来满足这类需求。即使我们想创建类似Alexa或Siri这样的电子助手服务,Azure也能提供帮助。
为了解决这些需求,Azure认知服务提供了语言服务。让我们开始了解Azure认知服务语言API如何帮助你的应用程序理解非结构化文本的含义。Azure主要提供了五种类型的语言服务。
以下是Azure语言服务的五大核心功能:
- 情感分析:自动检测所传入文本中的情感和观点。
- 翻译器:检测并翻译超过100种支持的语言和方言。
- 语言理解 (LUIS):帮助我们将自然语言理解功能构建到应用程序、机器人和物联网设备中。
- 实体识别:帮助我们从传入的文本中识别常用术语和特定领域的术语。
- 问答制作器:将信息提炼成易于导航的问答形式。


情感分析服务 😊😐😠

首先,我们来了解语言类别下的第一个服务:情感分析。你可以使用这项服务从文本中提取信息,找出所传入文本的情感倾向。
想象你是一家电子商务网站的店主。了解客户对你所售产品的感受对你的业务至关重要。通过情感分析,你可以发现客户是满意还是不满意,并立即采取行动。此外,该服务还可以从文本中提取关键短语,这些短语可能包括公司或事件的名称。情感分析API还能识别你传入文本的语言,这一点非常重要,因为知道了文本语言后,你可以将其传递给翻译器服务进行翻译。最后,它还能从文本中提取命名实体,包括人物、组织、名人和著名地点等名称。
在Azure平台上的实践操作
我们不需要一直使用Postman来调用API,因为对于情感分析乃至整个Azure语言服务,Azure提供了一个完全不同的平台来访问这些服务。该平台最终也会提供如何通过URL访问这些服务的方法,因此我们无需深入研究大量文档,只需前往该平台创建服务并开始使用即可。
这是我的Azure页面,我已经选择了认知服务产品。向下滚动,我们在左侧找到了语言服务。点击进入后,可以看到语言服务下的各项服务。我在这里选择情感分析服务。
进入我的分析服务页面后,向下滚动可以看到一个“演示”部分,但演示中只有一些视频。因此,我将转到文档部分。
在文档中,有一个快速入门指南。Azure提供了一个名为“语言工作室”的平台,我们将在这个平台上试验这项服务,因为它提供了比之前使用的Azure界面更简单的操作方式。我在新标签页中打开它。
首次访问语言工作室时,你需要创建一些凭证,登录你的Azure账户,然后选择免费或付费定价层。创建完成后,系统会要求你创建一些资源。我们不会创建新的,直接使用现有资源。向下滚动,找到“分析文本”服务,点击进入。
在试用部分,系统提示我们选择首选语言,我选择英语。这是我首次登录语言工作室时创建的Azure资源,其创建方式与在Azure门户中创建资源类似。
现在,我们需要输入一些文本来测试。有两种方式可以操作。首先,我输入一句话:“I went I like the food.” 然后点击运行服务。
服务将以两种方式提供结果:第一种是更易于用户阅读的常规结果;第二种是JSON格式的结果,当我们通过URL发送实际请求时会得到这种格式。结果显示,我们传入的句子有94%是积极的,5%是中性的,1%是消极的。它甚至指出了我们谈论的内容:评估对象是“food”,评估是“like”。
如果你想尝试更多文本,可以点击“尝试示例”。示例文本描述了一次就餐体验,其中包含一些负面句子,但整体段落是积极的。运行评估后,结果显示86%是积极的,14%是消极的。你可以查看每个句子的评估目标和情感倾向。例如,最后一个负面句子的评估是“The only complaint I have is the food didn‘t come fast enough.” 这就是情感分析服务的工作方式。
如果想查看JSON格式的结果,可以切换到JSON视图。结果显示这是一个混合情感的句子,并给出了置信度分数。例如,第一个负面情感是关于食物上得慢的抱怨,第二个正面情感是“Overall I highly recommended”。
如果你想通过REST API访问这些服务,可以看到这里定义了cURL POST命令。由于服务运行在美国东部区域,端点类似 https://eastus.api.cognitive.microsoft.com/...。我们可以复制这个命令到Postman中使用。请求头中需要设置 Content-Type: application/json 和 Ocp-Apim-Subscription-Key(你的密钥)。在请求体中传入JSON格式的文本数据。发送请求后,我们得到了200 OK响应和相应的分析结果。这就是情感分析服务的工作原理。


翻译器服务 🌐

接下来介绍语言服务类别下的第二个服务:翻译器服务。我们对其功能已经有了很好的了解。
首先,你可以使用该服务检测文本的语言。检测语言非常重要。检测到语言后,你可以继续将文本传递给该服务下的另一个API,即文本翻译API。这个API接收文本并将其翻译成目标语言。该服务还允许你获取其他语言短语的发音。我们稍后会看一个例子。
翻译器文本API非常适合日常场景。然而,你也可以创建自定义的翻译器服务,针对你的特定领域或行业进行定制。因为一些翻译模型可以很容易地使用非结构化文档(如手册或网站)来创建或训练。我们也会看一下这部分。
在接下来的实践环节,我将向你展示这项服务具体如何工作,如何部署翻译器服务,以及我们如何实际使用它。我还会带你了解翻译器服务的文档。
这是我的Azure页面,我已经打开了Azure认知服务。向下滚动到底部,我们可以看到认知服务部分提供的不同服务。在语言部分,我寻找并选择“翻译器”。
这是翻译器服务的概览页面。现在我们需要查看其文档。我点击打开文档。
这是Azure翻译器服务的整体文档,提供了不同种类的文档说明。现在,我需要部署一个服务并开始使用。
为此,我将在左侧的“文本翻译”下选择“参考”部分。然后我们将使用API,这里我选择文本翻译REST API。
这是我的文本翻译API页面。同时,Azure门户也打开了。这里已经有一个我之前创建的翻译器服务。我们也可以创建一个新的服务。我搜索“翻译器”,然后点击“创建”。
选择资源组,我使用第一个资源组。然后选择区域,我使用“美国东部”。服务名称定为“SampleTranslator”。接着选择定价层,由于这里不提供免费层,我选择“标准S1”层。点击“查看 + 创建”,系统正在验证我的配置。确认无误后,点击“创建”。
在服务创建期间,我们回到文档部分。这是文本翻译的参考页面,我们有“获取语言”和“翻译”等选项。我们将只使用翻译部分。向下滚动到快速入门,我选择“翻译”。
这是我的主要翻译URL,我将复制它并在Postman中使用。我打开Postman,粘贴URL。我的API版本是3.0。
现在我们需要定义一些请求参数。一个是API版本,我们已经添加了。我们还需要定义目标语言,我选择“de”(德语)。还有其他可选参数,我们暂时不使用。

接下来是请求头部分。这有点复杂。我在新标签页中打开头信息示例。复制 Content-Type: application/json 并粘贴到Postman的Headers中。然后我们需要查看认证部分,它提到了 Ocp-Apim-Subscription-Key。我复制我的订阅密钥并粘贴到Header中。我们之前也复制过订阅密钥,都知道如何获取:在Azure中选择服务,然后进入“密钥和终结点”。
我们还需要在Header中定义订阅区域,因为我们在美国东部区域工作,所以添加 Ocp-Apim-Subscription-Region: eastus。我们目前没有任何持有者令牌,所以不需要授权头。
现在我们需要一些文本内容。可以从文档中复制一个示例。转到Body部分,选择“raw”,类型为JSON,粘贴示例文本。注意,请求方法需要是POST。发送请求。
如你所见,它首先完成了语言检测,指出文本是英语,置信度为1。然后它为我们进行了翻译。这就是这项服务的工作原理。为了验证它工作正常,我可以复制翻译后的德语文本,将其作为输入,目标语言改为“en”(英语),再次发送请求。结果显示检测到的语言是德语,并成功翻译回了英语,文本内容与最初传入的相同。这就是翻译器服务的工作方式。
语言理解服务 (LUIS) 🤖
在翻译器服务之后,语言类别下还有一个极其有用的服务,称为语言理解服务,也常被称为LUIS。
这项服务可以帮助我们从文本输入中提取内容,进而用于许多其他有用场景,例如为我们创建语音助手。借助LUIS,我们可以尝试从传入的实际上下文中提取短语。
例如,有一个用户发出“打开灯”或“关闭灯”的命令。在没有机器学习或智能助手的情况下,我们必须为应用程序编写硬编码的逻辑。但即便如此,如果用户的输入有细微变化,例如有人说“请把灯关掉”,应用程序可能还能处理。但如果有人说“把灯调暗”,我们就必须确保我们的硬编码逻辑能够理解人们可能使用的所有表达方式,这并不容易。
LUIS可以帮助我们解决这个问题。在LUIS中,我们创建一组高度可定制的模型。模型创建后,我们训练它们,然后部署这些模型供我们使用。为了让我们更轻松,Azure提供了LUIS门户,通过它我们可以更容易地完成这些工作。在LUIS门户中,我们只需要传入我们的JSON数据,通过这些数据就可以创建出模型。
在本节中,我们将进行实践操作:我将创建一个Python应用程序,通过它创建一个模型,然后让该模型在LUIS服务上进行训练和发布,接着我们将传入一段文本,尝试从中提取某些上下文。
为此,我将创建一个Python应用程序。在本节中,我们只创建应用程序;在下一节,我将进入LUIS门户,从那里获取凭证并传入我们的应用程序,向你展示应用程序如何工作。
现在我将使用Visual Studio。首先创建一个目录,命名为“quicksstart”。进入该目录,创建一个Python文件。
现在我需要安装一些库。我将安装一些Azure基础库。使用pip命令安装 azure-cognitiveservices-language-luis 等库。安装完成后,我们就可以开始使用了。
我打开文件夹,选择“quicksstart”目录。这里可以看到一些文件。现在我需要添加一些依赖项。我将从 azure.cognitiveservices.language.luis.authoring 导入 LUISAuthoringClient,并从 azure.cognitiveservices.language.luis.runtime 导入 LUISRuntimeClient。同时还需要导入 msrest.authentication 进行认证。
之后,还需要导入 json、time 和 uuid。
依赖项导入完成后,我们开始构建代码。首先定义一个 quickstart 函数。在函数内,创建一些变量,如 authoring_key(暂时为空,将从LUIS门户获取)、authoring_endpoint、prediction_key 和 prediction_endpoint。
接着,使用 uuid 生成一个唯一ID,与基础应用名拼接,以避免名称冲突。版本ID设为“0.1”。意图名称设为“OrderPizza”。
然后,使用 CognitiveServicesCredentials 和 authoring_key 授权创建 LUISAuthoringClient。用这个客户端和 app 名称、版本ID 来创建应用,并获取 app_id。
之后,使用 client.model.add_intent 添加我们定义的意图。接着,添加实体(entities)。我们添加一个机器学习实体定义,包括“PizzaOrder”以及其子实体如“数量”、“大小”、“类型”和“配料”。同时,创建一个短语列表以提升实体识别。
然后,添加带标签的示例话语(labeled example utterances)。这些示例将意图与实体关联起来,用于训练模型。例如:“I want to order a large pizza with extra cheese.” 其中,“large” 被标记为“大小”实体,“extra cheese” 被标记为“配料”实体。
添加完示例后,调用 client.train.train_version 开始训练模型。我们使用一个while循环来检查训练状态,每隔10秒查询一次,直到所有模型训练完成。
训练完成后,调用 client.apps.update_settings 将 is_public 设为 True,然后调用 client.apps.publish 发布该版本的应用。
发布后,我们使用 prediction_key 和 prediction_endpoint 创建 LUISRuntimeClient。然后,使用这个运行时客户端,通过 prediction.get_slot_prediction 方法传入一个测试查询(例如:“I’d like to order two small pizzas with more salsa.”)来获取预测结果。
最后,打印出预测结果中的顶级意图及其置信度,以及识别出的所有实体。完成后,我们调用 client.apps.delete 清理资源,删除创建的应用。
这就是使用Python应用程序创建LUIS应用的基本流程。我们创建了多个函数:第一个用于创建应用,之后基于此创建和训练模型,然后发布模型,最后传入测试短语进行预测。
这是我的LUIS门户。如你所见,我已经登录并创建了一个名为“PizzaApp”的应用。你可以通过点击“新建应用”来创建应用,输入应用名称并选择区域(我使用了“美国西部”区域)。
进入我的PizzaApp应用。目前还没有创建任何意图。但有一个“管理”部分。进入“管理”部分,我们可以获取所需的密钥和终结点。这里有预测资源和创作资源的主密钥,以及终结点URL。由于我们使用的是美国西部区域,创作和预测资源的终结点URL是相同的。
我已经在我的应用程序中进行了相应的更改,添加了密钥。现在,我只需要运行我的应用程序。我选择运行选项卡,然后选择“开始执行(不调试)”。

现在可以看到终端打开了。它正在运行Python应用程序。它显示正在使用特定ID创建LUIS应用程序。然后,基于我们创建的带标签的示例话语,它正在为我们创建和训练模型。它说正在等待10秒以训练模型。
之后,它显示模型已训练完成。然后,它显示我们的意图是“OrderPizza”。基于我们传入的查询(“我想要一个小号披萨”),它说用户情感为“无”,但意图是订购披萨。最终,它清理了我们的应用程序并将其删除。

这就是如何使用基本的Python应用程序创建LUIS应用。如果需要,我们也可以在仪表板中创建特定的模型,然后通过仪表板训练它们,最后发布并通过REST API开始使用。这就是LUIS应用程序的工作方式。


本节课中我们一起学习了 Azure认知服务中的语言服务,包括情感分析、翻译器和语言理解(LUIS)三大核心服务。我们了解了每项服务的基本概念、应用场景,并通过实际操作在Azure语言工作室和本地Python环境中体验了服务的使用流程。这些服务能够极大地增强应用程序处理和理解自然语言的能力。
008:实体识别服务 🧠
在本节课中,我们将学习Azure认知服务中的实体识别功能。我们将了解其核心概念,并通过一个Java Spring Boot应用实例,演示如何调用该服务从文本中提取关键信息。

概述
实体识别服务是Azure认知服务中语言服务的一部分。它利用云端的机器学习和算法,帮助开发者构建涉及书面语言的智能应用。该功能的主要作用是识别并分类非结构化文本中的实体,例如人物、地点、组织、数量、日期范围和事件等。
上一节我们介绍了认知服务的整体框架,本节中我们来看看如何具体使用其中的实体识别功能。
创建Java Spring Boot应用
我们将创建一个基于Spring Boot的Java应用程序。Spring Boot能帮助我们更轻松地管理项目依赖。
以下是创建项目的基本步骤:
- 选择创建一个新的Spring Starter项目。
- 将项目命名为
EntityRecognition。 - 完成项目创建,等待基础结构生成。
项目创建完成后,我们需要在 pom.xml 文件中添加必要的依赖。
配置项目依赖
为了使用Azure的文本分析服务,我们需要在 pom.xml 中添加相应的依赖库。
以下是需要在 pom.xml 的 <dependencies> 部分添加的内容:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-textanalytics</artifactId>
<version>5.1.0</version>
</dependency>
添加依赖后保存文件,项目会自动构建。
编写应用程序代码
现在,我们开始编写主要的应用程序逻辑。首先,我们需要从Azure门户获取访问服务所需的密钥和终结点URL。
1. 声明静态变量
在 main 方法所在的类中,声明两个静态变量来存储密钥和终结点。
private static String KEY = “你的Azure服务密钥”;
private static String ENDPOINT = “你的Azure服务终结点URL”;
2. 创建文本分析客户端
在 main 方法中,我们需要创建 TextAnalyticsClient 的实例来与服务进行身份验证和通信。
public static void main(String[] args) {
TextAnalyticsClient client = authenticateClient(KEY, ENDPOINT);
recognizeEntitiesExample(client);
}
3. 实现身份验证方法
创建一个名为 authenticateClient 的方法来构建并返回客户端实例。
static TextAnalyticsClient authenticateClient(String key, String endpoint) {
return new TextAnalyticsClientBuilder()
.credential(new AzureKeyCredential(key))
.endpoint(endpoint)
.buildClient();
}
4. 实现实体识别方法
创建一个名为 recognizeEntitiesExample 的方法,用于发送文本进行分析并打印结果。
static void recognizeEntitiesExample(TextAnalyticsClient client) {
String textToAnalyze = “I would be traveling to China next week.”;
for (CategorizedEntity entity : client.recognizeEntities(textToAnalyze)) {
System.out.printf(
“实体: %s, 类别: %s, 子类别: %s, 置信度: %.2f, 偏移量: %d, 长度: %d%n”,
entity.getText(),
entity.getCategory(),
entity.getSubcategory(),
entity.getConfidenceScore(),
entity.getOffset(),
entity.getLength()
);
}
}
在Azure门户创建语言服务
在运行应用程序之前,我们需要在Azure门户上配置相应的认知服务资源。
以下是创建服务的步骤:
- 在Azure门户中,选择“创建资源”。
- 搜索并选择“语言服务”。
- 选择你的订阅和资源组。
- 将服务命名为
EntityRecognitionTest。 - 选择定价层(例如免费层
F0)。 - 审阅并创建服务。
- 部署完成后,进入该资源。
- 在“密钥和终结点”部分,复制 密钥1 和 终结点 URL,并粘贴到代码的静态变量中。
注意:免费层可能限制同时只能有一个同类型服务。如果创建失败,请检查是否已有其他免费服务在运行。
运行与结果分析
配置完成后,运行Spring Boot应用程序。控制台将显示应用程序启动日志。
稍等片刻,服务会连接到云端并返回分析结果。对于示例句子 “I would be traveling to China next week.”,输出可能如下:
实体: China, 类别: Location, 子类别: GPE, 置信度: 1.00, 偏移量: 23, 长度: 5
实体: next week, 类别: DateTime, 子类别: DateRange, 置信度: 0.80, 偏移量: 29, 长度: 9
结果解读:
- China 被识别为
Location(地点)类别,子类别是GPE(地缘政治实体),置信度得分为1.00(即100%确定),在文本中从第23个字符开始,长度为5。 - next week 被识别为
DateTime(日期时间)类别,子类别是DateRange(日期范围),置信度得分为0.80(即80%确定),在文本中从第29个字符开始,长度为9。
总结

本节课中我们一起学习了Azure认知服务的实体识别功能。我们了解了该服务可以自动从文本中提取并分类关键实体。通过一个完整的Java Spring Boot项目实践,我们掌握了如何配置Azure资源、添加SDK依赖、编写代码调用服务,并成功从示例句子中识别出了地点和日期范围实体。这个功能是构建智能文本处理应用的重要基础。
009:问答生成器概述 🧠
在本节课中,我们将学习Azure认知服务中语言服务系列的最后一个功能——问答生成器。我们将了解它的作用、工作原理,并动手实践如何创建一个基于Python的问答应用。
概述
我们经常花费大量时间浏览网站上的问答页面,但有时仍然难以找到问题的答案。在语言认知服务系列的最后部分,我们将介绍问答生成器服务。这是语言认知服务提供的最后一项功能,其中“Q”代表问题,“A”代表答案。该服务可用于基于我们的数据创建问答对。这些数据也可以是非结构化的。我们可以从不同的网站、PDF文件、Word文档、Excel CSV文件和文本文件中获取非结构化数据集。基于这些数据集,服务会创建自己的问答知识库。我们也可以创建自己特定的问题集及其答案,并基于此生成知识库。
那么,我们能用这一堆创建好的知识库做什么呢?问答生成器通过一个完整的API提供所有这些问答对。用户或你自己可以提出问题,如果问题在知识库中找到,答案将返回给用户。这项服务的美妙之处在于其背后运行的机器学习逻辑。用户的问题不需要与知识库中的问题完全匹配,具有相同含义的问题也会得到相同的答案。
创建问答生成器应用
上一节我们介绍了问答生成器的概念,本节中我们来看看如何使用Python语言创建一个问答生成器应用。在此之前,我需要先安装一些依赖项。
以下是安装所需依赖的命令:
pip install azure-ai-language-questionanswering
现在,在问答项目部分,我在这里创建了我的文件。我创建了一个名为QA的项目,其中有一个名为q_and_a.py的Python文件。我将创建一个函数。
首先,我们需要导入一些必要的模块:
import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.language.questionanswering import QuestionAnsweringClient
导入完成后,我需要创建一些本地变量。
我将定义一个名为endpoint的变量,用于存储从Azure门户获取的相应端点。其次,我们还需要密钥。
endpoint = "你的Azure服务端点"
key = "你的Azure服务密钥"
一旦这些准备就绪,我们就可以看看如何创建客户端。
client = QuestionAnsweringClient(endpoint, AzureKeyCredential(key))
现在,我们需要再创建一个变量来存放问题。
question = "手机充满电需要多长时间?"
接下来,我们需要创建输入。我们将考虑使用基本文本来提供某些信息。
input = {
"question": question,
"records": [
{
"id": "1",
"text": "这里是你的样本文本内容。例如:使用电源充电,手机电池从空电状态充满需要三到五个小时。"
}
]
}

之后,我们需要调用一个新变量来获取输出。
output = client.get_answers(input)
我们将根据置信度打印答案。我们之前已经讨论过置信度这个概念。
if output.answers:
best_answer = max(output.answers, key=lambda x: x.confidence)
print(f"答案: {best_answer.answer}")
print(f"置信度: {best_answer.confidence}")
else:
print("未找到答案。")
这样,我们就创建了一个应用程序,它很可能可以运行。
在Azure门户配置服务

现在,让我们转到Azure门户来创建我们的语言服务。
- 选择“自定义问答”服务。
- 点击“继续创建资源”。
- 确保选择了正确的订阅。
- 选择资源组(可以使用之前一直使用的同一个)。
- 为服务命名,例如
QnA112。 - 选择定价层。
- 查看并接受条款与条件。
- 在网络、身份和标签部分,通常无需更改,直接点击“下一步:查看 + 创建”。
- 验证通过后,点击“创建”。
服务部署通常不会花费太长时间。在等待部署时,我可以展示一下我们添加的文本样本。
样本文本内容:
“使用电源充电,手机电池从空电状态充满需要三到五个小时。如果你在充电时使用手机进行游戏、视频流媒体等高耗电活动,充电时间可能会更长。你可以使用手机电源适配器上的USB端口为其他设备(如另一部手机)充电。”

基于这个样本文本,我将回答用户的问题。现在,让我们回到服务列表,看看是否创建成功。
部署完成后,我们需要获取密钥和端点。


- 进入创建好的资源。
- 在“密钥和终结点”部分,复制
密钥1和终结点。

回到我们的代码,将复制的密钥和终结点粘贴到相应的变量中。


endpoint = "粘贴你的终结点URL"
key = "粘贴你的密钥"
现在服务已经准备就绪。
运行与测试应用
回到我的系统,选择运行程序(无需调试)。让我们看看会发生什么。
我们提出的问题是:“手机充满电需要多长时间?”
程序返回的答案是:“使用电源充电,手机电池从空电状态充满需要三到五个小时。如果你在充电时使用手机进行游戏、视频流媒体等高耗电活动,充电时间可能会更长。” 同时,也给出了置信度。
现在,让我问一个样本文本中没有涉及的问题:“手机是什么颜色的?”
这个问题在我们的文本中没有定义。运行程序后,由于找不到相关信息,可能会返回错误或空答案。
再问一个文本中可能涉及的问题:“电源适配器是什么?”
运行后,我们得到了答案:“电源适配器上的USB端口仅用于充电,不用于数据传输。”
这就是Azure问答服务的工作方式。如果我当初将置信度阈值设置得更低(比如大于0.5而不是0.9),那么我们针对不同问题可能会得到更多答案。这就是Azure问答服务的工作原理。我们需要确保在Azure门户创建好服务,然后就可以基于它创建应用程序并使用它了。
总结

本节课中,我们一起学习了Azure认知服务中的问答生成器。我们了解了它如何从结构化或非结构化数据创建知识库,并通过机器学习理解问题语义来提供答案。我们逐步实践了如何使用Python SDK创建问答客户端,如何在Azure门户配置自定义问答资源,以及如何运行和测试问答应用。关键在于准备好数据、获取服务的终结点和密钥,并理解置信度在答案筛选中的作用。
010:认知决策服务 🧠
在本节课中,我们将要学习Azure认知服务中的“决策”服务。决策服务旨在帮助你的应用程序快速做出明智的判断。接下来,我们将深入了解这一类别下的具体服务。
概述
决策服务包含一系列工具,它们能协助应用程序处理内容、检测异常并进行个性化推荐。本节课程将重点介绍其中的内容审查服务,并通过一个Java应用示例,展示如何对文本和图像进行自动化审查。
服务简介
决策类别下主要提供三项服务:
- 内容审查器:用于过滤文本、图像和视频中的不良内容。
- 异常检测器:用于识别时间序列数据中的异常点。
- 个性化推荐器:用于根据用户行为提供个性化的内容或产品推荐。
在接下来的部分,我们将首先深入探讨内容审查器服务。
内容审查器详解 📝

上一节我们介绍了决策服务的整体框架,本节中我们来看看第一个核心服务——内容审查器。你可以利用此服务过滤可能存在的亵渎或不雅文本,检测潜在的冒犯性和不良图像,并对视频中的成人及挑逗性内容进行审查。
这为许多应用场景提供了解决方案。例如,在开发聊天应用时,可以集成此服务以确保成员间不会传播不良文本。同样,对于在线照片或视频库,它可以自动检查上传内容,防止传播冒犯性、不良或成人内容。
该服务的功能不仅限于此。它还能识别个人身份信息。与我们之前在语言服务中看到的文本PII识别类似,内容审查器可以对图像和视频中的文本进行识别。
与其他认知服务一样,内容审查器也提供一定程度的自定义功能。许多公司倾向于采用“人在回路”的模式,即当文本、图像或视频被标记为不良内容时,由人工审核员来最终批准或否决该判断,这可以通过人工审核工具来实现。
现在,让我们更详细地了解这项服务的具体功能。
文本审查
你可以使用内容审查器来过滤可能的亵渎和不雅文本。它还能用于在文本内容中查找个人身份信息,例如姓名、电子邮件、电话号码、社会安全号码、银行卡号等。
该服务还有一个很酷的功能:它能处理故意拼写错误的脏话(例如,用感叹号代替字母“i”,或用星号代替某些字符)。内容审查器足够智能,可以对传入的文本内容执行自动校正。虽然校正并非100%准确,但效果值得期待。
图像审查
在图像方面,该服务可以检测潜在的冒犯性和不良图像,并为我们标记出来。它还有一个强大的功能:能够识别图像中的文字。服务会对图像执行OCR(光学字符识别),提取其中的文本,然后对该文本执行内容审查。
这是一个非常强大的工具。接下来,我们将通过实践来学习如何使用它。
构建内容审查应用 💻
前面我们了解了内容审查器的理论功能,本节我们将动手构建一个Java应用程序。我们将通过这个应用传递一些文本和图像,并观察服务如何过滤其中的特定内容。本次实践将涵盖两个主要部分:文本处理流程和图像处理流程,暂不实现人工审核工具。
项目初始化与依赖配置
在本小节,我将创建第一个审查应用。我会新建一个Spring Starter项目,将其命名为 AzureCognitiveModerator。初始化时,我不选择任何预定义的JAR包或依赖。
项目创建完成后,需要在 pom.xml 文件中添加必要的依赖声明。
以下是项目所需的关键依赖:
- Azure内容审查器SDK:用于调用审查器服务。
- Gson:用于处理JSON数据序列化与反序列化。
- FasterXML Jackson Core:用于高效的JSON处理。
添加依赖后,我们需要定义一些必要的配置信息,例如审查URL、订阅密钥和服务终结点。这些信息可以从Azure门户获取。
核心代码结构
首先,创建一个 EvaluationData 类,用于封装审查结果。这个类需要包含以下字段:
imageUrl:被审查图像的URL。evaluation:审查评估结果。ocrText:从图像中识别出的文本。foundFaces:检测到的人脸信息。
接下来,创建 ContentModeratorClient 客户端并进行身份验证。这需要用到之前配置的终结点和订阅密钥。
然后,我们创建核心的审查方法。主要分为两个函数:
moderateImage:用于处理图像审查。moderateText:用于处理文本审查。
在 moderateImage 方法中,我们将依次调用服务评估图像的成人/挑逗内容、进行人脸检测以及执行OCR文本识别。每次调用后,会添加短暂的线程睡眠以确保调用顺序。审查结果会被收集到一个列表中。
在 moderateText 方法中,我们将读取一个文本文件,调用文本审查API,并分析返回的结果,例如是否包含PII信息。
最后,使用 BufferedWriter 和 Gson 库将审查结果(无论是图像还是文本)以JSON格式写入到本地文件 moderation_result.json 中,以便查看。
运行与结果分析
配置好订阅密钥和终结点后,即可运行应用程序。程序启动后,会依次执行图像审查和文本审查。
对于文本审查,如果传入的文本包含测试语句、电子邮件、电话号码和地址,服务会对其进行标准化处理,并提取出其中的PII信息(如邮箱、国家、手机号),在结果文件中清晰列出。
对于图像审查,服务会分析指定的图像URL。它不仅评估图像内容,还会通过OCR提取图像中的文字进行审查,并尝试检测图像中是否存在人脸。所有这些详细信息都会输出到结果文件中。
通过这个实践,我们直观地看到了Azure内容审查器服务如何自动化地处理文本和图像内容审查。
总结

本节课中,我们一起学习了Azure认知决策服务,并重点深入了内容审查器。我们了解了其三大功能:文本过滤、图像审查和视频审查,并通过一个完整的Java Spring Boot应用示例,实践了如何集成该服务对文本和图像进行自动化内容审查与PII信息识别。这为构建安全、合规的应用程序提供了强大的支持。在后续课程中,我们将继续探讨决策服务中的其他工具。
011:异常检测器概述 🎯
概述
在本节课中,我们将学习Azure认知服务中的异常检测器。我们将了解它的定义、工作原理、应用场景,并通过一个Python示例来演示如何创建和运行一个异常检测应用。
什么是异常检测器?🔍
上一节我们介绍了Azure认知服务家族,本节中我们来看看异常检测器。
异常检测器是一项认知服务。它使你能够使用机器学习来监控和检测时间序列数据中的异常。
这里需要澄清,时间序列数据是按时间顺序索引的一系列数据点。你很可能以数据流的形式接收这些时间序列。
以下是时间序列数据的几个例子:
- 热传感器收集的数据(可能来自热电厂或核电厂)。
- 从一级方程式赛车引擎收集的数据。
- 从不同连接的物联网设备收集的数据。

异常检测器的作用是:它会从数据的正常模式中学习,并基于现有数据范围得出一个所谓的“正常数据范围”。之后,如果有新的数据系列到来,它会根据之前用于绘制正常数据范围的数据流,尝试在这个新的数据流中发现异常。
为什么异常检测至关重要?⚠️
异常检测在某些场景中至关重要。在这些场景中,我们需要根据数据在几秒甚至微秒内做出响应。
以下是几个关键场景:
- 赛车场景:我们接收赛车引擎的RPM数据。如果维修区的团队成员发现存在异常,而车手继续驾驶,可能导致严重的发动机或变速箱问题。此时需要立即通知车手。
- 核电站场景:如果核电站的温度在几秒钟内超过允许极限,必须发出警报并通知技术人员。即使几秒钟的延迟也可能是灾难性的。
- 股票市场场景:如果你接收股票市场价格数据,当价格跌破预期下限时,你可能希望买入股票。
- 数据库安全场景:如果你在Azure中托管一个数据库实例,该数据库通常只接受来自特定IP地址的流量。如果突然收到来自未知IP的请求,这实际上就是一种异常,可能构成安全威胁,需要处理。事实上,Azure SQL数据库提供了一个高级数据保护计划,它在底层进行异常检测以发现此类安全异常。
异常检测的两种模式 ⚙️
上一节我们了解了异常检测的重要性,本节中我们来看看它的具体工作模式。
异常检测服务可以执行两种主要模式,并且有对应的不同端点。
以下是两种模式的介绍:
- 流模式:该服务将学习先前数据,以判断最后一个数据点是否为异常。这是你应该用于实时数据的模式,它的性能更高、更准确。
- 批处理模式:该模式作用于数据中的所有数据点。假设你有一整年的数据,你想将其传递给服务并获取该数据集中的所有异常,你应该使用批处理模式。
需要注意的是,批处理服务不应用于实时数据。对于实时数据,你应始终根据需求使用流模式。
创建第一个异常检测应用(Python)🐍
在接下来的部分,我们将使用Python创建第一个异常检测器应用程序。
环境与依赖设置
在开始编码之前,我将使用Jupyter Notebook,因为它便于绘图,并且对于新手来说编码更简单。
首先,我们需要添加一些依赖项并导入所需的库。
以下是需要导入的库:
# 导入Azure异常检测器相关库
from azure.ai.anomalydetector import AnomalyDetectorClient
from azure.ai.anomalydetector.models import DetectRequest, TimeSeriesPoint, APIError
from azure.core.credentials import AzureKeyCredential
# 导入数据处理与可视化库
import pandas as pd
import numpy as np
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource
import datetime
from dateutil import parser
import ipywidgets as widgets
初始化配置与客户端
现在,我将设置订阅密钥和异常检测端点,并创建客户端连接。
# 定义订阅密钥和端点
subscription_key = "你的订阅密钥"
endpoint = "你的服务端点"
# 创建客户端
credential = AzureKeyCredential(subscription_key)
client = AnomalyDetectorClient(endpoint, credential)
构建绘图函数
一旦我们调用异常检测器并获得结果,我们需要绘制图表。为此,我将创建一个绘图函数。
def plot_graph(result, sample_data, sensitivity):
"""
根据异常检测结果绘制图表。
:param result: 异常检测返回的结果对象
:param sample_data: 原始时间序列数据
:param sensitivity: 检测敏感度
"""
# 从结果中提取数据
expected_values = result.expected_values
is_anomaly = result.is_anomaly
is_negative_anomaly = result.is_negative_anomaly
is_positive_anomaly = result.is_positive_anomaly
upper_margins = result.upper_margins
lower_margins = result.lower_margins
# 提取时间戳和值
timestamps = [point.timestamp for point in sample_data.series]
values = [point.value for point in sample_data.series]
# 创建图表
p = figure(x_axis_type="datetime", title=f"Anomaly Detection (Sensitivity: {sensitivity})", height=400, width=800)
p.xaxis.formatter = DatetimeTickFormatter(days="%m/%d", months="%m/%Y")
# 绘制预期值线
p.line(timestamps, expected_values, legend_label="Expected Value", line_width=2, color='navy')
# 绘制上下边界带
upper_band = [exp + margin for exp, margin in zip(expected_values, upper_margins)]
lower_band = [exp - margin for exp, margin in zip(expected_values, lower_margins)]
band_x = np.append(timestamps, timestamps[::-1])
band_y = np.append(upper_band, lower_band[::-1])
p.patch(band_x, band_y, color='navy', alpha=0.2, legend_label="Normal Range")
# 标记异常点
anomaly_indexes = [i for i, anomaly in enumerate(is_anomaly) if anomaly]
anomaly_times = [timestamps[i] for i in anomaly_indexes]
anomaly_values = [values[i] for i in anomaly_indexes]
p.circle(anomaly_times, anomaly_values, size=8, color='red', legend_label="Anomaly")
# 显示图例和图表
p.legend.location = "top_left"
show(p)
创建异常检测函数
接下来,我将创建核心的异常检测函数,它将调用Azure服务并返回结果。
def detect_anomaly(sample_data, sensitivity, skip_points=29):
"""
调用异常检测器服务。
:param sample_data: 时间序列数据(TimeSeriesPoint列表)
:param sensitivity: 敏感度,建议85-99
:param skip_points: 跳过的初始数据点数,用于训练
:return: 检测结果
"""
# 设置数据粒度(例如:每天)
granularity = "daily"
# 准备请求
request = DetectRequest(
series=sample_data.series,
granularity=granularity,
sensitivity=sensitivity,
max_anomaly_ratio=0.25,
custom_interval=1
)
# 调用服务进行检测(这里以批处理模式为例)
# 注意:对于流式数据,应使用 `detect_last_point` 方法
response = client.detect_entire_series(request)
return response
运行与测试应用
最后,我将配置密钥,准备示例数据,并运行整个流程来可视化异常。
# 1. 准备示例时间序列数据(这里用简单示例代替,实际应从文件或API获取)
# 示例:创建包含一个异常点的数据
timestamps = []
values = []
base_date = datetime.datetime.now()
for i in range(100):
timestamps.append(base_date + datetime.timedelta(days=i))
# 大部分是正常值,在第75天插入一个异常高值
value = 50 + np.random.randn() * 5
if i == 75:
value = 120 # 异常点
values.append(value)
series_points = [TimeSeriesPoint(timestamp=ts, value=val) for ts, val in zip(timestamps, values)]
# 2. 封装数据
class SampleData:
def __init__(self, series):
self.series = series
sample_data = SampleData(series_points)
# 3. 设置敏感度并运行检测
sensitivity = 95
result = detect_anomaly(sample_data, sensitivity)
# 4. 绘制结果图表
plot_graph(result, sample_data, sensitivity)
运行上述代码后,你将看到一个图表。图表中会显示预期值线、正常范围区域,并用红点标记出检测到的异常。
你可以调整 sensitivity 参数(例如从95改为85)并重新运行,观察检测结果如何变化。敏感度越高,对偏差越敏感,可能检测到更多异常;敏感度越低,则对轻微偏差更宽容。
总结
本节课中,我们一起学习了Azure认知服务中的异常检测器。
我们首先了解了异常检测器的定义及其对时间序列数据的监控能力。接着,探讨了它在赛车、核电、金融和安全等关键场景中的重要性。然后,我们分析了其两种工作模式:流模式适用于实时数据,而批处理模式适用于历史数据分析。
最后,我们通过一个完整的Python示例,演示了如何设置环境、初始化客户端、创建绘图函数、调用异常检测API以及可视化结果。你学会了如何通过调整敏感度参数来影响检测的严格程度。

通过本教程,你应该能够开始使用Azure异常检测器来监控自己的时间序列数据,并识别其中的异常模式。
012:决策个性化器概览 🧠
在本节课中,我们将学习Azure认知服务决策组下的最后一个服务:个性化器服务。该服务能基于用户实时行为,在多个选项中做出智能推荐。
个性化器服务简介
上一节我们介绍了决策组下的其他服务,本节中我们来看看个性化器服务。该服务帮助我们在多个事物之间做出选择,其依据是用户的实时行为体验。服务会计算用户的实时行为,并据此推荐最合适的操作。
想象我们有一个网站,需要在上面展示一系列广告。这些广告应该放在左上角、右上角、底部,还是其他位置?没有一种“银弹”解决方案适用于所有广告位,因为这取决于每个用户的个人偏好。那么,如何根据个体行为,将这些广告放置在网站的正确位置呢?这时,个性化器服务就派上用场了。
此服务将监控并学习用户的实时行为,然后将其用于未来的参考决策。
应用场景
以下是几个可以考虑的应用场景:
- 优化网站广告位:借助此服务,可以优化网站上广告的展示位置。
- 电商商品推荐:在电商网站(如亚马逊、eBay)上,基于用户之前的购买记录,持续推荐新产品。
- 新闻内容个性化:在新闻网站上,根据用户之前感兴趣的文章和主题,高亮并推荐相关文章。
实践:创建餐饮推荐应用

在接下来的课程中,我们将创建一个基于Python的应用程序。该程序将帮助用户决定下一餐吃什么。依据是用户之前吃过的餐食或其偏好。
例如,如果用户每天喜欢吃甜食,我们收集了相关数据集,服务就会推荐用户:如果想吃点甜的,可以尝试哪种冰淇淋;如果想吃点咸的,可以吃什么。服务将基于用户的历史经验创建一个模型,并根据该模型推荐下一餐的具体选择。
Azure实践:12.1:创建个性化器Python应用 🐍
在本节中,我将演示如何创建一个个性化器服务应用。我们将构建一个基于Python的程序,为用户建议下一餐可以吃什么。
环境准备
在开始编码之前,我们需要安装必要的依赖项。打开终端并执行以下命令:
pip install azure-cognitiveservices-personalizer
这将安装我们Python应用所需的依赖包。
创建应用文件
现在,创建一个Python应用文件:
# sample_application.py
导入依赖项
首先,导入所有必需的库和模块:
from azure.cognitiveservices.personalizer import PersonalizerClient
from azure.cognitiveservices.personalizer.models import RankableAction, RewardRequest, RankRequest
from msrest.authentication import CognitiveServicesCredentials
import datetime
import json
import uuid
import time
配置客户端
我们需要定义密钥和终结点来连接Azure云服务。这些值将在后续步骤中填充。
key = “” # 填入你的密钥
endpoint = “” # 填入你的终结点
使用密钥和终结点创建个性化器客户端:
client = PersonalizerClient(endpoint, CognitiveServicesCredentials(key))
创建示例数据
在服务开始工作之前,我们需要为其创建一些基础样本数据。基于这些数据,服务将学习并为用户提供餐食建议。
以下是创建“动作”(即餐食选项)的代码:
def get_actions():
actions = []
# 动作1: 披萨
actions.append(RankableAction(
id=“pizza”,
features=[
{“taste”: “salty”, “spice_level”: “high”, “nutrition”: 4, “cuisine”: “italian”}
]
))
# 动作2: 意大利面
actions.append(RankableAction(
id=“pasta”,
features=[
{“taste”: “salty”, “spice_level”: “medium”, “nutrition”: 6, “cuisine”: “italian”}
]
))
# 动作3: 冰淇淋
actions.append(RankableAction(
id=“ice_cream”,
features=[
{“taste”: “sweet”, “spice_level”: “none”, “nutrition”: 5}
]
))
# 动作4: 沙拉
actions.append(RankableAction(
id=“salad”,
features=[
{“taste”: “neutral”, “spice_level”: “none”, “nutrition”: 8}
]
))
return actions
获取用户时间偏好
接下来,创建一个函数来获取用户计划用餐的时间(例如,早晨、下午、夜晚)。
def get_user_time_of_day():
time_features = [“morning”, “afternoon”, “night”]
print(“At what time are you planning to have your meal? (0: morning, 1: afternoon, 2: night)”)
try:
time_idx = int(input())
if time_idx < 0 or time_idx >= len(time_features):
raise IndexError
selected_time = time_features[time_idx]
print(f“Option selected by the user: {selected_time}”)
return [{“time”: selected_time}]
except (ValueError, IndexError):
print(“Invalid input. Please enter a valid number.”)
return [{“time”: time_features[0]}]
获取用户口味偏好
然后,创建一个函数来询问用户想要甜味还是咸味的餐食。
def get_user_preference():
preference_features = [“sweet”, “salty”]
print(“What kind of meal do you want? (0: sweet, 1: salty)”)
try:
pref_idx = int(input())
if pref_idx < 0 or pref_idx >= len(preference_features):
raise IndexError
selected_pref = preference_features[pref_idx]
print(f“Preference selected: {selected_pref}”)
return [{“preference”: selected_pref}]
except (ValueError, IndexError):
print(“Invalid input. Please enter a valid number.”)
return [{“preference”: preference_features[0]}]
核心推荐逻辑
现在,我们将整合以上部分,创建主循环来获取推荐。
def main():
keep_going = True
while keep_going:
# 生成唯一事件ID
event_id = str(uuid.uuid4())
# 获取用户上下文(时间和口味偏好)
context = get_user_time_of_day() + get_user_preference()
# 获取所有可能的动作(餐食选项)
actions = get_actions()
# 构建排名请求
rank_request = RankRequest(actions=actions, context_features=context, excluded_actions=[“salad”], event_id=event_id)
# 调用服务获取排名
response = client.rank(rank_request)
# 打印每个动作的概率
print(“\nProbabilities for each action:”)
for ranked_action in response.ranking:
print(f” {ranked_action.id}: {ranked_action.probability:.2f}”)
# 打印推荐的动作
print(f”\nYou would like to have: {response.reward_action_id}”)
# 询问用户是否对推荐满意(此处简化,实际应发送奖励反馈)
print(“\nAre you happy with this suggestion? (y/n)”)
if input().lower() != ‘y’:
keep_going = True # 在实际应用中,这里会发送负奖励并调整模型
else:
keep_going = False # 或发送正奖励
if __name__ == “__main__”:
main()
应用测试与总结
在下一节,我们将运行此应用,查看个性化器服务如何根据输入提供推荐。您需要先在Azure门户创建个性化器资源,并获取密钥和终结点填入代码中。
本节课中,我们一起学习了如何创建Azure个性化器服务应用。我们构建了一个Python程序,它能够根据用户的时间偏好和口味偏好,从多个餐食选项中推荐最合适的一个。通过定义动作、收集用户上下文并调用排名API,我们实现了一个简单的个性化推荐系统。
Azure实践:12.2:个性化器服务工作原理与演示 🎯
在本节中,我们将学习个性化器服务具体如何工作,并演示我们创建的应用。
配置与运行应用
我已经在我的Azure账户上创建了一个个性化器服务,并获取了相应的密钥和终结点。我们知道如何在Azure账户上创建此服务,之前已经操作过多次。只需在门户中搜索“Personalizer”服务并创建即可。
现在,回到我们的应用程序,填入密钥和终结点,然后运行它。
# 填入从Azure门户获取的值
key = “YOUR_SUBSCRIPTION_KEY”
endpoint = “YOUR_ENDPOINT_URL”
运行应用(不调试):
python sample_application.py
应用演示

假设应用启动后,用户选择想吃“咸的”(salty),并计划在“下午”(afternoon)用餐。
基于我们为每个餐食定义的营养数据和用户要求,服务将推荐“沙拉”(salad)。从输出中可以看到,沙拉的推荐概率高达0.85(85%),而其他三个选项(果汁、冰淇淋、披萨)的概率均为0.05(5%)。
这就是个性化器服务的工作方式:基于我们传递给服务的数据,它提供智能建议。
总结与扩展

通过收集用户输入并将其与所有用户的历史经验相结合,我们可以基于海量用户数据做出决策。例如,决定广告的投放位置、向用户推荐哪些文章等。所有这些决策都可以借助个性化器服务来实现。
本节课中,我们一起探索了Azure个性化器服务的工作原理。我们配置并运行了一个Python应用,该应用根据用户对口味和用餐时间的偏好,成功推荐了最合适的餐食选项。这展示了如何利用用户实时行为数据来训练模型并做出个性化决策。

Azure实践:13:网络搜索认知服务概览 🌐
现在,我们将讨论认知服务中的最后一个大类:网络搜索认知服务。我相信大多数人对这类服务已有一定了解。
服务简介
隶属于网络搜索认知服务的各项服务,使我们的应用程序能够利用Bing搜索引擎的强大功能。简而言之,通过简单的RESTful API调用,您可以将搜索引擎的能力集成到您的应用中,其后台使用的是Bing。
在进一步深入之前,请确保不要将认知服务下的网络搜索服务与Azure搜索服务混淆,因为这两者是截然不同的工具。
服务列表
目前,网络搜索认知服务下包含九项服务:
以下是这些服务的列表:
- Bing 网络搜索:提供广泛的网页搜索结果。
- 视觉搜索:基于图像进行搜索。
- 实体搜索:搜索特定实体,如人物、地点。
- 图像搜索:搜索图片。
- 视频搜索:搜索视频。
- 新闻搜索:搜索新闻文章。
- 自动建议:提供搜索词自动完成建议。
- 拼写检查:纠正拼写错误。
- 本地商业搜索(可能包含在部分套件中):搜索本地商业信息。
我们将在接下来的课程中逐一详细介绍这些服务。其中,我们将以网络搜索服务为基础创建一个演示应用程序。该程序将展示网络搜索服务如何工作,我们还会创建一个基于Java的应用程序,通过RESTful服务调用认知网络搜索API,并传递一个测试短语。基于该短语,服务将以JSON格式返回结果,我们将从中了解可以从Bing网站获取哪些匹配结果。
Azure实践:13.1:网络搜索服务详解 🛠️
接续上一节的讨论,我将详细介绍认知服务下的各项网络搜索服务。
1. 网络搜索 (Web Search)
这是我们日常生活中最常用的服务,例如Google、Bing、Yahoo等。使用此服务,您可以:
- 控制想要获取结果的市场或区域。
- 开启或关闭安全搜索。
- 控制数据的新鲜度(例如,获取最多一天前或一个月前的数据)。
我们将在下一节更详细地探讨此服务,并为其创建一个演示应用。
2. 拼写检查 (Spell Check)
此服务不仅可用于纠正拼写错误的单词,还能根据上下文纠正用词。
3. 自动建议 (Autosuggest)
我相信大家都曾在使用搜索引擎时,在屏幕上看到过搜索建议。当我们在Google上搜索内容时,输入过程中会得到一些用于补全短语的建议。自动建议服务可用于在我们的应用程序中实现相同的功能。
4. 图像搜索 (Image Search) & 视频搜索 (Video Search)
- 图像搜索:这是一个不言自明的服务。您可以传递一个短语(如“银河系”、“太阳系”或水果名“苹果”),服务将返回基于该短语的图片。您可以控制安全搜索的开关和数据的新鲜度,但通常不能控制返回数据的区域。
- 视频搜索:其工作方式与图像搜索非常相似。您可以指定短语、控制区域、安全搜索和数据新鲜度。Bing网络搜索将返回一些视频结果,您可以观看这些视频。
5. 实体搜索 (Entity Search)
此服务可用于搜索特定的地点或人物。您可以控制市场和位置参数。实体服务将返回数据,供您在应用中使用。
6. 视觉搜索 (Visual Search)
如果您想基于图像进行搜索该怎么办?例如,我想购买某种衬衫或T恤,并且我有一个参考图片。我可以将该图片作为输入上传到服务,Bing搜索引擎将为您查找相似图片并返回结果,您可以从这些结果中找到该产品。这时,视觉搜索服务就派上用场了。
在下一节中,我将创建一个应用程序。首先在Azure上创建服务,然后基于该服务构建一个应用,通过触发测试短语从服务中获取返回结果。
Azure实践:13.2:创建Java网络搜索应用 ☕
在本节中,我将创建一个用于访问网络搜索服务的应用程序。
项目初始化
我将创建一个新的Java 8项目,命名为 WebSearchCognitive。
项目创建后,我们需要在 pom.xml 文件中添加一些依赖项,特别是用于JSON解析的Gson库。由于此应用需要与Azure服务交互,我们还需要添加Azure相关的依赖。
基础代码结构
首先,在主要Java类中定义一些静态字段:
public class Main {
// 订阅密钥和终结点
static String subscriptionKey = “”;
static String host = “https://api.bing.microsoft.com”;
static String path = “/v7.0/search”;
// 搜索词
static String searchTerm = “Microsoft Cognitive Services”;
public static void main(String[] args) {
// 主逻辑将在这里编写
}
}
构建搜索功能
我们将创建一个执行搜索并返回结果的方法。
public static SearchResults SearchWeb (String searchQuery) throws Exception {
// 构造完整的URL
URL url = new URL(host + path + “?q=” + URLEncoder.encode(searchQuery, “UTF-8”));
// 打开连接
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestProperty(“Ocp-Apim-Subscription-Key”, subscriptionKey);
// 接收JSON响应体
InputStream stream = connection.getInputStream();
Scanner scanner = new Scanner(stream);
String response = scanner.useDelimiter(“\\A”).next();
scanner.close();
stream.close();
// 将JSON字符串转换为对象
Gson gson = new GsonBuilder().setPrettyPrinting().create();
SearchResults results = gson.fromJson(response, SearchResults.class);
return results;
}
定义结果类
我们需要一个类来映射JSON响应。
class SearchResults {
HashMap<String, String> relevantHeaders;
String jsonResponse;
// 构造函数、Getter和Setter
public SearchResults(HashMap<String, String> headers, String json) {
relevantHeaders = headers;
jsonResponse = json;
}
}
美化JSON输出
创建一个辅助函数来美化打印JSON。
public static String prettify(String json_text) {
JsonParser parser = new JsonParser();
JsonObject json = parser.parse(json_text).getAsJsonObject();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
return gson.toJson(json);
}
完善主方法
现在,在主方法中整合所有功能。
public static void main(String[] args) {
try {
System.out.println(“Searching the Web for: “ + searchTerm);
SearchResults result = SearchWeb(searchTerm);
// 打印相关HTTP头(可选)
System.out.println(“\nRelevant HTTP Headers:\n”);
for (String header : result.relevantHeaders.keySet())
System.out.println(header + “: “ + result.relevantHeaders.get(header));
// 美化并打印JSON响应
System.out.println(“\nJSON Response:\n”);
System.out.println(prettify(result.jsonResponse));
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
后续步骤
代码中可能还存在一些细微问题。在下一节中,我将使用从部署的服务中获取的相关终结点URL和密钥来填充代码,并运行此应用程序。
Azure实践:13.3:运行与演示网络搜索应用 🚀
在本节中,我们将运行上一节创建的Java网络搜索应用,并查看其结果。
配置服务
如你所见,我已经根据从已部署服务获取的值,填充了代码中的密钥和终结点。我们都知道如何在Azure上部署此服务:在搜索栏中查找“Bing Search”,创建资源,然后即可获取密钥和终结点。
我已填充了这些值。在终结点中,请确保添加 v7.0/search。然后,我将运行应用程序。
运行演示
展开控制台查看输出。应用程序正在搜索相关结果。从Azure网络搜索中,它获取到了大量结果。
基于网络搜索,我们可以看到多个类别的内容:
- 网页结果:如“云计算服务”、“免费账户”、“定价”等。
- 实体信息。
- 视频结果。
- 排名响应。
这表明搜索API涵盖了Azure认知网络搜索的每个元素。你甚至可以看到与YouTube相关的内容,说明它能够从所有可用资源中获取详细信息。
尝试不同搜索词
如果我们传递一个新的搜索字符串,例如“Facebook”,然后再次运行服务。
现在,我们将获得基于“Facebook”搜索的结果。控制台显示了估计的匹配数量、使用的网络搜索URL,以及登录页面、查找朋友、收件箱等结果。
总结
这就是网络搜索认知服务的工作方式。如果您不想直接访问搜索引擎,可以创建自己的应用程序,并帮助您的应用程序根据需要查询这些服务并获取结果。

本节课中,我们一起完成了Azure网络搜索认知服务的集成与演示。我们创建了一个Java应用,通过调用Bing搜索API,成功获取并格式化了包括网页、实体、视频在内的多种搜索结果。这展示了如何将强大的搜索引擎能力无缝嵌入到自定义应用程序中。

浙公网安备 33010602011771号