基于聚类算法的文本热点问题挖掘算例实现(文本聚类)
在現(xiàn)實生活中,有時候我們可能得到一大堆無標(biāo)簽文本,這時候可能需要對文本進行聚類挖掘,找出熱點問題是什么。
文本聚類
第一步:數(shù)據(jù)讀取
import pandas as pd import re import jiebacsv='95598處理后.csv' file_txt=pd.read_csv(csv, header=0,encoding='gbk')# file_txt=file_txt.dropna()#刪除空值[4229 rows x 2 columns] print(file_txt.head())其他格式數(shù)據(jù)讀取方法
現(xiàn)實生活中 文本數(shù)據(jù)有可能不是表格,是txt文件。
txt讀取方法鏈接:
python讀取txt文件(多種方法)
這里簡單演示下讀取一個文件夾下的所有txt文件數(shù)據(jù).
原始文件夾 一張圖兩個txt
簡單演示啦下,讀取出來的數(shù)據(jù)有換行符\n。需要的時候正則化處理就可以啦。
如果是Word文字讀取,參考鏈接
python自動化辦公:word篇。職場高手不是夢。
第二步:預(yù)處理函數(shù)
去除數(shù)字字母 和停用詞
停用詞鏈接:nlp 中文停用詞數(shù)據(jù)集
第三步:數(shù)據(jù)預(yù)處理實現(xiàn)
其中clean_review代表去除數(shù)字字母后的文本,cut_review代表去除停用詞后的文本
第四步:tf-idf
from sklearn.feature_extraction.text import CountVectorizer#詞袋 from sklearn.feature_extraction.text import TfidfTransformer#tfidf #詞袋計數(shù) count_vect = CountVectorizer() X = count_vect.fit_transform(file_txt['cut_review'])#tf-idf tfidf_transformer = TfidfTransformer() X_tfidf = tfidf_transformer.fit_transform(X) print(X_tfidf)第五步:手肘法選擇聚類中心數(shù)
①手肘法
手肘法的核心指標(biāo)是SSE(sum of the squared errors,誤差平方和),
其中,Ci是第i個簇,p是Ci中的樣本點,mi是Ci的質(zhì)心(Ci中所有樣本的均值),SSE是所有樣本的聚類誤差,代表了聚類效果的好壞。
手肘法的核心思想是:隨著聚類數(shù)k的增大,樣本劃分會更加精細,每個簇的聚合程度會逐漸提高,那么誤差平方和SSE自然會逐漸變小。并且,當(dāng)k小于真實聚類數(shù)時,由于k的增大會大幅增加每個簇的聚合程度,故SSE的下降幅度會很大,而當(dāng)k到達真實聚類數(shù)時,再增加k所得到的聚合程度回報會迅速變小,所以SSE的下降幅度會驟減,然后隨著k值的繼續(xù)增大而趨于平緩,也就是說SSE和k的關(guān)系圖是一個手肘的形狀,而這個肘部對應(yīng)的k值就是數(shù)據(jù)的真實聚類數(shù)。當(dāng)然,這也是該方法被稱為手肘法的原因。
from sklearn.cluster import KMeans import matplotlib.pyplot as plt# '利用SSE選擇k' SSE = [] # 存放每次結(jié)果的誤差平方和 for k in range(1, 9):estimator = KMeans(n_clusters=k) # 構(gòu)造聚類器estimator.fit(X_tfidf)SSE.append(estimator.inertia_) X = range(1, 9) plt.xlabel('k') plt.ylabel('SSE') plt.plot(X, SSE, 'o-') plt.show()從圖中看到,肘部并未明顯出現(xiàn),這時候我們應(yīng)該擴大更大數(shù)值如范圍1到10。 其實我們也隱約的知道 肘部數(shù)據(jù)為7或者8.我們就取7吧。
第六步:聚類實現(xiàn)
# K均值聚類 model_kmeans = KMeans(n_clusters=7,random_state=1) # 創(chuàng)建聚類模型對象 model_kmeans.fit(X_tfidf) # 訓(xùn)練模型 # 聚類結(jié)果 cluster_labels = model_kmeans.labels_ # 聚類標(biāo)簽結(jié)果 print(cluster_labels)第七步:結(jié)果拼接匯總
將聚類得到的標(biāo)簽和原始數(shù)據(jù)進行拼接.
我這里選擇的是將分詞結(jié)果和標(biāo)簽進行拼接。
可以拼接更多的數(shù)據(jù),如再加上原文。
第八步:統(tǒng)計每類詞匯
cat_desc = dict() biaoqian_values=[0,1,2,3,4,5,6]#聚類標(biāo)簽 for i in biaoqian_values:text = shuju.loc[shuju['標(biāo)簽'] == i, 'cut_review']text = (' '.join(map(str, text))).split(' ')cat_desc[i] = text print(cat_desc[2])#打印2類詞匯第九步:繪制高頻詞詞云
#詞云圖 #查看詞云 from collections import Counter from wordcloud import WordCloud def generate_wordcloud(tup):wordcloud = WordCloud(background_color='white',font_path='simhei.ttf',max_words=50, max_font_size=40,random_state=42).generate(str(tup))return wordcloud fig, axes = plt.subplots(4, 2, figsize=(30, 38))k = 0 for i in range(4):for j in range(2):most10 = Counter(cat_desc[k]).most_common(10)#10個高頻詞ax = axes[i, j]ax.imshow(generate_wordcloud(most10), interpolation="bilinear")ax.axis('off')ax.set_title("{} Top 10".format(k), fontsize=30)if k<6:k += 1plt.show()因為只有7個類別,我的畫布是(4,2)所以最后一幅圖畫2次
if k<6:
k += 1
本文給出的原始文本數(shù)據(jù) 都屬于電力工單,所以高頻詞云圖你看起來決定很相似。如果給出的原始文本數(shù)據(jù)多種多樣,飲食,體育,那結(jié)果顯示就不一樣的。
第10步:統(tǒng)計各類詞頻
如果你不想結(jié)果以詞云圖顯示,想以文本格式顯示。
總結(jié)
本文給出的文本數(shù)據(jù)例子可能不是太好。各類之間高度相似。
思路:分詞 ,tf-idf ,聚類 ,聚類結(jié)果和原始分詞拼接,繪制高頻詞云圖,統(tǒng)計各類高頻詞。
即可得到熱點問題是什么。
大家好,我是余登武。電氣工程的計算機萌新。寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝。
總結(jié)
以上是生活随笔為你收集整理的基于聚类算法的文本热点问题挖掘算例实现(文本聚类)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花呗可以分几期
- 下一篇: 自动化办公之excel教程(1):工作薄