一 文本聚類(lèi)簡(jiǎn)介
1.1、定義
文本聚類(lèi)主要是依據(jù)著名的聚類(lèi)假設(shè):同類(lèi)的文檔相似度較大,而不同類(lèi)的文檔相似度較小结澄。作為一種無(wú)監(jiān)督的機(jī)器學(xué)習(xí)方法,聚類(lèi)由于不需要訓(xùn)練過(guò)程岸夯,以及不需要預(yù)先對(duì)文檔手工標(biāo)注類(lèi)別麻献,因此具有一定的靈活性和較高的自動(dòng)化處理能力,已經(jīng)成為對(duì)文本信息進(jìn)行有效地組織猜扮、摘要和導(dǎo)航的重要手段勉吻,為越來(lái)越多的研究人員所關(guān)注。(摘自百度百科)
1.2旅赢、應(yīng)用領(lǐng)域
① 文檔聚類(lèi)可以作為多文檔自動(dòng)文摘等自然語(yǔ)言處理應(yīng)用的預(yù)處理步驟
比較典型的例子是哥倫比亞大學(xué)開(kāi)發(fā)的多文檔文摘系統(tǒng)Newsblaster齿桃。Newsblaster將每天發(fā)生的重要新聞文本進(jìn)行聚類(lèi)處理,并對(duì)同主題文檔進(jìn)行冗余消除煮盼、信息融合短纵、文本生成等處理,從而生成一篇簡(jiǎn)明扼要的摘要文檔僵控。
② 對(duì)搜索引擎返回的結(jié)果進(jìn)行聚類(lèi)香到,使用戶(hù)迅速定位到所需要的信息
③ 對(duì)用戶(hù)感興趣的文檔(如用戶(hù)瀏覽器cache中的網(wǎng)頁(yè))聚類(lèi),從而發(fā)現(xiàn)用戶(hù)的興趣模式并用于信息過(guò)濾和信息主動(dòng)推薦等服務(wù)
④ 聚類(lèi)技術(shù)還可以用來(lái)改善文本分類(lèi)的結(jié)果
⑤ 數(shù)字圖書(shū)館服務(wù)
通過(guò)SOM神經(jīng)網(wǎng)絡(luò)等方法报破,可以將高維空間的文檔拓?fù)浔P虻赜成涞蕉S空間悠就,使得聚類(lèi)結(jié)果可視化和便于理解,如SOMlib[ ]系統(tǒng)充易;(以上摘自百度百科)
⑥ 用于大數(shù)據(jù)中熱點(diǎn)話(huà)題或事件的發(fā)現(xiàn)
與文本分類(lèi)不同梗脾,文本聚類(lèi)預(yù)先并不知道聚出來(lái)的每個(gè)類(lèi)別的主題具體是什么,只知道每個(gè)類(lèi)別下的數(shù)據(jù)相似度較大蔽氨,描述的是同一個(gè)主題藐唠。因此,文本聚類(lèi)比較適合用于大數(shù)據(jù)中熱點(diǎn)話(huà)題或事件的發(fā)現(xiàn)鹉究。
1.3、文本聚類(lèi)方法
作為NLP領(lǐng)域最經(jīng)典的使用場(chǎng)景之一踪宠,文本聚類(lèi)形成了它的一般流程(圖1)并積累了許多的實(shí)現(xiàn)方法自赔。
從圖1可以看出香嗓,文本聚類(lèi)主要有一下幾個(gè)步驟忿晕。
- 分詞
- 去除停用詞
- 構(gòu)建詞袋空間VSM(vector space model)
- TF-IDF構(gòu)建詞權(quán)重
- 使用聚類(lèi)算法進(jìn)行聚類(lèi)(KMeans,DBSCAN漠魏,BIRCH等)
當(dāng)然,也有在實(shí)際應(yīng)用中考慮到文本向量維度較高不利于聚類(lèi)等問(wèn)題他去,增加pca降維的方法毙驯,如圖2所示。
二 文本聚類(lèi)的主要步驟
2.1 分詞
分詞這一步主要是對(duì)中文文檔而言的灾测,一般使用分詞工具來(lái)完成爆价。
一般的中文分詞工具主要有:jieba,Hanlp媳搪,SnowNLP(MIT)铭段,pynlpir(大數(shù)據(jù)搜索挖掘?qū)嶒?yàn)室(北京市海量語(yǔ)言信息處理與云計(jì)算應(yīng)用工程技術(shù)研究中心)),thulac(清華大學(xué)自然語(yǔ)言處理與社會(huì)人文計(jì)算實(shí)驗(yàn)室) 等秦爆。
2.2 去除停用詞
所謂停用詞就是我們?cè)趯?shí)際生活中常用的不能用于區(qū)分文檔之間關(guān)系的一些詞語(yǔ)序愚。如“的”,“你”等限,“我”爸吮,“他”等。
常見(jiàn)的中文停用詞有:
1. 中文停用詞表(比較全面,有1208個(gè)停用詞)
2. 最全中文停用詞表整理(1893個(gè))
示例代碼:
def read_from_file(file_name):
with open(file_name,"r") as fp:
words = fp.read()
return words
def stop_words(stop_word_file):
words = read_from_file(stop_word_file)
result = jieba.cut(words)
new_words = []
for r in result:
new_words.append(r)
return set(new_words)
def del_stop_words(words,stop_words_set):
# words是已經(jīng)切詞但是沒(méi)有去除停用詞的文檔望门。
# 返回的會(huì)是去除停用詞后的剩余詞
result = jieba.cut(words)
new_words = []
for r in result:
if r not in stop_words_set:
new_words.append(r)
return new_words
2.3 構(gòu)建詞袋空間VSM(vector space model)
構(gòu)建詞袋空間的步驟如下:
- 將所有文檔讀入到程序中形娇,再將每個(gè)文檔切詞。
- 去除每個(gè)文檔中的停用詞怒允。
- 統(tǒng)計(jì)所有文檔的詞集合(sk-learn有相關(guān)函數(shù))埂软。
- 對(duì)每個(gè)文檔,都將構(gòu)建一個(gè)向量纫事,向量的值是對(duì)應(yīng)詞語(yǔ)在本文檔中出現(xiàn)的次數(shù)勘畔。
示例代碼:
def get_all_vector(file_path,stop_words_set):
names = [ os.path.join(file_path,f) for f in os.listdir(file_path) ]
posts = [ open(name).read() for name in names ]
docs = []
word_set = set()
for post in posts:
doc = del_stop_words(post,stop_words_set)
docs.append(doc)
word_set |= set(doc)
#print len(doc),len(word_set)
word_set = list(word_set)
docs_vsm = []
#for word in word_set[:30]:
#print word.encode("utf-8"),
for doc in docs:
temp_vector = []
for word in word_set:
temp_vector.append(doc.count(word) * 1.0)
#print temp_vector[-30:-1]
docs_vsm.append(temp_vector)
docs_matrix = np.array(docs_vsm)
2.4 TF-IDF構(gòu)建詞權(quán)重
前面已經(jīng)得到了文本的向量化表示,但是只用詞頻進(jìn)行數(shù)值化明顯是不夠的丽惶。因此炫七,這里使用TF-IDF來(lái)度量每個(gè)詞的重要程度。
關(guān)于TF-IDF的介紹可以參考網(wǎng)上的文章:
1. 基本文本聚類(lèi)方法
2. TF-IDF百度百科
3. TF-IDF維基百科英文版(需要FQ)
示例代碼如下:
column_sum = [ float(len(np.nonzero(docs_matrix[:,i])[0])) for i in range(docs_matrix.shape[1]) ]
column_sum = np.array(column_sum)
column_sum = docs_matrix.shape[0] / column_sum
idf = np.log(column_sum)
idf = np.diag(idf)
# 根據(jù)IDF的定義钾唬,計(jì)算詞的IDF并不依賴(lài)于某個(gè)文檔万哪,所以我們提前計(jì)算好。
# 注意一下計(jì)算都是矩陣運(yùn)算抡秆,不是單個(gè)變量的運(yùn)算奕巍。
for doc_v in docs_matrix:
if doc_v.sum() == 0:
doc_v = doc_v / 1
else:
doc_v = doc_v / (doc_v.sum())
tfidf = np.dot(docs_matrix,idf)
return names,tfidf
2.5 使用聚類(lèi)算法進(jìn)行聚類(lèi)
到了這一步,就可以使用聚類(lèi)算法(KMeans儒士,DBSCAN的止,BIRCH等)進(jìn)行文本聚類(lèi)了,在這里就不作詳細(xì)介紹了着撩。
三 小結(jié)
本文主要介紹了NLP中的文本聚類(lèi)的基本方法诅福。當(dāng)然匾委,除了使用TF-IDF構(gòu)建詞權(quán)重的方法之外,還可以使用LDA主題模型氓润、Word2Vec等獲取文本向量表示的方法進(jìn)行文本聚類(lèi)赂乐,這里就不再一一介紹了。
參考文獻(xiàn)
中文文本聚類(lèi)(切詞以及Kmeans聚類(lèi))
文本聚類(lèi)教程