如何将彼此相似的文本问题分组?

How can I group text questions that are similar to each other?

我有一个包含 20 万个问题的数据集,我想按 similarity/duplicates 将它们分组。

如何使用 NLP/machine 学习将这些具有相似意图的问题归为一组?

给定一个问题和一个问题列表,我如何找到一个或多个相似或重复的问题?

是否有任何服务可以做到这一点?

通常,您希望将问题转换为抽象的数字格式(例如单个高维向量,或 'bags of words/vectors'),然后可以从中计算数字之间的成对相似度问题。

例如:您可以将每个问题转化为单个单词的单词向量的简单平均值。 (这些词向量可能来自您自己的训练语料库,与问题的使用领域完全匹配,或者来自其他一些足够好的外部来源。)

如果词向量是 300 维的,则将一个问题的所有词向量求平均,然后得到该问题的 300 维向量。然后,您可以使用矢量相似性的典型度量,例如 "cosine similarity",为每对问题获取从 -1.0 到 1.0 的数字,较大的值表示 "more similar"。

这种简单的方法通常是一个很好的基准。更聪明地删除一些单词,或根据观察到的重要性对单词加权(例如,通过 "TF/IDF" 加权)可能会改善它。

但是还有其他方法可以获得比简单平均值更好的汇总向量。一种相对简单的算法,在很大程度上类似于创建词向量的方式,被称为 "Paragraph Vectors",有时在流行的库(如 Python gensim)"Doc2Vec" 中被调用。这不是词向量的简单平均,而是为全文创建一个类似词的合成标记,然后对其进行训练以尽可能好地预测文本的单词。同样,一旦您拥有(例如)300 维文本向量,计算余弦相似度就可以对问题相似度进行排序。

还有一个名为 "Word Mover's Distance" 的有趣算法,它将文本作为每个组成词向量的可变大小包,就好像每个词向量都是一堆意义。然后它计算 "effort" 以将堆从一个文本的堆形状移动到另一个文本的堆 - 更少的努力似乎与人类对文本相似性的感觉密切相关。 (然而,找到这些最小偏移比简单的余弦相似性计算成本高很多——所以这最适用于短文本、小语料库,或者当你可以大规模并行计算时.)

一旦你有任何这些数字相似性度量工作,那么你还可以聚类算法来找到高度相关的问题组——通常一旦你有了这些组,这些组中最常见的词(如反对他人)或人类编辑工作,可以命名组。