使用K-means及TF-IDF算法對(duì)中文文本聚類(lèi)并可視化

點(diǎn)擊查看原文

對(duì)于無(wú)監(jiān)督學(xué)習(xí)來(lái)說(shuō)综芥,聚類(lèi)算法對(duì)于數(shù)據(jù)挖掘牵囤、NLP處理等方向都有著非常重要的地位斗塘。常見(jiàn)的聚類(lèi)算法比如K-means、BIRCH(Balanced Iterative Reducing and Clustering Using Hierarchies)止剖、GMM(Gaussian mixture model)腺阳、GAAC(Group-average Agglomerative Clustering)等,但是用得最普遍的還是K-means算法穿香,其時(shí)間復(fù)雜度低且實(shí)現(xiàn)的效果較好受到廣泛的應(yīng)用亭引。

本文代碼的相關(guān)環(huán)境為:

  • python3以上
  • sklearn 機(jī)器學(xué)習(xí)常用包
  • jieba 中文分詞
  • matplotlib 可視化

準(zhǔn)備語(yǔ)料

語(yǔ)料格式為每行表示一個(gè)文檔(語(yǔ)句、文章等需要聚類(lèi)的文本)皮获,行數(shù)表示需要聚類(lèi)的所有文本焙蚓。
類(lèi)似這樣的:


image.png

導(dǎo)入相關(guān)包

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.manifold import TSNE
from sklearn.cluster import KMeans
from data_utils import *
import jieba
import matplotlib.pyplot as plt

加載語(yǔ)料

# bigram分詞
segment_bigram = lambda text: " ".join([word + text[idx + 1] for idx, word in enumerate(text) if idx < len(text) - 1])
# 結(jié)巴中文分詞
segment_jieba = lambda text: " ".join(jieba.cut(text))

'''
    1、加載語(yǔ)料
'''
corpus = []
with open("sanhu.txt", "r", encoding="utf-8") as f:
    for line in f:
        # 去掉標(biāo)點(diǎn)符號(hào)
        corpus.append(segment_jieba(remove_punc(line.strip())))

'''

代碼中定義了兩種分詞方式,一種是單純的使用bi-gram分詞购公,一種是使用jieba進(jìn)行中文分詞萌京,兩份分詞方式根據(jù)效果自己選擇使用哪種。加載語(yǔ)料的時(shí)候把標(biāo)點(diǎn)符號(hào)去掉宏浩,這對(duì)于文本聚類(lèi)幾乎沒(méi)有作用知残。還可以去掉自己定義的一些類(lèi)似“你”、“我”比庄、“他”等大量口語(yǔ)化中均會(huì)出現(xiàn)的停止詞求妹,這類(lèi)詞語(yǔ)往往對(duì)聚類(lèi)也起不到作用。

計(jì)算TF-IDF權(quán)重

'''
    2佳窑、計(jì)算tf-idf設(shè)為權(quán)重
'''

vectorizer = CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))

''' 
    3制恍、獲取詞袋模型中的所有詞語(yǔ)特征
    如果特征數(shù)量非常多的情況下可以按照權(quán)重降維
'''

word = vectorizer.get_feature_names()
print("word feature length: {}".format(len(word)))

''' 
    4、導(dǎo)出權(quán)重神凑,到這邊就實(shí)現(xiàn)了將文字向量化的過(guò)程净神,矩陣中的每一行就是一個(gè)文檔的向量表示
'''
tfidf_weight = tfidf.toarray()

關(guān)于TF-IDF網(wǎng)上有很多教程都有詳細(xì)的解釋。這里解釋下為什么用這個(gè)值作為權(quán)重耙厚。
將文本向量化的方式其實(shí)有很多强挫,最簡(jiǎn)單的就是one-hot方式,在之前的文章中也講過(guò)這種方式的實(shí)現(xiàn)原理薛躬,如果不用TF-IDF設(shè)置權(quán)重,那么呆细,后面進(jìn)行文本向量化之后的矩陣值只有0型宝、1兩種,詞與詞之間的權(quán)重沒(méi)有進(jìn)行區(qū)分絮爷,所以用這種方式設(shè)置權(quán)重趴酣。

文本聚類(lèi)

'''
    5、對(duì)向量進(jìn)行聚類(lèi)
'''

# 指定分成7個(gè)類(lèi)
kmeans = KMeans(n_clusters=7)
kmeans.fit(tfidf_weight)

# 打印出各個(gè)族的中心點(diǎn)
print(kmeans.cluster_centers_)
for index, label in enumerate(kmeans.labels_, 1):
    print("index: {}, label: {}".format(index, label))

# 樣本距其最近的聚類(lèi)中心的平方距離之和坑夯,用來(lái)評(píng)判分類(lèi)的準(zhǔn)確度岖寞,值越小越好
# k-means的超參數(shù)n_clusters可以通過(guò)該值來(lái)評(píng)估
print("inertia: {}".format(kmeans.inertia_))

k-means的缺陷之一就是需要自己指定需要分類(lèi)的族數(shù),也就是代碼中的n_clusters柜蜈,選擇超參數(shù)的過(guò)程中仗谆,可以使用kmeans.inertia_值作為評(píng)估標(biāo)準(zhǔn),其值越小越好淑履。

可視化

'''
    6隶垮、可視化
