NLP——part of speech (POS)中的隐马尔可夫模型 + Viterbi 算法

news2025/2/21 19:57:00

文章目录

  • POS
  • 隐马尔可夫模型
    • 计算简介
    • 转移概率矩阵(Transition matrix)
    • 观察矩阵(Observation / emission Matrix)
    • 预测 prediction
    • Vitervi 算法
    • 练习

POS

词性标注(Part-of-Speech Tagging,POS Tagging)是自然语言处理(NLP)中的一项基本任务,它的发展历史可以大致分为以下几个阶段:

  • 规则和词典驱动的方法:在早期,词性标注主要依赖于手工编写的规则和词典。在这种方法中,会有一套详尽的规则用于确定词的词性,这些规则通常是由语言学家根据他们对语言的理解而制定的。同时,也会有一本包含了大量词语及其对应词性的词典供参考。这种方法的痛点在于需要大量的人力来编写规则和维护词典,而且规则的适用性可能会受到语言变化和地区差异的影响。

  • 基于统计的方法:随着计算机技术的发展和大量文本数据的可用性,基于统计的方法开始被引入到词性标注中。这种方法使用标注过的语料库(corpus)来训练模型,通过学习每个词出现的频率和上下文来决定词性。这种方法中最常见的模型就是隐马尔科夫模型(Hidden Markov Model,HMM)。HMM 可以有效地处理词性标注的问题,因为它可以同时考虑到每个词的局部上下文和全局序列性。然而,HMM 仍然存在一些限制,比如它只能考虑到有限的上下文,并且对于稀有词和新词的处理能力较弱。

  • 基于机器学习的方法:进一步发展,人们开始使用更复杂的机器学习模型,如决策树、最大熵模型、条件随机场(Conditional Random Fields,CRF)等来进行词性标注。这些模型能够考虑更丰富的特征,包括词本身的信息、词的上下文信息、以及词的其他语言特性等。但这些模型的训练和推理通常比 HMM 更复杂,需要更多的计算资源。

  • 基于深度学习的方法:近年来,随着深度学习的发展,人们开始使用神经网络,特别是循环神经网络(RNN)和转换器(Transformer)等模型来进行词性标注。这些模型可以捕获长距离的依赖关系,处理复杂的语言结构,而且可以自动从数据中学习有效的特征,对于稀有词和新词的处理能力也有所提高。然而,深度学习方法通常需要大量的标注数据和计算资源,对于资源受限的语言或任务,这可能是一个问题。

隐马尔可夫模型

