日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于聚类算法的文本热点问题挖掘算例实现(文本聚类)

發(fā)布時間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于聚类算法的文本热点问题挖掘算例实现(文本聚类) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在現(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

import os import re#首先定義規(guī)則,如我們需要把所有的txt文件pattern=re.compile(r'.+\.txt')for root ,dirs,files in os.walk(r'C:\Users\Shineion\Desktop\新建文件夾'):for name in files:file_path=os.path.join(root,name)#包含路徑的文件matching=pattern.search(file_path)#匹配txtif matching:command_line =file_path.replace('/', '\\') #\\ 變 \print(command_line)f = open(command_line,encoding='utf')data = f.readlines() # 直接將文件中按行讀到list里,效果與方法2一樣f.close() # 關(guān)print(data) # 返回list

簡單演示啦下,讀取出來的數(shù)據(jù)有換行符\n。需要的時候正則化處理就可以啦。

如果是Word文字讀取,參考鏈接
python自動化辦公:word篇。職場高手不是夢。

第二步:預(yù)處理函數(shù)
去除數(shù)字字母 和停用詞
停用詞鏈接:nlp 中文停用詞數(shù)據(jù)集

# 定義刪除除字母,數(shù)字,漢字以外的所有符號的函數(shù) def remove_punctuation(line):line = str(line)if line.strip() == '':return ''rule = re.compile(u"[^a-zA-Z0-9\u4E00-\u9FA5]")line = rule.sub('', line)return line#停用詞 def stopwordslist(filepath):stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()]return stopwords

第三步:數(shù)據(jù)預(yù)處理實現(xiàn)
其中clean_review代表去除數(shù)字字母后的文本,cut_review代表去除停用詞后的文本

# 加載停用詞 stopwords = stopwordslist("停用詞.txt")#去除標(biāo)點符號 file_txt['clean_review']=file_txt['ACCEPT_CONTENT'].apply(remove_punctuation) #去除停用詞 file_txt['cut_review']=file_txt['clean_review'].apply(lambda x:" ".join([w for w in list(jieba.cut(x)) if w not in stopwords])) print(file_txt.head())

第四步: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ù),如再加上原文。

#結(jié)果拼接 labels=pd.DataFrame(cluster_labels,columns=['標(biāo)簽'])shuju=pd.concat([file_txt['cut_review'],labels],axis=1) print(shuju)

第八步:統(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é)果以詞云圖顯示,想以文本格式顯示。

from collections import Counter for i in range(7):most10 = Counter(cat_desc[i]).most_common(10)print('第{0}類前10個高頻詞'.format(i),most10)

總結(jié)
本文給出的文本數(shù)據(jù)例子可能不是太好。各類之間高度相似。
思路:分詞 ,tf-idf ,聚類 ,聚類結(jié)果和原始分詞拼接,繪制高頻詞云圖,統(tǒng)計各類高頻詞。
即可得到熱點問題是什么。


大家好,我是余登武。電氣工程的計算機萌新。寫博文不容易。如果你覺得本文對你有用,請點個贊支持下,謝謝。

總結(jié)

以上是生活随笔為你收集整理的基于聚类算法的文本热点问题挖掘算例实现(文本聚类)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。