我需要找出5000个样本中多个词汇之间的相关性如何。
样本如下:
- 芒果,番石榴,荔枝,苹果
- 芒果,番石榴,荔枝,橙子
- 芒果,番石榴,菠萝,葡萄
- 钢笔,铅笔,书,复印本,笔记本
- 钢笔,铅笔,书,复印本,尺子
我们可以看到,第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')