如何使用聚类对具有相似意图的句子进行分组?

Posted

技术标签:

【中文标题】如何使用聚类对具有相似意图的句子进行分组?【英文标题】:How to use clustering to group sentences with similar intents? 【发布时间】:2018-05-28 20:18:22 【问题描述】:

我正在尝试用 Python 开发一个程序,该程序可以处理原始聊天数据并聚类具有相似意图的句子,以便将它们用作构建新聊天机器人的训练示例。目标是使其尽可能快速和自动化(即无需手动输入参数)。

1- 对于特征提取,我对每个句子进行标记、词干化并使用 Sklearn 的 TfidfVectorizer 对其进行矢量化。

2- 然后我使用 Sklearn 的 DBSCAN 对这些句子向量进行聚类。我选择了这种聚类算法,因为它不需要用户指定所需的聚类数量(如 k-means 中的 k 参数)。它丢弃了很多句子(将它们视为异常值),但至少它的聚类是同质的。

整体算法适用于相对较小的数据集(10000 句)并生成有意义的集群,但存在一些问题:

在大型数据集(例如 800000 个句子)上,DBSCAN 会失败,因为它需要太多内存,即使在云中强大的机器上进行并行处理也是如此。我需要一种计算量较小的方法,但我找不到另一种不会产生怪异和异质句子簇的算法。还有哪些其他选择?什么算法可以处理大量高维数据?

DBSCAN 生成的集群是具有相似措辞的句子(由于我的特征提取方法),但目标词并不总是代表意图。如何改进特征提取,以便更好地捕捉句子的意图?我尝试了 Doc2vec,但它似乎不适用于由句子大小的文档组成的小型数据集...

【问题讨论】:

【参考方案1】:

DBSCAN 的标准实现应该只需要 O(n) 内存。您不能低于此内存要求。但我在某处读到 sklearn 的 DBSCAN 实际上使用 O(n²) 内存,所以它不是最佳实现。然后你可能需要自己实现它,以使用更少的内存。

不要期望这些方法能够“按意图”进行集群。无监督算法无法推断出预期的内容。最有可能的是,集群将仅基于几个关键词。但这可能是人们说“嗨”还是“你好”。从无监督的角度来看,这种区别给出了两个不错的集群(还有一些噪音,也许还有另一个集群“hola”)。

我建议根据您标记“意图”的子集训练监督特征提取。

【讨论】:

您可以考虑基于潜在狄利克雷分布的模型,例如 gensim.ldamodel,它可以帮助您将句子聚类到主题中。

以上是关于如何使用聚类对具有相似意图的句子进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 BERT 对相似的句子进行聚类

与示例句子列表相比,如何提取具有相似含义/意图的句子

聚类(尤其是字符串聚类)如何工作?

如何使用K-MEANS聚类算法解决分类问题

根据与 LDA 主题/特征集群的相似性对文本进行分组

使用光谱聚类对看不见的点进行聚类