pyhanlp 文本聚類詳細介紹

文本聚類算法

文本聚類簡單點的來講就是將文本視做一個樣本,在其上面進行聚類操做。可是與咱們機器學習中經常使用的聚類操做不一樣之處在於。機器學習

咱們的聚類對象不是直接的文本自己,而是文本提取出來的特徵。所以如何提取特徵於是是很是重要的一步。在HanLP中一共有三個文本聚類方法。前兩種都基於詞袋模式,第一個是最多見的聚類算法:k-means,但HanLP不光實現了k-means,還實現了速度更快效果更好的repeated bisection算法(重複二分法,仍是翻譯爲累次平方法,好像是第一種)。筆者動筆前段時間剛剛添加了一個新的聚類分析器是,基於詞向量的kmens聚類分析器。函數

基於詞向量的kmeans聚類分析器,輸入的須要時詞向量化後的文件。雖然HanLP的詞向量在Java實現中,還算能夠,但在Python中使用不算太好用,同時Python也不推薦用HanLP作詞向量,咱們有更好的工具。因此這裏咱們也就不多此一舉了。工具

而對於前兩個聚類分析器而言,其聚類模塊能夠接受任意文本做爲文檔,而不須要用特殊分隔符隔開單詞。另外,該模塊還接受單詞列表做爲輸入,用戶能夠將英文、日文等預先切分爲單詞列表後輸入本模塊。統計方法適用於全部語種,沒必要拘泥於中文。性能

分詞器的性能問題學習

在repeated bisection算法不管性能仍是速度都要優於kmens,可是在本人的測試中,前者速度基本原做者一致約爲kmeans的三倍左右,可是性能略低於後者。此處請讀者自行斟酌。測試

分詞器的參數lua

自動判斷聚類個數k(此處來自於原文:HanLP中的文本聚類spa

不少時候用戶可能以爲聚類個數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的博客

相關文章
相關標籤/搜索