在这里插入图片描述

  • 在这个 POS 的任务中,我们的目标是:给定一个 sentence w,我们对每个词生成一个标注 tag,这些 tag 构成了 tag 序列 t;在这个过程中我们希望选择能够使得 t 序列概率最大的结果
    在这里插入图片描述

  • 因此,我们假设概率最大的结果为 t ^ \hat{t} t^, 并且根据贝叶斯公式,我们可以得到 t ^ = arg max ⁡ t P ( w ∣ t ) P ( t ) P ( w ) \hat{t}=\argmax_{t} \frac{P(w|t)P(t)}{P(w)} t^=targmaxP(w)P(wt)P(t)

  • 又因为分母 P ( w ) P(w) P(w) 本质上与 t t t 无关,所以这个分母可以被忽略掉,不会影响计算结果,因此可以简化公式为:
    t ^ = arg max ⁡ t P ( w ∣ t ) P ( t ) \hat{t} =\argmax_{t} {P(w|t)P(t)} t^=targmaxP(wt)P(t)

  • 因为 w w w t t t 表示的都是整个句子层面的,现在我们将整个公式拆解成每个单词和 tag 的概率的连乘,即:
    在这里插入图片描述

  • 这个过程中我们遵循两个强假设:

    • ① 当前的 tag 的概率只取决于上一个 tag P ( t ) = ∏ i = 1 n P ( t i ∣ t i − 1 ) P(t) = \prod_{i=1}^{n}P(t_{i} | t_{i-1}) P(t)=i=1nP(titi1)
    • ② 当前word的概率 取决于当前的 tag P ( w ∣ t ) = ∏ i = 1 n P ( w i ∣ t i ) P(w|t) = \prod_{i=1}^{n}P(w_{i} | t_{i}) P(wt)=i=1nP(witi)
  • 举个更加直观的例子,假设我现在有一个句子 I like eating fish:

    • 当我们从左到右看第二个单词 like (这里之所以拿 like 举例是因为 i 比较特殊,但是后面会解释)的时候,它的概率只取决于 like 的词性 tag。这其实也比较合理,因为当我们说 “我喜欢吃鱼” 的时候,我们遵从的规则其实不是单词本身,而是不同词之间的词性关系,因为说了一个 动词like),所以下一个词大概率就会说一个 名词 (eating),这是核心思想。
    • 比如你已经说了 like,这是个 动词,那么下一个词我们根据 ① ,知道或许可以说个名词,那我们就从名词里面挑一个吧,或许可以挑到 eating,所以我们看: eating 这个 word 是因为我们已经知道了当前位置的词性 tag,所以我们第 ② 个假设 (当前word的概率 取决于当前的 tag) 也是合理的
  • 以上就是 隐马尔科夫模型,它的两个特点决定了它为什么叫 隐马尔科夫假设

    • 马尔科夫假设:做一个不严谨的总结就是:在一个序列模型中,某个时刻 t t t 事件的概率,仅有 t − 1 t-1 t1 时刻的事件决定,也就是原本应该写成 P ( x i ∣ x i − 1 x i − 2 . . . . ) P(x_i | x_{i-1}x_{i-2} ....) P(xixi1xi2....) 直接简化成 P ( x i ∣ x i − 1 ) P(x_i | x_{i-1}) P(xixi1)
    • 隐变量:在隐马尔可夫模型中,“隐” 指的是我们想要推断的状态序列是不可观测的或者说是隐藏的。具体到词性标注任务中,“隐” 指的就是每个词的词性 tag。在词性标注任务中,我们可以观察到的是文本中的词语(观测序列),而我们想要推断的是这些词对应的词性(状态序列)。 举个例子来说:I like eating fish 还是在这句话中,当我们观察到 like,但是我们不知道 like 的词性是什么,可能有人要问了 Like 可以做 动词 啊,那 like 也可以做副词啊,所以这里其实我们需要推断 Like 的词性到底是什么, 因此词性对我们来说是要根据上下文进行推断的量,因此称为隐变量。

在这里插入图片描述

  • 即,在这张图中, P ( w i ∣ t i ) P(w_i|t_i) P(witi) 说明当前的 w i w_i wi 只取决于 t i t_i ti 这个隐变量;同时 P ( t i ∣ t i − 1 ) P(t_i | t_{i-1}) P(titi1) 体现出了马尔科夫性质(只与前一个状态有关)

计算简介

在这里插入图片描述

  • 隐马尔科夫模型的计算基于两个概率 P ( t i ∣ t i − 1 ) P(t_i | t_{i-1}) P(titi1) P ( w i ∣ t i ) P(w_i|t_i) P(witi),这两个概率都可以通过对数据集进行统计来轻松获得,例如上面图片中的 P ( l i k e ∣ V B ) P(like | VB) P(likeVB) P ( N N ∣ D T ) P(NN|DT) P(NNDT)

