pyhanlp 文字聚類詳細介紹
文字聚類
文字聚類簡單點的來說就是將文字視作一個樣本,在其上面進行聚類操作。但是與我們機器學習中常用的聚類操作不同之處在於。
我們的聚類物件不是直接的文字本身,而是文字提取出來的特徵。因此如何提取特徵因而是非常重要的一步。在 HanLP 中一共有三個文字聚類方法。前兩種都基於詞袋模式,第一個是最常見的聚類演算法: k-means ,但 HanLP 不光實現了 k-means ,還實現了速度更快效果更好的 repeated bisection 演算法(重複二分法,還是翻譯為累次平方法,好像是第一種)。筆者動筆前段時間剛剛新增了一個新的聚類分析器是,基於詞向量的 kmens 聚類分析器。
基於詞向量的 kmeans 聚類分析器,輸入的需要時詞向量化後的檔案。雖然 HanLP 的詞向量在 Java 實現中,還算可以,但在 Python 中使用不算太好用,同時 Python 也不推薦用 HanLP 做詞向量,我們有更好的工具。所以這裡我們也就不畫蛇添足了。
而對於前兩個聚類分析器而言,其聚類模組可以接受任意文字作為文件,而不需要用特殊分隔符隔開單詞。另外,該模組還接受單詞列表作為輸入,使用者可以將英文、日文等預先切分為單詞列表後輸入本模組。統計方法適用於所有語種,不必拘泥於中文。
分詞器的效能問題
在 repeated bisection 演算法無論效能還是速度都要優於 kmens ,但是在本人的測試中,前者速度基本原作者一致約為 kmeans 的三倍左右,但是效能略低於後者。此處請讀者自行斟酌。
分詞器的引數
自動判斷聚類個數 k( 此處來自於原文 :HanLP 中的文字聚類
很多時候使用者可能覺得聚類個數 k 這個超引數很難準確指定。在 repeated bisection 演算法中,有一種變通的方法,那就是透過給準則函式的增幅設定閾值 beta 來自動判斷 k 。此時演算法的停機條件為,當一個簇的二分增幅小於 beta 時不再對該簇進行劃分,即認為這個簇已經達到最終狀態,不可再分;當所有簇都不可再分時,演算法終止,此時產生的聚類數量就不再需要人工指定了。
在 HanLP 中, repeated bisection 演算法提供了 3 種介面,分別需要指定 k 、 beta 或兩者同時指定。當同時指定 k 和 beta 時,滿足兩者的停止條件中任意一個演算法都會停止。當只指定一個時,另一個停止條件不起作用。這三個介面列舉如下:
public List<Set<K>> repeatedBisection(int nclusters)
public List<Set<K>> repeatedBisection(double limit_eval)
public List<Set<K>> repeatedBisection(int nclusters, double limit_eval)
當我們使用 analyzer.repeatedBisection(1.0) 時,可以進行自動聚類。
from pyhanlp import *
ClusterAnalyzer = SafeJClass('com.hankcs.hanlp.mining.cluster.ClusterAnalyzer')
analyzer = ClusterAnalyzer()
# 我們需要呼叫並返回自身
analyzer.addDocument(" 趙一 ", " 流行 , 流行 , 流行 , 流行 , 流行 , 流行 , 流行 , 流行 , 流行 , 流行 , 藍調 , 藍調 , 藍調 , 藍調 , 藍調 , 藍調 , 搖滾 , 搖滾 , 搖滾 , 搖滾 ");
analyzer.addDocument(" 錢二 ", " 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 舞曲 , 舞曲 , 舞曲 , 舞曲 , 舞曲 , 舞曲 , 舞曲 , 舞曲 , 舞曲 ");
analyzer.addDocument(" 張三 ", " 古典 , 古典 , 古典 , 古典 , 民謠 , 民謠 , 民謠 , 民謠 ");
analyzer.addDocument(" 李四 ", " 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 爵士 , 金屬 , 金屬 , 舞曲 , 舞曲 , 舞曲 , 舞曲 , 舞曲 , 舞曲 ");
analyzer.addDocument(" 王五 ", " 流行 , 流行 , 流行 , 流行 , 搖滾 , 搖滾 , 搖滾 , 嘻哈 , 嘻哈 , 嘻哈 ");
analyzer.addDocument(" 馬六 ", " 古典 , 古典 , 古典 , 古典 , 古典 , 古典 , 古典 , 古典 , 搖滾 ");
print(analyzer.repeatedBisection(1.0))
[[ 李四 , 錢二 ], [ 王五 , 趙一 ], [ 張三 , 馬六 ]]
評測
評測程式仍然使用搜狗文字分類語料庫迷你版。過程為首先遍歷子目錄讀取文件,以子目錄 + 檔名作為 id 將文件傳入聚類分析器進行聚類,並且計算 F1 值返回。該計算過程已被原作者封裝為介面,我們可以直接呼叫
CORPUS_FOLDER = "/home/fonttian/Data/CNLP/textClassification/sogou-mini/ 搜狗文字分類語料庫迷你版 "
for i in ["kmeans", "repeated bisection"]:
print(i, ClusterAnalyzer.evaluate(CORPUS_FOLDER, i) * 100)
kmeans 83.97065954968313
repeated bisection 82.71523522720585
文章來源 FontTian 的 部落格
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2221306/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- pyhanlp文字分類與情感分析HanLP文字分類
- Kafka詳細介紹Kafka
- javascript this詳細介紹JavaScript
- ApplicationContext 詳細介紹APPContext
- JDBC 詳細介紹JDBC
- Ifconfig詳細介紹
- Git詳細介紹Git
- 詳細介紹Python類的繼承與多型Python繼承多型
- Spring bean詳細介紹SpringBean
- python字典詳細介紹Python
- Nacos 介面詳細介紹
- SOLIDWORKS API詳細介紹SolidAPI
- Go Channel 詳細介紹Go
- Python直譯器種類以及特點?詳細介紹!Python
- 註解的詳細介紹
- Flutter系列(一)——詳細介紹Flutter
- Nginx服務詳細介紹Nginx
- LVM詳細介紹及建立LVM
- Webpack 打包 Javascript 詳細介紹WebJavaScript
- 【SCN】Oracle SCN 詳細介紹Oracle
- Http Module 的詳細介紹HTTP
- Java異常詳細介紹Java
- 四,Java運算子詳細分類及使用方法介紹Java
- Dart語言詳解(一)——詳細介紹Dart
- TreeViewTemplate移動元件詳細介紹View元件
- oracle 大頁配置詳細介紹Oracle
- spring @component 的作用詳細介紹Spring
- unit3 文字聚類聚類
- JavaScript FormData的詳細介紹及使用JavaScriptORM
- BN(Batch Normalization)層的詳細介紹BATORM
- vuex詳細介紹和使用方法Vue
- Fabric1.3新功能詳細介紹
- Aidl程式間通訊詳細介紹AI
- flutter接入現有的app詳細介紹FlutterAPP
- 渲染樹與css解析詳細介紹CSS
- WindowsPE重灌Windows系統詳細介紹Windows
- 《非常防護》專案詳細介紹
- [Javascript] Promise ES6 詳細介紹JavaScriptPromise