基于聚类算法的文本热点问题挖掘算例实现(文本聚类)
在現實生活中,有時候我們可能得到一大堆無標簽文本,這時候可能需要對文本進行聚類挖掘,找出熱點問題是什么。
文本聚類
第一步:數據讀取
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())其他格式數據讀取方法
現實生活中 文本數據有可能不是表格,是txt文件。
txt讀取方法鏈接:
python讀取txt文件(多種方法)
這里簡單演示下讀取一個文件夾下的所有txt文件數據.
原始文件夾 一張圖兩個txt
簡單演示啦下,讀取出來的數據有換行符\n。需要的時候正則化處理就可以啦。
如果是Word文字讀取,參考鏈接
python自動化辦公:word篇。職場高手不是夢。
第二步:預處理函數
去除數字字母 和停用詞
停用詞鏈接:nlp 中文停用詞數據集
第三步:數據預處理實現
其中clean_review代表去除數字字母后的文本,cut_review代表去除停用詞后的文本
第四步:tf-idf
from sklearn.feature_extraction.text import CountVectorizer#詞袋 from sklearn.feature_extraction.text import TfidfTransformer#tfidf #詞袋計數 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)第五步:手肘法選擇聚類中心數
①手肘法
手肘法的核心指標是SSE(sum of the squared errors,誤差平方和),
其中,Ci是第i個簇,p是Ci中的樣本點,mi是Ci的質心(Ci中所有樣本的均值),SSE是所有樣本的聚類誤差,代表了聚類效果的好壞。
手肘法的核心思想是:隨著聚類數k的增大,樣本劃分會更加精細,每個簇的聚合程度會逐漸提高,那么誤差平方和SSE自然會逐漸變小。并且,當k小于真實聚類數時,由于k的增大會大幅增加每個簇的聚合程度,故SSE的下降幅度會很大,而當k到達真實聚類數時,再增加k所得到的聚合程度回報會迅速變小,所以SSE的下降幅度會驟減,然后隨著k值的繼續增大而趨于平緩,也就是說SSE和k的關系圖是一個手肘的形狀,而這個肘部對應的k值就是數據的真實聚類數。當然,這也是該方法被稱為手肘法的原因。
from sklearn.cluster import KMeans import matplotlib.pyplot as plt# '利用SSE選擇k' SSE = [] # 存放每次結果的誤差平方和 for k in range(1, 9):estimator = KMeans(n_clusters=k) # 構造聚類器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()從圖中看到,肘部并未明顯出現,這時候我們應該擴大更大數值如范圍1到10。 其實我們也隱約的知道 肘部數據為7或者8.我們就取7吧。
第六步:聚類實現
# K均值聚類 model_kmeans = KMeans(n_clusters=7,random_state=1) # 創建聚類模型對象 model_kmeans.fit(X_tfidf) # 訓練模型 # 聚類結果 cluster_labels = model_kmeans.labels_ # 聚類標簽結果 print(cluster_labels)第七步:結果拼接匯總
將聚類得到的標簽和原始數據進行拼接.
我這里選擇的是將分詞結果和標簽進行拼接。
可以拼接更多的數據,如再加上原文。
第八步:統計每類詞匯
cat_desc = dict() biaoqian_values=[0,1,2,3,4,5,6]#聚類標簽 for i in biaoqian_values:text = shuju.loc[shuju['標簽'] == 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
本文給出的原始文本數據 都屬于電力工單,所以高頻詞云圖你看起來決定很相似。如果給出的原始文本數據多種多樣,飲食,體育,那結果顯示就不一樣的。
第10步:統計各類詞頻
如果你不想結果以詞云圖顯示,想以文本格式顯示。
總結
本文給出的文本數據例子可能不是太好。各類之間高度相似。
思路:分詞 ,tf-idf ,聚類 ,聚類結果和原始分詞拼接,繪制高頻詞云圖,統計各類高頻詞。
即可得到熱點問題是什么。
大家好,我是余登武。電氣工程的計算機萌新。寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝。
總結
以上是生活随笔為你收集整理的基于聚类算法的文本热点问题挖掘算例实现(文本聚类)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花呗可以分几期
- 下一篇: 只有银行卡号能取钱吗