词汇集合中的模式和分组

我需要找出5000个样本中多个词汇之间的相关性如何。

样本如下:

  1. 芒果,番石榴,荔枝,苹果
  2. 芒果,番石榴,荔枝,橙子
  3. 芒果,番石榴,菠萝,葡萄
  4. 钢笔,铅笔,书,复印本,笔记本
  5. 钢笔,铅笔,书,复印本,尺子

我们可以看到,第1和第2项非常接近。第3项与第1和第2项也非常接近。第4和第5项也非常接近。

我们可以使用什么方法和技术来检查这种相关性?

提前感谢!

修订:还需要帮助进行分组,例如A组包含第1、2、3行,B组包含第4和第5行?


回答:

这里有一种解决这个问题的办法。我使用scikit-learn将每个列表转换为文档-词矩阵。然后使用scipy.spacial.distance计算各行之间的余弦相似性矩阵。

from sklearn.feature_extraction.text import CountVectorizerfrom scipy.spatial import distancecount_vect = CountVectorizer(tokenizer=lambda x: x.split(', '))ls = ['mango, guava, litchi, apple',       'mango, guava, litchi, orange',      'mango, guava, pineapple, grape',      'pen, pencil, book, copy, notebook',      'pen, pencil, book, copy, scale']X = count_vect.fit_transform(ls).toarray()D = distance.cdist(X, X, metric='cosine')

输出是各行之间的距离矩阵,看起来如下:

[[ 0.  ,  0.25,  0.5 ,  1.  ,  1.  ], [ 0.25,  0.  ,  0.5 ,  1.  ,  1.  ], [ 0.5 ,  0.5 ,  0.  ,  1.  ,  1.  ], [ 1.  ,  1.  ,  1.  ,  0.  ,  0.2 ], [ 1.  ,  1.  ,  1.  ,  0.2 ,  0.  ]])

例如,D[0, 1]表示第1行与第2行接近,因为两行之间的距离较小。您还可以看到,D[3, 4]较小,这意味着第4行与第5行接近。

注意您也可以考虑使用distance.pdist(X, metric='cosine'),它只给出矩阵的下三角,因为下三角和上三角是相等的。

文档分组

为了更高级,您可以使用层次聚类将各行与计算出的距离矩阵聚类在一起。

from scipy.cluster import hierarchyD = distance.pdist(X, metric='cosine')Z = hierarchy.linkage(D, metric='euclidean')partition = hcluster.fcluster(Z, t=0.8, criterion='distance') # [2, 2, 2, 1, 1] 

这意味着文档1、2、3被分组到第2组中,4、5被分组到第1组中。如果您绘制树状图,您可以看到各行是如何聚类在一起的

from scipy.cluster.hierarchy import dendrogramimport matplotlib.pyplot as plthierarchy.dendrogram(Z, above_threshold_color='#bcbddc',                     orientation='top')

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注