基于ML的中文短文本聚类
整个过程分为以下几个步骤:
- 语料加载
- 分词
- 去停用词
- 抽取词向量特征
- 实战tf-idf的中文文本K-means聚类
- 实战word2Vec的中文文本k-means聚类
一、引入,python 依赖包,并加载语料
import random
import jieba
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import gensim
from gensim.models import Word2Vec
from sklearn.preprocessing import scale
import multiprocessing
#读取语料
content=pd.read_excel(r'./data/文本.xlsx',sheet_name=0)
二、加载停用词和添加关键词,生成训练数据
#加载停用词,可以自定义停用词
stopwords = ['没有','他说']
with open(r"./data/stopwords.txt", 'r', encoding='gbk') as f:
lines = f.readlines()
for line in lines:
stopwords.append(line.strip())
#jieba添加不想拆分的关键词
key_words=['账单分期','服务费']
for word in key_words:
jieba.add_word(word)
#生成训练数据
sentences=[]
for i in range(data.shape[0]):
sentence=' '.join([word for word in jieba.cut(re.sub(r"[\<\>,\s.'坐席客户中性负向ok两毛分一二三四五六七八九十万千\(\)\d-]|\[|\]",'',data['content'][i])) if word not in stopwords])
sentences.append(sentence)
sentences类似于以下格式:
sentences= [
‘帮您 张卡 停掉 张卡 卡 停掉 挂失 挂失 un 挂失.’,
'卡主 本人 卡 冻结 下 手机 掉 办理 挂失 卡主 本人 本人 清楚 卡号 清楚 ‘,
‘最近 做 交易 没有 没有 做过 交易 银行 张卡.’,
’ 临时身份证 才 柜台 去 补办银行卡 再 问下’,
]
三、抽取词向量特征
TfidfVectorizer的关键参数:
- max_df:这个给定特征可以应用在 tf-idf 矩阵中,用以描述单词在文档中的最高出现率。假设一个词(term)在 80% 的文档中都出现过了,那它也许(在剧情简介的语境里)只携带非常少信息。
- min_df:可以是一个整数(例如5)。意味着单词必须在 5 个以上的文档中出现才会被纳入考虑。设置为 0.2;即单词至少在 20% 的文档中出现 。
- ngram_range:这个参数将用来观察一元模型(unigrams),二元模型( bigrams) 和三元模型(trigrams)。参考n元模型(n-grams)
#将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5)
#统计每个词语的tf-idf权值
transformer = TfidfTransformer()
# 第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
tfidf = transformer.fit_transform(vectorizer.fit_transform(sentences))
# 获取词袋模型中的所有词语
word = vectorizer.get_feature_names()
# 将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
weight = tfidf.toarray()
实战TF-IDF的中文文本K-means聚类
使用k-means++来初始化模型,当然也可以选择随机初始化,即init=‘random’,然后通过PCA降维到10维度上,进行聚类训练
numClass=5 #聚类分几簇
clf=KMeans(n_clusters=numClass,max_iter=10000,init="k-means++",tol=1e-6)
pca = PCA(n_components=2) # 输出两维
newData = pca.fit_transform(weight) # 载入N维
result = list(clf.predict(TnewData))
四、可视化聚类结果
绘图:
plot_cluster(result,newData,numClass)
结果如下: