文本挖掘学习(五) 文档相似度、文档聚类
1.文档相似度
基于词袋模型的基本思路
- 如果两个文档/两句话的用词越相似,他们的内容就越相似。因此可以从词频入手,计算他们的相似度
- 文档向量化之后,相似度的考察就直接转化为计算空间中距离的问题
- 缺陷:不能考虑否定词的巨大作用,不能考虑词序的作用
余弦相似度
- 两个向量间的夹角能够很好地反映其相似程度
- 但夹角大小使用不便,因此用夹角的余弦值作为相似度衡量指标
# 文本相似度
# 基于词袋模型计算
#countvec = CountVectorizer(min_df=5) # 在5个以上章节中出现才保留
#words_vec = countvec.fit_transform(words_list) # 得到一个稀疏矩阵,词频矩阵
from sklearn.metrics.pairwise import pairwise_distances
pairwise_distances(words_vec, metric='cosine')
# 使用TF-IDF矩阵进行相似度计算
pairwise_distances(tfidf, metric='cosine')
doc2vec
- 较短的文档如果希望计算文本相似度,可以将各自内部的word2vec向量分别进行平均,用平均后的向量作为文本向量,从而用于计算相似度
2.文档聚类
文档聚类问题在本质上已经和普通的聚类分析没有区别
# 文档聚类
# 为章节添加名称标签
chap.index = [df.txt[df.chap == i].iloc[0] for i in chap.index]
# tfidf
# 进行聚类分析
from sklearn.cluster import KMeans
clf = KMeans(n_clusters=5) # 聚为5类
s = clf.fit(tfidf)
print(s)
clf.cluster_centers_
chap['clsres'] = clf.labels_
chapgrp = chap.groupby('clsres')
chapcls = chapgrp.agg(sum) # 自动转为合并字符串
chapclsres = chapcls.txt.apply(text_cut)
chapclsres
# 列出关键词以刻画类别特征
import jieba.analyse as ana
for item in chapclsres:
print(ana.extract_tags(item, topK=10))