“隐性 Dirichlet 分配”组件
本文介绍了如何使用 Azure 机器学习设计器中的“隐性 Dirichlet 分配”组件将未通过其他方式分类的文本分组到各个类别中。
隐性 Dirichlet 分配 (LDA) 经常在自然语言处理中用来查找相似的文本。 另一个常见术语是“主题建模”。
此组件接受一个文本列并生成以下输出:
源文本,以及每个类别的分数
一个特征矩阵,其中包含每个类别的已提取术语和系数
一个转换,你可以将其保存并重新应用于用作输入的新文本
此组件使用 scikit-learn 库。 有关 scikit-learn 的详细信息,请参阅 GitHub 存储库(包括有关算法的教程和说明)。
有关隐性 Dirichlet 分配的更多信息
LDA 通常不是一种分类方法。 但它使用生成法,因此你不需要先提供已知的类标签,然后再推断模式。 相反,该算法将生成用于标识主题组的概率模型。 你可以使用概率模型对作为输入提供给模型的现有训练案例或新案例进行分类。
你可能更喜欢使用生成模型,因为它避免了对文本与类别之间的关系进行强假设。 它仅使用字词的分布来对主题进行数学建模。
以下论文讨论了相关理论,可以 PDF 格式下载:隐性 Dirichlet 分配:Blei、Ng 和 Jordan。
此组件中的实现基于适用于 LDA 的 scikit-learn 库。
有关详细信息,请参阅技术说明部分。
如何配置隐性 Dirichlet 分配
此组件需要包含文本列(原始或预处理文本)的数据集。
将“隐性 Dirichlet 分配”组件添加到管道。
请提供包含一个或多个文本列的数据集作为组件的输入。
对于“目标列”,请选择包含要分析的文本的一个或多个列。
你可以选择多个列,但它们必须是字符串数据类型。
因为 LDA 基于文本创建一个大型的特征矩阵,所以你通常只分析单个文本列。
对于“要建模的主题数”,请输入一个介于 1 和 1000 之间的整数,用于指示要从输入文本派生多少类别或主题。
默认情况下,将创建 5 个主题。
对于“N 元语法”,请指定哈希处理期间生成的 N 元语法的最大长度。
默认值为 2,表示同时生成二元语法和一元语法。
选择“规范化”选项以将输出值转换为概率。
输出和特征数据集中的值将转换如下,而不是将转换后的值表示为整数:
数据集中的值将表示为一个概率,即
P(topic|document)
。特征主题矩阵中的值将表示为一个概率,即
P(word|topic)
。
注意
在 Azure 机器学习设计器中,从版本 0.19 开始,scikit-learn 库不再支持非规范化的 doc_topic_distr 输出。 在此组件中,“规范化”参数只能应用于“功能主题矩阵”输出。 转换后的数据集输出始终是规范化的。
如果希望设置以下高级参数,请选择“显示所有选项”选项,然后将其设置为“是”。
这些参数特定于 LDA 的 scikit-learn 实现。 对于 scikit-learn 中的 LDA,有一些不错的教程,还有官方 scikit-learn 文档。
Rho 参数。 为主题分布稀疏度提供一个先验概率。 此参数对应于 sklearn 的
topic_word_prior
参数。 如果希望字词的分布是平坦的,请使用值 1;也就是说,假定所有字词都是等概率的。 如果你认为大多数字词都以稀疏方式显示,则可以将其设置为较小的值。Alpha 参数。 为每文档主题权重的稀疏度指定一个先验概率。 此参数对应于 sklearn 的
doc_topic_prior
参数。估计的文档数。 输入一个数字,用于表示你对将要处理的文档(行)数的最佳估计。 此参数允许组件分配足够大小的哈希表。 它对应于 scikit-learn 中的
total_samples
参数。批大小。 输入一个数字,用于指示要在发送到 LDA 模型的每批文本中包含多少行。 此参数对应于 scikit-learn 中的
batch_size
参数。学习更新计划中使用的迭代的初始值。 指定在在线学习中用于对早期迭代的学习速率进行减权的起始值。 此参数对应于 scikit-learn 中的
learning_offset
参数。在更新期间应用于迭代的幂。 指示在联机更新期间为了控制学习速率而应用于迭代计数的幂级。 此参数对应于 scikit-learn 中的
learning_decay
参数。对数据执行操作的轮次。 指定对数据循环执行算法的最大次数。 此参数对应于 scikit-learn 中的
max_iter
参数。
如果希望在对文本分类之前在初始轮次中创建 N 元语法列表,请选择“生成 N 元语法的字典”或“在 LDA 之前生成 N 元语法的字典”选项。
如果事先创建了初始字典,则可在以后查看该模型时使用该字典。 如果能够将结果映射到文本而不是数字索引,则通常更容易进行解释。 但是,保存字典会花费较长的时间,并会使用额外的存储。
对于“N 元语法字典的最大大小”,请输入可以在 N 元语法字典中创建的总行数。
此选项对于控制字典的大小很有用。 但如果输入中的 N 元语法数超过此大小,则可能会发生冲突。
提交管道。 LDA 组件使用贝叶斯定理来确定哪些主题可能与单个字词相关联。 字词并非排他性地与任何主题或组关联。 相反,每个 N 元语法都有一定的习得概率与任何发现的类相关联。
结果
组件有两个输出:
转换后的数据集:此输出包含输入文本、指定数量的已发现类别,以及每个类别的每个文本示例的分数。
特征主题矩阵:最左侧的列包含提取的文本特征。 每个类别的列都包含该类别中该特征的分数。
LDA 转换
此组件还输出将 LDA 应用于数据集的 LDA 转换。
你可以保存此转换,并将其重用于其他数据集。 如果你已经基于一个大型语料库进行过训练,并且想要重用系数或类别,则此技术可能很有用。
若要重用此转换,请选择“隐性 Dirichlet 分配”组件右侧面板中的“注册数据集”图标,以将组件保持在组件列表的“数据集”类别下。 然后,可以将此组件连接到应用转换组件,以重用此转换。
优化 LDA 模型或结果
通常,你无法创建可满足所有需求的单个 LDA 模型。 即使是为一项任务设计的模型,也可能需要进行多次迭代来提高准确性。 建议你尝试所有这些方法来改进模型:
- 更改模型参数
- 使用可视化效果来了解结果
- 获取行业专家的反馈,以确定生成的主题是否有用
还可以使用定性度量值来评估结果。 若要评估主题建模结果,请考虑:
- 准确度。 类似的项真的类似吗?
- 多样性。 当业务问题需要区分类似项时,模型是否可以进行区分?
- 可伸缩性。 它是适用于广泛的文本类别还是仅适用于狭小的目标域?
通常情况下,可以使用自然语言处理对文本进行清理、总结、简化或分类,从而基于 LDA 提高模型的准确度。 例如,以下技术(在 Azure 机器学习中都受支持)可以提高分类准确度:
停止词删除
大小写规范化
词元化或词干
命名实体识别
有关详细信息,请参阅预处理文本。
在设计器中,还可以使用 R 或 Python 库进行文本处理:执行 R 脚本、执行 Python 脚本。
技术说明
本部分包含实现详情、使用技巧和常见问题解答。
实现详细信息
默认情况下,转换后的数据集和特征-主题矩阵的输出分布将以概率的形式规范化:
对于给定的文档,转换后的数据集可以主题条件概率的形式规范化。 在这种情况下,每行的总和等于 1。
对于给定的主题,特征-主题矩阵可以字词条件概率的形式规范化。 在这种情况下,每列的总和等于 1。
提示
组件偶尔可能返回空主题。 最常见的原因是算法的伪随机初始化。 如果发生这种情况,可以尝试更改相关参数。 例如,更改 N 元语法字典的最大大小或用于特征哈希处理的位数。
LDA 和主题建模
隐性 Dirichlet 分配通常用于基于内容的主题建模,这基本上意味着从未分类的文本中学习类别。 在基于内容的主题建模中,主题是基于字词的分布。
例如,假设你提供了一个包含许多产品的客户评论语料库。 随着时间推移,客户提交的评论文本会包含许多词语,其中一些词语在多个主题中使用。
LDA 流程标识的主题可能表示对单个产品的评论,也可能表示一组产品的评论。 对 LDA 来说,主题本身只是一组字词随时间推移的概率分布。
词语很少专用于任一产品。 它们也用于其他产品,还可能是适用于所有产品的通用词语(“很好”、“糟糕”)。 其他词语可能是干扰词。 然而,LDA 方法不会试图捕获系统中的所有字词,也不试图理解字词之间的关系,只需确定字词同时出现的概率。 它只能对目标域中使用的字词进行分组。
在计算术语索引之后,基于距离的相似度度量值将比较各个文本行,以确定两个文本片段是否相似。 例如,你可能会发现产品有多个强相关的名称。 或者,你可能会发现强负面词语经常与某个特定产品相关。 你可以使用相似度度量值来识别相关词语以及创建建议。
组件参数
名称 | 类型 | 范围 | 可选 | 默认 | 说明 |
---|---|---|---|---|---|
目标列 | 列选择 | 必须 | StringFeature | 目标列名称或索引。 | |
要建模的主题数 | Integer | [1;1000] | 必须 | 5 | 根据 N 个主题对文档分布进行建模。 |
N 元语法 | Integer | [1;10] | 必须 | 2 | 在哈希处理期间生成的 N 元语法的顺序。 |
规范化 | 布尔 | 是或否 | 必须 | 是 | 将输出规范化为概率。 转换后的数据集将是 P(topic|document),特征主题矩阵将是 P(word|topic)。 |
显示所有选项 | 布尔 | 是或否 | 必须 | False | 显示特定于 scikit-learn 联机 LDA 的其他参数。 |
Rho 参数 | Float | [0.00001;1.0] | 当选中“显示所有选项”复选框时应用 | 0.01 | 主题字词先验分布。 |
Alpha 参数 | Float | [0.00001;1.0] | 当选中“显示所有选项”复选框时应用 | 0.01 | 文档主题先验分布。 |
估计的文档数 | Integer | [1;int.MaxValue] | 当选中“显示所有选项”复选框时应用 | 1000 | 估计的文档数。 对应于 total_samples 参数。 |
批大小 | Integer | [1;1024] | 当选中“显示所有选项”复选框时应用 | 32 | 批大小。 |
学习速率更新计划中使用的迭代的初始值 | Integer | [0;int.MaxValue] | 当选中“显示所有选项”复选框时应用 | 0 | 用于对早期迭代的学习速率进行减权的初始值。 对应于 learning_offset 参数。 |
在更新期间应用于迭代的幂 | Float | [0.0;1.0] | 当选中“显示所有选项”复选框时应用 | 0.5 | 为了控制学习速率而应用于迭代计数的幂。 对应于 learning_decay 参数。 |
训练迭代次数 | Integer | [1;1024] | 当选中“显示所有选项”复选框时应用 | 25 | 训练迭代次数。 |
生成 N 元语法的字典 | 布尔 | 是或否 | 未选中“显示所有选项”复选框时应用 | True | 在计算 LDA 之前生成 N 元语法的字典。 适用于模型检查和解释。 |
N 元语法字典的最大大小 | Integer | [1;int.MaxValue] | 当“生成 N 元语法的字典”选项为“是”时应用 | 20000 | N 元语法字典的最大大小。 如果输入中的标记数超过此大小,则可能会发生冲突。 |
要用于特征哈希处理的位数。 | Integer | [1;31] | 当未选中“显示所有选项”复选框并且“生成 N 元语法的字典”为“否”时应用 | 12 | 要用于特征哈希处理的位数。 |
在 LDA 之前生成 N 元语法的字典 | 布尔 | 是或否 | 当选中“显示所有选项”复选框时应用 | True | 在 LDA 之前生成 N 元语法的字典。 适用于模型检查和解释。 |
字典中 N 元语法的最大数目 | Integer | [1;int.MaxValue] | 当选中了“显示所有选项”复选框并且“生成 N 元语法的字典”选项为“是”时应用 | 20000 | 字典的最大大小。 如果输入中的标记数超过此大小,则可能会发生冲突。 |
哈希位数 | Integer | [1;31] | 当选中了“显示所有选项”复选框并且“生成 N 元语法的字典”选项为“否”时应用 | 12 | 要在特征哈希处理期间使用的位数。 |
后续步骤
请参阅 Azure 机器学习可用的组件集。
有关特定于组件的错误列表,请参阅设计器的异常和错误代码。