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

时间:2018-08-31 21:07:49

标签: machine-learning nlp word2vec

我有一个20万个问题的数据集,我想通过相似性/重复项将它们分组在一起。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

如果单词向量是300维的,则将一个问题的所有单词向量平均在一起,即可得到问题的300维向量。然后,您可以使用矢量相似度的典型度量(例如“余弦相似度”)为每对问题获取-1.0到1.0之间的数字,其中较大的值表示“更相似”。

这种简单的方法通常是一个很好的基准。精通丢弃某些单词,或通过观察到的重要性对单词加权(例如,通过“ TF / IDF”加权)可以改善它。

但是还有其他方法可以得到汇总向量,这些汇总向量可能比简单平均值更好。一种相对简单的算法,在很大程度上类似于创建单词矢量的方式,称为“段落矢量”,有时在流行的库(如Python gensim)中称为“ Doc2Vec”。这不是单词向量的简单平均,就像为全文创建合成的类似单词的标记一样,然后训练该单词尽可能地预测文本的单词。同样,一旦有了(例如)300维文本向量,计算余弦相似度就可以对问题相似度进行排名。

还有一个有趣的算法,称为“单词移动器的距离”,该算法将文本保留为每个组成单词矢量的大小可变的包,就像每个单词矢量都是一堆意思一样。然后,计算出将一堆从一个文本的堆积形状移动到另一文本的“努力”,而较少的努力似乎与人类的文本相似感相关。 (但是,找到这些最小偏移量比简单的余弦相似度要花很多 ,因此,这种方法最适合短文本或小语料库,或者可以大规模并行化计算时使用。) / p>

一旦您使用了这些数值相似性度量中的任何一种,那么您还可以将算法聚类以找到高度相关的问题组–通常,一旦拥有这些组,这些组中最常见的单词(相对于其他)或人工编辑工作可以为这些小组命名。