pyhanlp 文本聚类
文本聚類
文本聚類簡單點(diǎn)的來說就是將文本視作一個(gè)樣本,在其上面進(jìn)行聚類操作。但是與我們機(jī)器學(xué)習(xí)中常用的聚類操作不同之處在于。
我們的聚類對(duì)象不是直接的文本本身,而是文本提取出來的特征。因此如何提取特征因而是非常重要的一步。在HanLP中一共有三個(gè)文本聚類方法。前兩種都基于詞袋模式,第一個(gè)是最常見的聚類算法:k-means,但HanLP不光實(shí)現(xiàn)了k-means,還實(shí)現(xiàn)了速度更快效果更好的repeated bisection算法(重復(fù)二分法,還是翻譯為累次平方法,好像是第一種)。筆者動(dòng)筆前段時(shí)間剛剛添加了一個(gè)新的聚類分析器是,基于詞向量的kmens聚類分析器。
基于詞向量的kmeans聚類分析器,輸入的需要時(shí)詞向量化后的文件。雖然HanLP的詞向量在Java實(shí)現(xiàn)中,還算可以,但在Python中使用不算太好用,同時(shí)Python也不推薦用HanLP做詞向量,我們有更好的工具。所以這里我們也就不畫蛇添足了。
而對(duì)于前兩個(gè)聚類分析器而言,其聚類模塊可以接受任意文本作為文檔,而不需要用特殊分隔符隔開單詞。另外,該模塊還接受單詞列表作為輸入,用戶可以將英文、日文等預(yù)先切分為單詞列表后輸入本模塊。統(tǒng)計(jì)方法適用于所有語種,不必拘泥于中文。
分詞器的性能問題
在repeated bisection算法無論性能還是速度都要優(yōu)于kmens,但是在本人的測試中,前者速度基本原作者一致約為kmeans的三倍左右,但是性能略低于后者。此處請(qǐng)讀者自行斟酌。
分詞器的參數(shù)
自動(dòng)判斷聚類個(gè)數(shù)k(此處來自于原文:HanLP中的文本聚類
很多時(shí)候用戶可能覺得聚類個(gè)數(shù)k這個(gè)超參數(shù)很難準(zhǔn)確指定。在repeated bisection算法中,有一種變通的方法,那就是通過給準(zhǔn)則函數(shù)的增幅設(shè)定閾值beta來自動(dòng)判斷k。此時(shí)算法的停機(jī)條件為,當(dāng)一個(gè)簇的二分增幅小于beta時(shí)不再對(duì)該簇進(jìn)行劃分,即認(rèn)為這個(gè)簇已經(jīng)達(dá)到最終狀態(tài),不可再分;當(dāng)所有簇都不可再分時(shí),算法終止,此時(shí)產(chǎn)生的聚類數(shù)量就不再需要人工指定了。
在HanLP中,repeated bisection算法提供了3種接口,分別需要指定k、beta或兩者同時(shí)指定。當(dāng)同時(shí)指定k和beta時(shí),滿足兩者的停止條件中任意一個(gè)算法都會(huì)停止。當(dāng)只指定一個(gè)時(shí),另一個(gè)停止條件不起作用。這三個(gè)接口列舉如下:
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)當(dāng)我們使用analyzer.repeatedBisection(1.0)時(shí),可以進(jìn)行自動(dòng)聚類。
from pyhanlp import * ClusterAnalyzer = SafeJClass('com.hankcs.hanlp.mining.cluster.ClusterAnalyzer') analyzer = ClusterAnalyzer() # 我們需要調(diào)用并返回自身analyzer.addDocument("趙一", "流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 藍(lán)調(diào), 藍(lán)調(diào), 藍(lán)調(diào), 藍(lán)調(diào), 藍(lán)調(diào), 藍(lán)調(diào), 搖滾, 搖滾, 搖滾, 搖滾"); analyzer.addDocument("錢二", "爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲"); analyzer.addDocument("張三", "古典, 古典, 古典, 古典, 民謠, 民謠, 民謠, 民謠"); analyzer.addDocument("李四", "爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 金屬, 金屬, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲"); analyzer.addDocument("王五", "流行, 流行, 流行, 流行, 搖滾, 搖滾, 搖滾, 嘻哈, 嘻哈, 嘻哈"); analyzer.addDocument("馬六", "古典, 古典, 古典, 古典, 古典, 古典, 古典, 古典, 搖滾");print(analyzer.repeatedBisection(1.0)) [[李四, 錢二], [王五, 趙一], [張三, 馬六]]評(píng)測
評(píng)測程序仍然使用搜狗文本分類語料庫迷你版。過程為首先遍歷子目錄讀取文檔,以子目錄+文件名作為id將文檔傳入聚類分析器進(jìn)行聚類,并且計(jì)算F1值返回。該計(jì)算過程已被原作者封裝為接口,我們可以直接調(diào)用
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總結(jié)
以上是生活随笔為你收集整理的pyhanlp 文本聚类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyhanlp 文本分类与情感分析
- 下一篇: 实例使用pyhanlp创建中文词云