需求
拿到的需求是輸入n個文字,對文字進行聚類,由於這些輸入不能通過歷史資料進行訓練,所以這個主要就是用無監督學習來解決。
kmeans
談到聚類就會想到kmeans,它的核心思想是給定的K值和K個初始質心將樣本中每個點都分到距離最近的類簇中,當所有點分配完後根據每個類簇的所有點重新計算質心,一般是通過平均值計算,然後再將每個點分到距離最近的新類簇中,不斷迴圈此操作,直到質心不再變化或達到一定的迭代次數。
分詞
會使用一些工具進行分詞,比如IKAnalyzer,同時也支援將停詞去掉。
詞庫
剛開始分類效果不是很好,於是改進詞庫。對於特定行業的分詞,為提高分詞的準確性及專業性,可以收集更準確的詞庫用於分詞。可以由搜狗 pinyin.sogou.com/dict/ 搜尋各種類別的詞彙,自己下載下來再整理,它的格式為scel,可以使用深藍詞彙轉換工具轉成txt方便使用。
特徵集
特徵集的確定是文字向量化的第一步,只有特徵集確定好了才能進一步確定向量的值,那麼怎麼確定特徵集呢?一般的做法可以是將所有樣本的詞都提取出來作為特徵集。比如我們有兩個文字 “小學生上學”和“股票大跌”,那特徵集就是{"小學生","上學","股票","大跌"}。
特徵權重
向量化第二部就是確定特徵集的權重,特徵集可以看成是向量的維數,而對於每個樣本來說就需要確定每個維度的值了,這個值就可以看成是特徵的權重,常常用TF-IDF作為值。TF-IDF又是什麼?簡單來說TF就是某文件中某個term出現的次數,而IDF即逆文件頻率,可由下面公式計算:
其中,T為統計樣本中總文件數,t為包含某term的文件數。
TF和IDF的相乘則為特徵權重。
特徵降維
其實就是通過某種方法選擇出比較相關的一些特徵,將一些無關的特徵去掉,達到特徵降維效果。比如可以通過卡方檢驗,這裡選擇了用其他方式,提取熱詞。即認為每個文件的熱詞能代表該文件,由熱片語成特徵。
主要程式碼
public int[] learn(List textList) {
List vectorList = VectorUtil.getVectorDimension(textList);
double[][] datas = VectorUtil.getVector(textList.size(), vectorList, idf);
KMeans kmeans = new KMeans(datas, K, ITERATE);
return kmeans.getClusterLabel();
} 複製程式碼
Github
以下是廣告和相關閱讀
========廣告時間========
鄙人的新書《Tomcat核心設計剖析》已經在京東銷售了,有需要的朋友可以到 item.jd.com/12185360.ht… 進行預定。感謝各位朋友。
=========================
相關閱讀:
k-means 聚類演算法
如何用機器學習對文字分類
如何對熱詞進行提取
歡迎關注: