使用 scikit-learn 進行 KMeans 文本聚類
文 | razrlele
來源:https://blog.yueyu.io/p/1614
Contents
1 K-Means 演算法簡介
2 scikit-learn
3 對擬合結果的持久化
4 References
K-Means 演算法簡介
中文名字叫做 K-均值演算法,演算法的目的是將 n 個向量分別歸屬到 K 個中心點裡面去。演算法首先會隨機選擇 K 個中心向量,然後通過迭代計算以及重新選擇 K 個中心向量,使得 n 個向量各自被分配到距離最近的 K 中心點,並且所有向量距離各自中心點的和最小。
在這裡借用 Wikipedia 上的 K-Means 條目的圖來說明
步驟一:在輸入數據集裡面隨機選擇三個向量作為初始中心點,這裡的 K 值為 3, 也就是一開始從數據集裡面選擇了三個向量。
步驟二:將每個向量分配到離各自最近的中心點,從而將數據集分成了 K 個類。
步驟三:計算得到上步得到聚類中每一聚類觀測值的圖心,作為新的均值點。
步驟四:重複步驟三,直至結果收斂,這裡的收斂是指所有點到各自中心點的距離的和收斂。
K-Means 演算法的原理比較簡單,但是值得注意的是,有兩個地方是需要演算法使用者去自己選擇的:第一個就是 K 的值,簡而言之就是數據集應該被分成多少個類,在 K-Means 演算法裡面是要求先給出 K 值的; 第二個就是距離函數,即如何計算向量和向量或者向量和中心點之間的距離,這裡也有很多選擇,最常見的自然是歐式距離,也可以用餘弦相似度來作為距離函數,還有其他的一些方法等等。以上兩個需要注意的選擇必然會對聚類結果產生影響,尤其是 K 值的選擇,這裡就需要演算法使用者根據自身需要來做出仔細衡量。
scikit-learn
scikit-learn 是一個基於 Python 的 Machine Learning 模塊,裡面給出了很多 Machine Learning 相關的演算法實現,其中就包括 K-Means 演算法。安裝的話建議參考 scikit-learn 的 Github Repo, 從軟體包管理裡面裝的似乎都版本比較低,會少一點功能。
在做 K-Means 聚類之前,我們首先需要對將文本轉化成向量的形式,轉換文本的第一步,自然是分詞,這裡可以直接使用 jieba 分詞,分完詞過後再將詞轉換成向量,或者說轉換成 Bag-of-words 模型,這裡可以採用 TF-IDF 演算法,TF-IDF 簡單來說就是從兩個方面對文本中的詞進行加權:
詞在當前文本中出現的次數。
總文本數包含詞的數目。
前者越高越好,後者越低越好,比如說「你」,「我」這些詞,在一個文本中出現的次數很多,總文本包含這些詞的數目也會很多,那麼這些詞自然無法作為當前文本的代表性內容,如果一個文本中某個詞大量出現,但是在總文本中出現的次數又不多,那麼這個詞對於文本來說很有可能是很重要的。比如在 A 文本中」喬布斯「這個詞出現了很多次,然後「喬布斯」在其他文本裡面又很少出現,那麼 A 文本主題和「喬布斯」相關的可能性就比較大,我們必然得提高「喬布斯」這個詞在 A 文本向量中的權重。
在 scikit-learn 裡面,同樣也實現了 TF-IDF 演算法,我們可以直接調用。
程序運行結果:
對擬合結果的持久化
在進行大規模文本聚類的時候,並不是每一次都需要從頭開始計算 TF-IDF 和 K-Means 的,有的時候我們只是需要根據之前的數據聚類結果預測新數據,所以我們可以考慮將計算中途的一些數據保存下來,這樣就可以節省不少的時間,令人感到驚喜的是,我們同樣可以通過 scikit-learn 的 模塊來實現持久化這一過程。
如果有看過 scikit-learn 官方文檔的話應該就可以發現,其實 和 只是將 和 ,以及 和 兩個方法寫在了一起,也就是說在上面代碼中:
每一次 都是對數據進行擬合操作,所以我們可以直接選擇將擬合結果持久化,然後預測的時候直接載入,進而節省時間。
References
https://en.wikipedia.org/wiki/K-means_clustering
https://github.com/scikit-learn/scikit-learn
https://github.com/fxsjy/jieba
https://en.wikipedia.org/wiki/Bag-of-words_model
https://en.wikipedia.org/wiki/Tf–idf
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html
http://scikit-learn.org/stable/auto_examples/text/document_clustering.html
http://scikit-learn.org/stable/modules/model_persistence.html
http://brandonrose.org/clustering
題圖:pexels,CC0 授權。
點擊展開全文
※Flask 插件學習系列:Restful
※美女產品經理與技術宅的一次「約會」
※一個全球最大成人網站的爬蟲
※利用Tesseract圖片文字識別初探
※雲伺服器彈性、安全、穩定背後的技術秘密
TAG:編程派 |
※用TensorFlow Estimator實現文本分類
※基於Tensorflow Estimators的文本分類系列之一
※基於Tensorflow Estimators的文本分類系列之二
※基於Tensorflow Estimators的文本分類系列之三
※使用Docker和Elasticsearch搭建全文本搜索引擎應用
※Python數據處理實戰——使用Scikit-Learn進行多類文本分類
※Adrian小哥教程:如何使用Tesseract和OpenCV執行OCR和文本識別
※Excel文本函數search和searchb教程
※如何科學地使用keras的Tokenizer進行文本預處理
※Selenium python 實現點擊非select/option下的懸浮隱藏文本
※如何在iPhone,iPad或Apple Watch上調整文本大小並啟用粗體文本
※「python」colorama 模塊-改變控制台輸出文本的顏色
※Sefer Yetzirah 創造之書——文本
※Mozilla推出Pathfinder,為AR/VR重構圖像文本渲染,解決顆粒鋸齒效果
※文本聚類系列教程:(三)構建詞袋空間VSM(Vector Space Model
※BBEdit文本編輯軟體重回蘋果Mac App Store
※OpenAI提出Sparse Transformer,文本、圖像、聲音都能預測,序列長度提高30倍
※最適合Linux編程的十大文本編輯器,Sublime Text排在首位!
※Google推出更加真實的文本到語音服務由DeepMind AI提供支持
※AWS語音轉文本服務開始支持WebSockets