'''

# 使用T-SNE算法,對(duì)權(quán)重進(jìn)行降維秘噪,準(zhǔn)確度比PCA算法高狸吞,但是耗時(shí)長(zhǎng)
tsne = TSNE(n_components=2)
decomposition_data = tsne.fit_transform(tfidf_weight)

x = []
y = []

for i in decomposition_data:
    x.append(i[0])
    y.append(i[1])

fig = plt.figure(figsize=(10, 10))
ax = plt.axes()
plt.scatter(x, y, c=kmeans.labels_, marker="x")
plt.xticks(())
plt.yticks(())
# plt.show()
plt.savefig('./sample.png', aspect=1)

前面將文本向量化之后,每個(gè)文檔的維度非常高,進(jìn)行可視化之前需要對(duì)其降維蹋偏,降維算法也有很多便斥,這里使用T-SNE算法,其優(yōu)點(diǎn)就是準(zhǔn)確度比較高威始,但是耗時(shí)比較長(zhǎng)枢纠,如果接受不了耗時(shí)長(zhǎng),可以使用PCA算法字逗。
對(duì)降維后的數(shù)據(jù)decomposition_data用plt進(jìn)行可視化京郑。

效果顯示

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市葫掉,隨后出現(xiàn)的幾起案子些举,更是在濱河造成了極大的恐慌,老刑警劉巖俭厚,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户魏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挪挤,警方通過(guò)查閱死者的電腦和手機(jī)叼丑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扛门,“玉大人鸠信,你說(shuō)我怎么就攤上這事÷壅” “怎么了星立?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)葬凳。 經(jīng)常有香客問(wèn)我绰垂,道長(zhǎng),這世上最難降的妖魔是什么火焰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任劲装,我火速辦了婚禮,結(jié)果婚禮上昌简,老公的妹妹穿的比我還像新娘占业。我一直安慰自己,他們只是感情好江场,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布纺酸。 她就那樣靜靜地躺著,像睡著了一般址否。 火紅的嫁衣襯著肌膚如雪餐蔬。 梳的紋絲不亂的頭發(fā)上碎紊,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音樊诺,去河邊找鬼仗考。 笑死,一個(gè)胖子當(dāng)著我的面吹牛词爬,可吹牛的內(nèi)容都是我干的秃嗜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼顿膨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锅锨!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起恋沃,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤必搞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后囊咏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體恕洲,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年梅割,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霜第。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡户辞,死狀恐怖泌类,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情底燎,我是刑警寧澤末誓,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站书蚪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏迅栅。R本人自食惡果不足惜殊校,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望读存。 院中可真熱鬧为流,春花似錦、人聲如沸让簿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尔当。三九已至莲祸,卻和暖如春蹂安,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锐帜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工田盈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缴阎。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓允瞧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛮拔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子述暂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 文本關(guān)鍵詞抽取,是對(duì)文本信息進(jìn)行高度凝練的一種有效手段建炫,通過(guò)3-5個(gè)詞語(yǔ)準(zhǔn)確概括文本的主題畦韭,幫助讀者快速理解文本信...
    atLee閱讀 22,198評(píng)論 8 46
  • 常用概念: 自然語(yǔ)言處理(NLP) 數(shù)據(jù)挖掘 推薦算法 用戶(hù)畫(huà)像 知識(shí)圖譜 信息檢索 文本分類(lèi) 常用技術(shù): 詞級(jí)別...
    御風(fēng)之星閱讀 9,195評(píng)論 1 25
  • SEO算法之TF-IDF算法 1、TF-IDF算法概念: TF-IDF(term frequency–invers...
    老朱seo閱讀 1,030評(píng)論 2 3
  • 番外一 我心愛(ài)的姑娘 蓉兒少年時(shí)性子古怪多變踱卵,時(shí)而天真明媚廊驼,時(shí)而心狠手辣。有時(shí)覺(jué)得她心胸極闊惋砂,有時(shí)又覺(jué)得她小心...
    不如歸處閱讀 6,258評(píng)論 0 10
  • 得意者忘形妒挎,忘形者失意。 最近碰上件很重要的事西饵,事關(guān)生活酝掩,沒(méi)有大小。 我呆在重慶一個(gè)小地方眷柔,一個(gè)縣城的新開(kāi)發(fā)區(qū)期虾。開(kāi)...
    紙上落筆閱讀 172評(píng)論 0 0