系統學習NLP(二十)--文字聚類

Eason.wxd發表於2019-03-14

轉自:https://zhuanlan.zhihu.com/p/40991165

1:什麼是文字聚類

先說說聚類的概念,聚類又稱群分析,是資料探勘的一種重要的思想,聚類(Cluster)分析是由若干模式(Pattern)組成的,通常,模式是一個度量(Measurement)的向量,或者是多維空間中的一個點。聚類分析以相似性為基礎,在一個聚類中的模式之間比不在同一聚類中的模式之間具有更多的相似性。(以上來自百度百科).

再說到文字聚類,文字聚類其實也就是在文字方向上的應用,首先我們要把一個個文件的自然語言轉換成數學資訊,這樣形成高維空間點之後再去計算點與點之間的距離,然後將這些距離比較近的聚成一個簇,這些簇的中心成為簇心.而我們做的就是保證簇內點的距離足夠近,簇與簇的距離足夠遠.

我接到的任務是在評論文字上進行聚類操作,起初以為很簡單,但是發現其實還是不是很好操作的,有幾個原因,一方面是評論有些部分語義其實是重複的,這樣導致一些類別會重合,這樣使用聚類的方法往往是不準確的,另一方面是一些評論上的詞語使用近義詞和一些音譯字來替換詞語,比如”微信”會轉成”V信”等這些在分詞的時候會有一些問題.並且又因為聚類是一種非監督學習,往往給我們的資料太多(給我的評論資料有80w,有多少類,什麼類)我們都不知道,我們也只能輪廓係數不斷地測試,找到一個合適的結果出來.

並且我們用的一些演算法也有一些問題,比如我們使用的K-means方法,每一次選取的簇心是隨機的,這樣一來得到的結果也是每次不一樣的,所以聚類演算法也是比較難評價,這也是一些困難的部分.

2:文字聚類的過程

 

主要的過程如圖所示,其實主要的部分有三個:

第一部分,分詞處理,我們要把中文文章要進行分詞,這一點中文文章和英文文章有一些區別,因為英文單詞是單個構成的,也就不需要分詞了,而我們中文是需要分詞的,並且中文之間有一些詞儘管大量出現,但是對於文章的分類結構起不到太大的意義,比如”的”,”了”,”麼””應該”,這些詞去計算他們既浪費空間又浪費時間,出於+1s的因素,我們也要節約時間啊,首先我們就加入一個停用詞表,在進行分詞的時候進行去掉.

第二部分:分詞後將分詞轉換為詞向量

關於詞向量我們有一些比較常用的模型,比如one-hotm,BOW詞袋模型,連續詞袋模型(CBOW)和Skip-Gram模型和Word2vec模型,在這次任務中我是用的是BOW詞袋模型,在轉換為詞向量值我們要將其轉換成tfidf矩陣,tfidf其實可以看作是提取的特徵的一次加權,是根據一個單詞在當前文章中出現的頻率和該單詞在所有語料中出現的頻率評估一個單詞的重要性,當一個單詞在這篇文章中出現的次數很多的時候,這個詞語更加重要;但如果它在所有文章中出現的次數都很多,那麼它就顯得不那麼重要

第三部分:選擇聚類演算法

這裡的演算法大家常用的是K-means和DBSCAN,這兩種演算法用的最多,但是在高維空間裡邊K-means似乎並不是很好,究其原因是因為維度太高,簇與簇之間的距離太小了,如果直接去聚類,這一部分似乎效果不太好,這時候就需要用到主成分分析PCA,大致的思路是大致意思就是取這個高維向量中方差最大的方向經過一些數學變換將有用的部分保留,沒用的部分捨棄,這種辦法同樣適合分類演算法中尋找最大的特徵.

這一部分似乎也得單獨拿出一篇文章好好寫一下,畢竟太多坑了.

最後演算法評測,對於K-means,我們使用的是簇的距離進行評定,對於Brich層次聚類,我們使用的是輪廓係數來評定,最後發現,這真是一個調參活,感嘆真不容易.

最後效果:

紅色虛線是輪廓係數,柱狀圖是類別,儘量多的讓柱狀在輪廓係數附近,我們可以認為結果取得不錯.

相關文章