如何根据句子相似度创建聚类?

数据挖掘 机器学习 数据挖掘 nlp 聚类 无监督学习
2022-02-12 16:39:43

我有如下数据。数据是一组相似的句子,但中间很少有独特的词,如 TABLEA、TABLEB 等。

java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 3523] [SQLState 42000] The user does not have SELECT access to TABLEA
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 3523] [SQLState 42000] The user does not have SELECT access to TABLEC
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 3523] [SQLState 42000] The user does not have SELECT access to TABLEB
Dataframe read is null 
Dataframe read is null     
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 3807] [SQLState 42S02] Object Y  does not exist.
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 3807] [SQLState 42S02] Object Z  does not exist.
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 2652] [SQLState HY000] Operation not allowed: TABLEK is being Loaded.
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.22] [Error 9804] [SQLState HY000] Response Row size or Constant Row size overflow.
java.sql.SQLException: [Teradata JDBC Driver] [TeraJDBC 15.10.00.22] [Error 1000] [SQLState 08S01] Login failure for Connection to xxx.xx.xx.xx Tue Dec 04 02:49:47 MST 2018 

问题陈述: 我想对数据进行分组/集群,并为每个组/集群提供一个唯一的编号。

假设

  1. 应该基于相似性形成组/集群。相似的句子应该归为一组
  2. 这应该是无监督学习。如果将来出现一些与现有集群不太相似的新句子,它应该创建一个新的组/集群。
  3. 句子可以是任意长度
  4. 句子之间的常用词可以出现在任何地方——字符串的开头、中间、结尾等等
  5. 单词的顺序很重要

输出:

结果应该是如下类别的维度表 在此处输入图像描述

虽然我确实得到了抽象形式的问题陈述,但我不知道具体的方法。

到目前为止,我已经阅读了使用余弦相似度等各种算法的文本聚类,但我不确定这是否足以满足这个问题陈述。这里的主要问题之一是,它是无监督的。如果有任何相似度非常低的新句子,那么它应该创建一个新组。

大图是这样的

  1. 获取所有未分类/未分类的列表(我在这里可以互换使用,因为我不确定它属于哪一个)语句

  2. 检查维度表,通过使用一些相似性阈值进行匹配(对此不清楚)。

  3. 如果相似度匹配高于阈值,则什么也不做

  4. 如果相似度较低,则在维度表中创建一个新组,其中包含常用词的描述列。

我还没有确定解决这个问题的最佳方法是什么。请推荐一些算法或方法来解决这个问题。

3个回答

对于这个问题,我将从一个简单的词袋模型开始,并将其用作基线。

这是一个例子:https : //medium.com/@MSalnikov/text-clustering-with-k-means-and-tf-idf-f099bcf95183,http: //brandonrose.org/clustering

对于日志,这可能就足够了,因为它可以轻松过滤掉日期等常用词。

如果这对于给定的用例不起作用,下一步是尝试 Doc2Vec 和将句子投影到向量空间的类似方法。

另一种选择是使用带有回归的 doc2vec。一个例子是将每个错误拆分并标记为可能清理标点符号的单词。您使用整个语料库训练 doc2vec,然后可以推断每个错误的向量。此时,您运行一对其他回归,如果文档向量不属于此类别,则得分为 0,如果属于此类别,则得分为 1。

阅读我的sensimark项目的代码。

聚类在这里可能是错误的工具。检查假设...

真正要寻找的是频繁子序列