如何使用聚类对具有相似意图的句子进行分组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用聚类对具有相似意图的句子进行分组?相关的知识,希望对你有一定的参考价值。
我正在尝试用Python开发一个程序,它可以处理具有类似意图的原始聊天数据和集群句子,因此它们可以用作构建新聊天机器人的训练示例。目标是使其尽可能快速和自动(即没有手动输入的参数)。
1-对于特征提取,我对每个句子进行标记,使用Sklearn的TfidfVectorizer对其单词进行标记并对其进行矢量化。
2-然后我用Sklearn的DBSCAN对那些句子向量进行聚类。我选择了这种聚类算法,因为它不需要用户指定所需的聚类数量(如k-means中的k参数)。它抛弃了很多句子(将它们视为异常值),但至少它的簇是同质的。
整体算法适用于相对较小的数据集(10000个句子)并生成有意义的集群,但存在一些问题:
- 在大型数据集(例如800000个句子)上,DBSCAN失败是因为它需要太多内存,即使在云中的强大机器上进行并行处理也是如此。我需要一个计算成本较低的方法,但我找不到另一种算法,它不会产生奇怪和异构的句子簇。还有哪些其他选择?什么算法可以处理大量的高维数据?
- 由DBSCAN生成的聚类是具有相似措辞的句子(由于我的特征提取方法),但是目标词并不总是表示意图。如何改进我的特征提取,以便更好地捕捉句子的意图?我尝试了Doc2vec,但它似乎不适用于由句子大小的文档组成的小数据集......
答案
DBSCAN的标准实现应该只需要O(n)内存。你不能低于这个内存要求。但我读到某个地方,sklearn的DBSCAN实际上使用O(n²)内存,所以它不是最佳实现。您可能需要自己实现,以减少内存使用。
不要指望这些方法能够“按意图”聚类。无监督算法无法推断出预期的内容。最有可能的是,群集只是基于几个关键词。但这可能是人们说“喜”还是“你好”。从无人监督的角度来看,这种区别给出了两个不错的集群(以及一些噪声,也许还有另一个集群“hola”)。
我建议基于您标记“意图”的子集来训练有监督的特征提取。
以上是关于如何使用聚类对具有相似意图的句子进行分组?的主要内容,如果未能解决你的问题,请参考以下文章