P ( t i ∣ t i − 1 ) P(t_i | t_{i-1}) P(titi1) 我们不禁提问,对于一个 tag 应该如何处理呢:
在这里插入图片描述

  • 我们默认第一个 tag 就是 < / s > </s> </s>,然后按照相同的方式统计数量来获得概率(具体情况会在下面的实例中展示

那如果有的 (word, tag) 不存在怎么办?
在这里插入图片描述

  • 采用平滑的方式解决

转移概率矩阵(Transition matrix)

  • 为了计算 P ( t i ∣ t i − 1 ) P(t_i | t_{i-1}) P(titi1),我们可以先根据统计的方法得到 转移概率矩阵,然后采用查表的方式获得 P ( t i ) P(t_i) P(ti) P ( t i − 1 ) P(t_{i-1}) P(ti1),表中的内容的阅读顺序应该是先看 row 再看 column,比如我要看 P ( N N P ∣ M D ) P(NNP | MD) P(NNPMD) 也就是 在给定 MD 条件下 NNP 的概率 我们应该找到 MD 所在的行,然后去看 NNP 所在的列,最终得到 0.0008
    在这里插入图片描述

观察矩阵(Observation / emission Matrix)

在这里插入图片描述

  • 看这个表的方法和上一个表是完全一样的,当我们想得到 P ( j a n e t ∣ N N P ) P(janet | NNP) P(janetNNP) 即,给定 NNP 条件下 Janet 这个词出现的概率,则先找到 NNP 所在的行,然后找到 janet 所在的列,最终得到 0.000032

预测 prediction

在这里插入图片描述

  • 一定要注意的一点是:我们需要求得的全局的最优解,而并非针对某一个时刻的最优概率,因此我们需要通过一个表格来计算每个步骤所得的概率,然后直到整个表格计算完成才能决定我们到底选择哪一种方案作为全局最优的解。我们将会在 Viterbi 算法中详解这个思想

Vitervi 算法

在这里插入图片描述

  • 首先我们现在有什么:

    • 转移矩阵 T T T

    • 观察矩阵 O O O
      在这里插入图片描述

  • 对于第一个格子:
    在这里插入图片描述
    我们求算的概率是 P ( N N P ∣ J a n e t ) P(NNP | Janet) P(NNPJanet),这里可能要有人有疑问了:

    之前不是说在读 Transition观察矩阵 的时候说 “先读行,再读列”,那么按照这个原则,这里的概率应该表示的是 P ( J a n e t ∣ N N P ) P(Janet | NNP) P(JanetNNP) 才对啊?

  • 这里一定要注意,我们求算的这个表格的目的是,当我们有一个句子 Janet will back the bill 这句话,我们要对每个单词预测一个合理的 tag,并最终组成一个 tag 序列,这个 tag 序列的概率还要是所有可能的 tag 序列中最大的,

  • 因此我们在求算的过程中,我们的已知一定是某个单词,例如 Janet,千万不要看到表格就觉的是一样的, 这个是求算过程的表格,跟 TransitionObservation 没啥关系


下面正式进入计算过程:

  • 在第一个时刻 t ^ \hat{t} t^ P ( t i ∣ w i ) = P ( N N P ∣ J a n e t ) = P ( w i ∣ t i ) ∗ P ( t i ∣ t i − 1 ) P(t_i | w_i) = P(NNP | Janet) = P(w_i | t_i) * P(t_i | t_{i-1}) P(tiwi)=P(NNPJanet)=P(witi)P(titi1)

  • 此时的 w i = J a n e t w_i = Janet wi=Janet, t i = N N P t_i = NNP ti=NNP t i − 1 = < / s > t_{i-1}=</s> ti1=</s> 所以直接带入:
    P ( N N P ∣ J a n e t ) = P ( J a n e t ∣ N N P ) ∗ ( N N P ∣ < / s > ) = 0.2767 ∗ 0.000032 P(NNP | Janet) = P(Janet | NNP) * (NNP | </s>) = 0.2767 * 0.000032 P(NNPJanet)=P(JanetNNP)(NNP</s>)=0.27670.000032

  • 直接查表:
    在这里插入图片描述

  • 接下来是第一列的其他格子:

    • 由于给定 Janet,它的词性并不一定只有一种,因此要计算所有 Janet 可能的词性,计算方式都是一样的,可以得到一系列结果:
      P ( N N P ∣ J a n e t ) = P ( J a n e t ∣ M D / V B / J J / . . . . ) ∗ ( M D / V B / J J / . . . . ∣ < / s > ) P(NNP | Janet) = P(Janet | MD / VB / JJ /....) * (MD / VB / JJ /.... | </s>) P(NNPJanet)=P(JanetMD/VB/JJ/....)(MD/VB/JJ/....∣</s>)
    • 通过查 观察矩阵 可以发现 P ( J a n e t ∣ M D / V B / J J / . . . . ) P(Janet | MD / VB / JJ /....) P(JanetMD/VB/JJ/....) 都是 0,因此这一列除了 P ( J a n e t ∣ N N P ) P(Janet | NNP) P(JanetNNP) 之外,结果都是 0
      在这里插入图片描述

  • 现在来计算第二列
  • 我们现在还不能确定 Janet 的词性就是 NNP 这是因为我们的这个序列还没算完,序列整体的概率还不能保证是全局最优的,因此我们要在当前第一列的基础上继续算下去。
  • 当我们看到 will 的时候我们已经知道,第一个词是 Janet,并且给定 Janet 的所有词性 (NNP, MD, VB, ...)的概率
  • 第二列我们重复上述过程,计算的是给定 will 这个词的条件下,所有词性的概率,我们还是从 NNP 这个词性开始:

P ( N N P ∣ w i l l ) = P ( w i l l ∣ N N P ) ∗ P ( N N P ∣ t i − 1 ) ‾ P(NNP | will) = P(will | NNP) * \underline{P(NNP | t_{i-1})} P(NNPwill)=P(willNNP)P(NNPti1)

  • 这里的 t i − 1 t_{i-1} ti1 需要考虑多种情况,因为在 will 之前是 Janet, 我们需要考虑 Janet 在各种词性下的取值。

  • 所以我们在考虑 P ( N N P ∣ w i l l ) P(NNP | will) P(NNPwill) 的时候,我们需要考虑 Janet 取所有可能情况中的最大值,即:
    P ( N N P ∣ w i l l ) = m a x { P ( w i l l ∣ N N P ) ∗ P ( N N P ∣ N N P ) ∗ P ( N N P ∣ J a n e t ) , P ( w i l l ∣ N N P ) ∗ P ( N N P ∣ M D ) ∗ P ( M D ∣ J a n e t ) , P ( w i l l ∣ N N P ) ∗ P ( N N P ∣ V B ) ∗ P ( V B ∣ J a n e t ) , . . . , P ( w i l l ∣ N N P ) ∗ P ( N N P ∣ D T ) ∗ P ( D T ∣ J a n e t ) , } P(NNP | will) =max\{ \\ P(will | NNP) *{P(NNP | NNP) * P(NNP|Janet)}, \\P(will | NNP) *{P(NNP | MD) * P(MD|Janet)}, \\P(will | NNP) *{P(NNP | VB) * P(VB|Janet)},\\ ..., \\P(will | NNP) *{P(NNP | DT) * P(DT|Janet)}, \\ \} P(NNPwill)=max{P(willNNP)P(NNPNNP)P(NNPJanet),P(willNNP)P(NNPMD)P(MDJanet),P(willNNP)P(NNPVB)P(VBJanet),...,P(willNNP)P(NNPDT)P(DTJanet),}

  • 对于 max 中的每一项,他们的最后一个部分都是我们在第一列中求出的值,例如: P ( N N P ∣ J a n e t ) = 8.8544 e − 6 P(NNP|Janet) = 8.8544e^{-6} P(NNPJanet)=8.8544e6,因此我们可以求出 P ( N N P ∣ w i l l ) P(NNP|will) P(NNPwill) 取最大的值应该等于:
    P ( N N P ∣ w i l l ) = P ( w i l l ∣ N N P ) ∗ P ( N N P ∣ N N P ) ∗ 8.8544 e − 6 P(NNP|will) = P(will | NNP) * P(NNP | NNP) * 8.8544e^{-6} P(NNPwill)=P(willNNP)P(NNPNNP)8.8544e6

  • 通过查表发现: P ( w i l l ∣ N N P ) = 0 P(will | NNP) = 0 P(willNNP)=0 因此 P ( N N P ∣ w i l l ) = 0 ∗ 0.3777 ∗ 8.8544 e − 6 = 0 P(NNP|will) = 0 * 0.3777 * 8.8544e^{-6} = 0 P(NNPwill)=00.37778.8544e6=0
    在这里插入图片描述
    在这里插入图片描述

  • 同样的按照这个方法求算第二列中其他部分的值,每个格子进行计算的时候都要考虑到 Janet 所在列的计算结果。
    在这里插入图片描述

  • 同时在得到每一个格子中的最大值时,我们同样应该保留 track, 比如在当前例子中,如果 P ( M D ∣ w i l l ) P(MD | will) P(MDwill) 最终取最大值的时候是因为 P ( M D ∣ w i l l ) = P ( w i l l ∣ M D ) ∗ P ( M D ∣ N N P ) ∗ P ( N N P ∣ J a n e t ) P(MD|will) = P(will | MD) * P(MD | NNP) * P(NNP | Janet) P(MDwill)=P(willMD)P(MDNNP)P(NNPJanet),那么他的上一个 tagNNP,这个关系是需要被记录下来的,因为在最后一步计算完成后,我们会得到完整的 track,这个 track 会具有全局最优的概率:
    在这里插入图片描述
    在这里插入图片描述

练习

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/627954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AUTOSAR-Code调试】:Wdog

【AUTOSAR-Code调试】&#xff1a;Wdog DavinciCfg 生成文件添加进GreenHill编译添加.c文件添加.h文件路径 接上篇【Davinci开发】&#xff1a;Wdg配置 DavinciCfg 生成文件添加进GreenHill编译 添加.c文件 添加.h文件路径

模拟实现 Spring AOP

文章目录 前言Spring AOPSpring AOP 概述Spring IoC 技术难点Spring IoC 框架思考需求分析 Spring IoC 技术难点实现模拟实现 AOP 具体代码 前言 Spring 是一种 Java 开发框架&#xff0c;其主要功能有两个&#xff1a;IoC(DI)和AOP。《模拟实现Spring AOP》是本人的一个编程训…

基于SSM的校园二手交易平台

一、源码获取&#xff1a; 链接点击直达&#xff1a;下载链接 二、系统架构&#xff1a; 使用技术&#xff1a; SpringSpringMVCMybatis 三、系统需求分析&#xff1a; 在如今的大学校园中&#xff0c;伴随着学生的购买能力的提高和每年的升学和毕业&#xff0c;存在许多…

调用阿里云API实现证件照生成

目录 1. 作者介绍2. 算法介绍2.1 阿里云介绍2.2 证件照生成背景2.3 图像分割算法 3.调用阿里云API进行证件照生成实例3.1 准备工作3.2 实验代码3.3 实验结果与分析 参考&#xff08;可供参考的链接和引用文献&#xff09; 1. 作者介绍 王逸腾&#xff0c;男&#xff0c;西安工…

ASEMI代理英飞凌TLD5097EL:理解和使用LED驱动器的综合指南

编辑-Z TLD5097EL是一款创新的LED驱动器&#xff0c;在照明行业掀起了波澜。这项先进的技术提供了广泛的好处&#xff0c;包括提高能源效率、延长使用寿命和增强性能。在本综合指南中&#xff0c;我们将探讨TLD5097EL的功能和优点&#xff0c;并提供如何有效利用该LED驱动器优…

python -- 绘制colorbar时设置标签为居中显示

python – 绘制colorbar时设置标签为居中显示 在海洋气象领域的相关研究中&#xff0c;对于一些异常信号的二维填色图绘制时&#xff0c;通常在设置colorbar都是以0为中心对称分布的。而在绘制colorbar时&#xff0c;由于存在负号会使得默认colorbar标签不太好看&#xff08;强…

window服务器环境将springboot jar包安装成一个window服务自启动

目录 1.下载WinSW工具 下载winswhttps://github.com/winsw/winsw/releases 2.新建一个Window Service信息的xml文件 3.将xml和exe重命名 4.安装卸载服务 5.修改配置文件 6.常用命令(注意winsw是exe名字 1.下载WinSW工具 下载winswhttps://github.com/winsw/winsw/rele…

图像降噪网络:KBNet 论文笔记

0 前言 Zhang Y, Li D, Shi X, et al. KBNet: Kernel Basis Network for Image Restoration[J]. arXiv preprint arXiv:2303.02881, 2023. https://arxiv.org/abs/2303.02881 论文主要提出了 Kernel Basis Attention Module 注意力模块&#xff0c;称为 KBA 模块。该模块可以轻…

[中阳期货】端午都有哪些习俗,为什么不能说快乐?

端午节&#xff08;屈原故里端午习俗&#xff09;&#xff0c;流行于湖北省宜昌市、秭归县的传统民俗&#xff0c;国家级非物质文化遗产之一。 “五月五&#xff08;农历&#xff09;&#xff0c;过端午。”端午节是中华民族的传统节日。《续齐谐记》、《荆楚岁时记》载&#x…

AI 人工智能介绍(一)

人工智能&#xff08;AI&#xff09;是一种利用计算机程序和算法来模拟人类智能的技术。通俗地说&#xff0c;就是让计算机能够像人一样思考、学习、推理和决策。 人工智能改变了我们的生活&#xff01;它被广泛应用于语音识别、计算机视觉、自然语言处理、智能机器人等多种领…

ubuntu20.04虚拟机安装

下载对应版本镜像文件&#xff08;iso&#xff09; 下载链接&#xff1a;https://releases.ubuntu.com/jammy/ 虚拟机安装工具为VMware 这里我的版本为下图所示 使用vmware创建虚拟机 1&#xff0c;点击 “创建新的虚拟机” 2&#xff0c;进入向导&#xff0c;选择自定义 …

基于docker部署的Selenium Grid分布式自动化测试

01、什么是Selenium Grid Selenium Grid是Selenium套件的一部分&#xff0c;它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。 Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍&#xff0c;因为Selenium团队已经逐渐遗弃老版…

非线性规划求解方法:序列线性规划(Sequential linear programming)

来源&#xff1a;Cornell University Computational Optimization Open Textbook&#xff1a;SLP​​​​​​​ 目录 1.介绍 2.理论和方法 2.1 问题形式 2.1.1 NLP问题形式 2.1.2 SLP问题形式 2.2 步长边界 Step Bounds 2.3 完整的SLP算法 3.案例 3.1 example1 3.2…

数据结构:树状数组详解

一. 背景 那么我们为什么要用树状数组呢? 在解决一些区间求和的问题中 , 简单描述就是&#xff0c;对于一个给定的数组A&#xff0c;希望能够设计一个update函数来修改其中一个数的值&#xff0c;然后再设计一个sum函数来计算数组下标再给定参数l和r之间的值之和。关键点在于…

Docker Swarm 集群搭建和使用 —— 筑梦之路

简单介绍 swarm 集群由管理节点&#xff08;Manager&#xff09;和工作节点&#xff08;Worker&#xff09;构成。 管理节点&#xff1a;主要负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。诸如监控集群状态、分发任务至工作节点等操作。 工作节点&…

【计算机视觉】使用 notebook 展示如何下载和运行 CLIP models,计算图片和文本相似度,实现 zero-shot 图片分类

文章目录 一、CLIP 模型二、准备三、加载模型四、查看图片处理器五、文本分词六、输入图片和文本&#xff0c;并可视化七、将图片和文字 encode 生成特征八、计算 cosine 相似度九、零样本进行图片分类十、编写函数进行图片分类十一、测试自己的函数十二、编写函数对多图片进行…

面对职业发展“迷茫期”除了抱怨焦虑我们还能做什么?

关注“软件测试藏经阁”微信公众号&#xff0c;回复暗号【软件测试】&#xff0c;即可获取氪肝整理的全套测试资源 Java和Python做自动化测试&#xff0c;哪个更有优势&#xff1f;这两个语言都是很流行的语言&#xff0c;所以从技术上很难说谁好谁不好的。因为要说好不好得看…

linux安装homeassistant(智能设备远程控制开源框架)

1、安装docker 先切换到root 用户&#xff0c;先安装一些基本环境&#xff1a; yum install -y yum-utils device-mapper-persistent-data lvm2添加阿里云软件源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo然后安装 D…

QT+OpenGL高级光照 Blinn-Phong和Gamma校正

QTOpenGL高级光照1 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 Blinn-Phong 冯氏光照&#xff1a;视线与反射方向之间的夹角不小于90度&#xff0c;镜面光分量会变成0.0&#xff08;不是很合理&am…

死信队列小结

死信队列是RabbitMQ中非常重要的一个特性。简单理解&#xff0c;他是RabbitMQ对于未能正常消费的消息进行的 一种补救机制。死信队列也是一个普通的队列&#xff0c;同样可以在队列上声明消费者&#xff0c;继续对消息进行消费处理。 对于死信队列&#xff0c;在RabbitMQ中主要…