如何使用聚类将具有相似意图的句子分组?
How to use clustering to group sentences with similar intents?
我正在尝试在 Python 中开发一个程序,该程序可以处理原始聊天数据并聚类具有相似意图的句子,以便将它们用作训练示例来构建新的聊天机器人。目标是使其尽可能快速和自动化(即无需手动输入参数)。
1- 对于特征提取,我对每个句子进行标记,提取其单词并使用 Sklearn 的 TfidfVectorizer 对其进行矢量化。
2- 然后我用 Sklearn 的 DBSCAN 对这些句子向量进行聚类。我选择这种聚类算法是因为它不需要用户指定所需的聚类数量(如 k-means 中的 k 参数)。它丢弃了很多句子(将它们视为异常值),但至少它的聚类是同质的。
整体算法适用于相对较小的数据集(10000 个句子)并生成有意义的聚类,但存在一些问题:
在大型数据集(例如 800000 个句子)上,DBSCAN 会失败,因为它需要太多内存,即使在云中强大的机器上进行并行处理也是如此。我需要一种计算成本较低的方法,但我找不到另一种不会产生奇怪和异构句子簇的算法。还有哪些其他选择?什么算法可以处理大量的高维数据?
DBSCAN 生成的聚类是具有相似措辞的句子(由于我的特征提取方法),但目标词并不总是代表意图。我怎样才能改进我的特征提取,以便更好地捕捉句子的意图?我尝试了 Doc2vec,但它似乎不适用于由句子大小的文档组成的小型数据集...
DBSCAN 的标准实现应该只需要 O(n) 内存。您不能低于此内存要求。但我在某处读到 sklearn 的 DBSCAN 实际上使用 O(n²) 内存,所以它不是最佳实现。您可能需要自己实现它,以使用更少的内存。
不要指望这些方法能够聚类"by intent"。无监督算法无法推断出意图。最有可能的是,集群将仅基于几个关键词。但这可能是人们说 "hi" 还是 "hello"。从无监督的角度来看,这种区别给出了两个很好的集群(和一些噪音,也许还有另一个集群 "hola")。
我建议根据您标记 "intent".
的子集训练 监督 特征提取
我正在尝试在 Python 中开发一个程序,该程序可以处理原始聊天数据并聚类具有相似意图的句子,以便将它们用作训练示例来构建新的聊天机器人。目标是使其尽可能快速和自动化(即无需手动输入参数)。
1- 对于特征提取,我对每个句子进行标记,提取其单词并使用 Sklearn 的 TfidfVectorizer 对其进行矢量化。
2- 然后我用 Sklearn 的 DBSCAN 对这些句子向量进行聚类。我选择这种聚类算法是因为它不需要用户指定所需的聚类数量(如 k-means 中的 k 参数)。它丢弃了很多句子(将它们视为异常值),但至少它的聚类是同质的。
整体算法适用于相对较小的数据集(10000 个句子)并生成有意义的聚类,但存在一些问题:
在大型数据集(例如 800000 个句子)上,DBSCAN 会失败,因为它需要太多内存,即使在云中强大的机器上进行并行处理也是如此。我需要一种计算成本较低的方法,但我找不到另一种不会产生奇怪和异构句子簇的算法。还有哪些其他选择?什么算法可以处理大量的高维数据?
DBSCAN 生成的聚类是具有相似措辞的句子(由于我的特征提取方法),但目标词并不总是代表意图。我怎样才能改进我的特征提取,以便更好地捕捉句子的意图?我尝试了 Doc2vec,但它似乎不适用于由句子大小的文档组成的小型数据集...
DBSCAN 的标准实现应该只需要 O(n) 内存。您不能低于此内存要求。但我在某处读到 sklearn 的 DBSCAN 实际上使用 O(n²) 内存,所以它不是最佳实现。您可能需要自己实现它,以使用更少的内存。
不要指望这些方法能够聚类"by intent"。无监督算法无法推断出意图。最有可能的是,集群将仅基于几个关键词。但这可能是人们说 "hi" 还是 "hello"。从无监督的角度来看,这种区别给出了两个很好的集群(和一些噪音,也许还有另一个集群 "hola")。
我建议根据您标记 "intent".
的子集训练 监督 特征提取