MALLET 的最佳主题建模工作流程是什么?
What is the optimal topic-modelling workflow with MALLET?
简介
我想知道其他主题建模者认为什么是从预处理到维护的最佳主题建模工作流程。虽然这个问题包含许多子问题(我将在下面指定),但我相信这个线程对我自己和其他有兴趣了解端到端流程最佳实践的人很有用。
建议的解决方案规格
我希望建议的解决方案最好依赖 R 进行文本处理(但 Python 也可以) 和主题建模本身将在 MALLET 中完成(尽管如果您认为其他解决方案效果更好,请告诉我们)。我倾向于在 R
中使用 topicmodels
包,但是我想切换到 MALLET
,因为它比 topicmodels
有很多好处。它可以处理大量数据,不依赖于特定的文本预处理工具,而且似乎广泛用于此目的。然而,下面概述的一些问题也与 topicmodels
相关。我想知道其他人如何处理主题建模以及可以改进以下哪些步骤。欢迎任何有用的建议。
大纲
它的工作原理如下:我将完成我认为运行良好的工作流程,并且我将概述每个步骤中的问题。
提议的工作流程
1。纯文本
这涉及删除标点符号、数字、停用词、词干词和其他文本处理任务。其中许多可以作为术语文档矩阵分解的一部分通过函数来完成,例如来自 R
包 tm
.
的 TermDocumentMatrix
问题: 然而,这可能需要直接对文本字符串执行,使用 gsub
等函数,以便 MALLET 使用这些字符串。直接在字符串上执行不如涉及重复有效(例如,同一个词必须多次提取)
2。构造特征
在这一步中,我们构建了一个术语文档矩阵 (TDM),然后根据频率和 TF-IDF 值过滤术语。最好将您的功能包限制在大约 1000 个左右。接下来检查条款并确定需要 (1) 删除(一些停用词会通过),(2) 重命名 或(3) 与现有条目合并。虽然我熟悉 stem-completion 的概念,但我发现它很少能很好地工作。
问题: (1) 不幸的是 MALLET
不适用于 TDM 构造并使用您的 TDM,您需要找到原始 TDM(未删除任何功能)与您满意的 TDM 之间的区别。这种差异将成为 MALLET 的停用词。 (2) 在那张纸条上,我还想指出 selection 功能确实需要大量的手动工作,如果有人对如何最小化它有想法,请分享您的想法。
旁注: 如果您决定单独使用 R
,那么我可以推荐具有 [=22= 功能的 quanteda
包] 接受 thesaurus
作为参数之一。这个同义词库允许捕获 模式 (通常是正则表达式)而不是单词本身,因此例如你可以有一个匹配 sign-up
的模式 \bsign\w*.?ups?
,signed up
等等。
3。找到最佳参数
这很难。我倾向于将数据分解为测试训练集和 运行 交叉验证拟合 k
主题的模型并使用留出的数据测试拟合度。记录并比较不同主题分辨率的对数似然。
问题: 对数似然确实有助于理解拟合的好坏,但 (1) 它通常倾向于暗示我需要比实际合理更多的主题,并且 (2) 考虑到拟合模型通常需要多长时间,几乎不可能找到或测试最佳值的网格,例如迭代, alpha、老化等。
旁注: 当 select 优化主题数量时,我通常 select 将一系列主题递增 5 左右作为递增 a 1 的范围通常需要很长时间才能计算。
4。维护
很容易将新数据分类到一组现有主题中。但是,如果您 运行 随着时间的推移对其进行调整,您自然会期望您的某些主题可能不再相关,而可能会出现新主题。此外,研究主题的生命周期可能会很有趣。这很难解释,因为您正在处理一个需要无监督解决方案的问题,但要随着时间的推移对其进行跟踪,您需要以有监督的方式处理它。
问题:要解决上述问题,您需要(1)将新数据放入旧主题集, (2) 基于新数据构建新主题模型 (3) 随时间监控对数似然值并设计从旧数据切换的阈值到新的; (4) 以某种方式合并新旧解决方案,以便向外行观察者揭示主题的演变。
问题回顾
MALLET
消耗数据的字符串清理效率低下。
- 功能 selection 需要手动工作。
- 最佳主题数select基于 LL 的离子没有考虑实际合理的内容
- 计算复杂性不提供找到最佳参数网格(主题数量除外)的机会
- 随着时间的推移维护主题会带来具有挑战性的问题,因为您必须保留历史,但也要反映当前相关的内容。
如果你已经读到这里了,我要感谢你,这是一个相当长的 post。如果您对建议感兴趣,请随时在您认为相关的评论中添加更多问题,或者就如何克服其中一些问题提出您的想法。
干杯
感谢您的详尽总结!
作为 topicmodels
的替代方案,请尝试使用 R 中的包 mallet
。它在 JVM 中直接从 R 运行 Mallet,并允许您将结果提取为 R 表。我希望很快发布一个新版本,与 tm
结构的兼容性是其他人所要求的。
澄清一下,文档 的长度最多约为 1000 个标记(不是 词汇表)是个好主意。再多,您就会开始丢失有用的信息。该模型的假设是给定文档中标记的位置不会告诉您有关该标记主题的任何信息。对于较长的文档,情况很少如此,因此有助于将它们分解。
我要补充的另一点是文件太短也可能是个问题。例如,推文似乎没有提供足够的有关单词共现的上下文信息,因此该模型通常会演化为每个文档一个主题的聚类算法。组合多个相关的短文档可以产生很大的不同。
词汇管理实际上是主题建模工作流程中最具挑战性的部分。在标记化之前用单个标记替换选定的多词术语(例如通过将空格换成下划线)是一个很好的主意。词干提取几乎从来没有用处,至少对于英语而言是这样。自动化方法可以帮助词汇管理,但这一步对结果有深远的影响(远远超过主题的数量),我不愿意鼓励人们完全信任任何系统。
参数:我认为主题数量不正确。我建议使用一些提供适合您的应用程序的粒度的主题。当您的主题太少时,可能性通常可以检测到,但在达到阈值后,它不会提供太多有用的信息。使用超参数优化也会使模型对此设置的敏感度大大降低,这可能会减少您需要搜索的参数数量。
话题漂移:这不是一个很好理解的问题。更多真实世界语料库变化的例子会很有用。寻找词汇量的变化(例如,词汇表外单词的比例)是衡量模型拟合程度的快速指标。
简介
我想知道其他主题建模者认为什么是从预处理到维护的最佳主题建模工作流程。虽然这个问题包含许多子问题(我将在下面指定),但我相信这个线程对我自己和其他有兴趣了解端到端流程最佳实践的人很有用。
建议的解决方案规格
我希望建议的解决方案最好依赖 R 进行文本处理(但 Python 也可以) 和主题建模本身将在 MALLET 中完成(尽管如果您认为其他解决方案效果更好,请告诉我们)。我倾向于在 R
中使用 topicmodels
包,但是我想切换到 MALLET
,因为它比 topicmodels
有很多好处。它可以处理大量数据,不依赖于特定的文本预处理工具,而且似乎广泛用于此目的。然而,下面概述的一些问题也与 topicmodels
相关。我想知道其他人如何处理主题建模以及可以改进以下哪些步骤。欢迎任何有用的建议。
大纲
它的工作原理如下:我将完成我认为运行良好的工作流程,并且我将概述每个步骤中的问题。
提议的工作流程
1。纯文本
这涉及删除标点符号、数字、停用词、词干词和其他文本处理任务。其中许多可以作为术语文档矩阵分解的一部分通过函数来完成,例如来自 R
包 tm
.
TermDocumentMatrix
问题: 然而,这可能需要直接对文本字符串执行,使用 gsub
等函数,以便 MALLET 使用这些字符串。直接在字符串上执行不如涉及重复有效(例如,同一个词必须多次提取)
2。构造特征
在这一步中,我们构建了一个术语文档矩阵 (TDM),然后根据频率和 TF-IDF 值过滤术语。最好将您的功能包限制在大约 1000 个左右。接下来检查条款并确定需要 (1) 删除(一些停用词会通过),(2) 重命名 或(3) 与现有条目合并。虽然我熟悉 stem-completion 的概念,但我发现它很少能很好地工作。
问题: (1) 不幸的是 MALLET
不适用于 TDM 构造并使用您的 TDM,您需要找到原始 TDM(未删除任何功能)与您满意的 TDM 之间的区别。这种差异将成为 MALLET 的停用词。 (2) 在那张纸条上,我还想指出 selection 功能确实需要大量的手动工作,如果有人对如何最小化它有想法,请分享您的想法。
旁注: 如果您决定单独使用 R
,那么我可以推荐具有 [=22= 功能的 quanteda
包] 接受 thesaurus
作为参数之一。这个同义词库允许捕获 模式 (通常是正则表达式)而不是单词本身,因此例如你可以有一个匹配 sign-up
的模式 \bsign\w*.?ups?
,signed up
等等。
3。找到最佳参数
这很难。我倾向于将数据分解为测试训练集和 运行 交叉验证拟合 k
主题的模型并使用留出的数据测试拟合度。记录并比较不同主题分辨率的对数似然。
问题: 对数似然确实有助于理解拟合的好坏,但 (1) 它通常倾向于暗示我需要比实际合理更多的主题,并且 (2) 考虑到拟合模型通常需要多长时间,几乎不可能找到或测试最佳值的网格,例如迭代, alpha、老化等。
旁注: 当 select 优化主题数量时,我通常 select 将一系列主题递增 5 左右作为递增 a 1 的范围通常需要很长时间才能计算。
4。维护
很容易将新数据分类到一组现有主题中。但是,如果您 运行 随着时间的推移对其进行调整,您自然会期望您的某些主题可能不再相关,而可能会出现新主题。此外,研究主题的生命周期可能会很有趣。这很难解释,因为您正在处理一个需要无监督解决方案的问题,但要随着时间的推移对其进行跟踪,您需要以有监督的方式处理它。
问题:要解决上述问题,您需要(1)将新数据放入旧主题集, (2) 基于新数据构建新主题模型 (3) 随时间监控对数似然值并设计从旧数据切换的阈值到新的; (4) 以某种方式合并新旧解决方案,以便向外行观察者揭示主题的演变。
问题回顾
MALLET
消耗数据的字符串清理效率低下。- 功能 selection 需要手动工作。
- 最佳主题数select基于 LL 的离子没有考虑实际合理的内容
- 计算复杂性不提供找到最佳参数网格(主题数量除外)的机会
- 随着时间的推移维护主题会带来具有挑战性的问题,因为您必须保留历史,但也要反映当前相关的内容。
如果你已经读到这里了,我要感谢你,这是一个相当长的 post。如果您对建议感兴趣,请随时在您认为相关的评论中添加更多问题,或者就如何克服其中一些问题提出您的想法。
干杯
感谢您的详尽总结!
作为 topicmodels
的替代方案,请尝试使用 R 中的包 mallet
。它在 JVM 中直接从 R 运行 Mallet,并允许您将结果提取为 R 表。我希望很快发布一个新版本,与 tm
结构的兼容性是其他人所要求的。
澄清一下,文档 的长度最多约为 1000 个标记(不是 词汇表)是个好主意。再多,您就会开始丢失有用的信息。该模型的假设是给定文档中标记的位置不会告诉您有关该标记主题的任何信息。对于较长的文档,情况很少如此,因此有助于将它们分解。
我要补充的另一点是文件太短也可能是个问题。例如,推文似乎没有提供足够的有关单词共现的上下文信息,因此该模型通常会演化为每个文档一个主题的聚类算法。组合多个相关的短文档可以产生很大的不同。
词汇管理实际上是主题建模工作流程中最具挑战性的部分。在标记化之前用单个标记替换选定的多词术语(例如通过将空格换成下划线)是一个很好的主意。词干提取几乎从来没有用处,至少对于英语而言是这样。自动化方法可以帮助词汇管理,但这一步对结果有深远的影响(远远超过主题的数量),我不愿意鼓励人们完全信任任何系统。
参数:我认为主题数量不正确。我建议使用一些提供适合您的应用程序的粒度的主题。当您的主题太少时,可能性通常可以检测到,但在达到阈值后,它不会提供太多有用的信息。使用超参数优化也会使模型对此设置的敏感度大大降低,这可能会减少您需要搜索的参数数量。
话题漂移:这不是一个很好理解的问题。更多真实世界语料库变化的例子会很有用。寻找词汇量的变化(例如,词汇表外单词的比例)是衡量模型拟合程度的快速指标。