基于ML的中文短文本聚类

基于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)

结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值