基于 n-gram 和相似度的文本分类

数据挖掘 Python 聚类 数据科学模型 相似 文本分类
2021-09-25 18:22:19

我尝试使用 k-means 聚类对数百个文本进行聚类。我想考虑其他算法来根据其内容对文本进行分组,并尝试发现与其他新闻无关的新闻(主题不同)。我想知道是否有其他方法/算法可用于根据文本的相似度将文本分为两个或多个组。假设我有数千个使用相同关键字但在不同上下文中的文本。有些文本可能具有相同的句子结构,例如:

The pen is on the table
The black pen is on the table. 
Where is my pen? Your pen is on the table.
I cannot find my pen. I was using it a few minutes ago.

我希望能够根据它们的结构对上面的句子进行聚类,即使用n手动设置的 n-gram。

通过这种方式,我应该能够将前三个句子包含在同一个集群中,因为与最后一个句子相比,它们在使用相同/相似词时的相似度更高。它是关于计算每个句子与其他句子的相似性。

你知道我该怎么做吗?

1个回答

首先,在您的问题和标签中,您交替使用了聚类分类。要小心,因为它们是完全不同的问题。我将全面介绍如何对文本进行编码并找到相似之处,这样你就可以很好地完成其中的任何一个。

经典解决方案

正如您所提到的,n-gram 建模和使用 Bag of Words 变体(例如 Tf-Idf)是经典的解决方案。这种方法有几点:

  1. 它不模拟句子中单词的顺序。因此,每个文档/句子都被建模为一组词汇,而不管它们的位置顺序如何。使用 n 大于 1 的 n-gram 模型,您可以捕捉到单词的一些并发,但仍远不能理解文本。
  2. TF-IDF 本质上是稀疏的(矩阵中有大量维度和大量零值)。对于简短的文档(例如您的例句),它将以具有少量值和其他维度的大量零的向量结束。正如我将解释的那样,您将需要减少该维度。
  3. 如果您将在分类或文本搜索问题中使用它,它无法处理词汇表之外的单词。
  4. 它的好处是它非常简单,并且可以作为此类任务的基本算法。TF-IDF 背后的信息论概念对文档中的单词进行了精美的加权,例如停用词将被自动忽略。

如何

  1. 生成 TF-IDF 矩阵
  2. 奇异值分解应用于您的矩阵,以将维度减少到k维,其中k是您的语料库中不同主题的数量。你得到一个m×k 矩阵返回,它是 TF-IDF 的简化版本。 n 是您的文件数量和 k 其中不同主题的数量
  3. 您只需在此矩阵上运行聚类算法并获得结果。

您在上面所做的称为潜在语义分析BoW 模型中最好的主题建模。

如何选择k 只是形象化!使用不同的值k并使用t-SNEUMAP(实际上使用 UMAP!我刚刚提到 t-SNE 为了我的答案的完整性)在二维中可视化您的数据并尝试猜测什么是最好的k. 请注意,聚类问题没有评估。归根结底,这是一个智能搜索。

使用现代工具的经典解决方案

增加上述管道中UMAP的使用。它是一种非常强大的非线性降维和可视化算法。您可以直接将您的 TF-IDF 输入 UMAP 并查看结果,或者在应用 SVD 后,尝试使用 UMAP 进行可视化和维度减少。

NLP/NLU 的现代方法

基于神经的语言建模有着悠久的历史,这里不在讨论范围内,但在 2018 年,Google 发布了一种算法,这是 NLP 领域的一个突破,如今被广泛使用。它被称为BERT一家名为HuggingFace的初创公司在 Pytorch 和 Tensorflow 中为 BERT 实现了一个易于使用的软件包,称为Transformers对于您的用例,我推荐来自德国达姆施塔特技术大学的另一个软件包,称为sentence-transformers,它基于SBERT (Sentence-BERT)您可以在他们的 repo 中轻松找到文档相似性搜索的示例代码,例如,这是您问题的精确解决方案

如果有其他问题,请发表评论。

祝你好运!