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种接口,分别需要指定kbeta或两者同时指定。当同时指定kbeta时,满足两者的停止条件中任意一个算法都会停止。当只指定一个时,另一个停止条件不起作用。这三个接口列举如下:

 

    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博客

相关文章
|
4月前
|
自然语言处理 算法 数据挖掘
基于python豆瓣电影评论的情感分析和聚类分析,聚类分析有手肘法进行检验,情感分析用snownlp
本文介绍了一个基于Python的情感分析和聚类分析项目,使用snownlp库对豆瓣电影评论进行情感分析,并采用手肘法辅助K-means算法进行聚类分析,以探索评论中的不同主题和情感集群。
114 5
基于python豆瓣电影评论的情感分析和聚类分析,聚类分析有手肘法进行检验,情感分析用snownlp
|
4月前
|
机器学习/深度学习 自然语言处理 语音技术
利用Python实现简单文本分类器
【8月更文挑战第30天】本文旨在通过一个简易的文本分类器项目,引导读者步入自然语言处理的大门。我们将使用Python编程语言,借助其强大的库支持,一步步构建起能够区分不同类型文本的分类器。文章将深入浅出地介绍必要的理论知识,并通过实际代码示例加深理解。无论你是编程新手还是希望扩展技能边界的开发者,这篇文章都将为你提供有价值的见解和指导。
|
4月前
|
机器学习/深度学习 自然语言处理 算法
利用Python实现简单文本分类
【8月更文挑战第3天】本文将引导读者了解如何使用Python编程语言实现基础的文本分类。通过具体的代码示例和步骤解释,我们将探索如何训练一个模型来自动对文本数据进行归类。本教程适合有Python基础但尚未涉足机器学习领域的初学者,旨在提供足够的信息帮助读者理解并实现自己的文本分类器。
|
7月前
|
机器学习/深度学习 自然语言处理 算法
使用Python实现简单的文本分类器
本文介绍了如何使用Python编程语言实现一个简单但有效的文本分类器。通过使用基本的自然语言处理技术和机器学习算法,我们可以将文本数据分为不同的类别,从而实现对文本信息的自动化处理和分析。通过详细的步骤和示例代码,读者将能够理解文本分类的基本原理,并且能够自己动手实现一个简单的文本分类器。
|
6月前
|
自然语言处理 监控 数据可视化
艺术与文本的交织:基于Python的jieba和wordcloud库实现华丽词云
艺术与文本的交织:基于Python的jieba和wordcloud库实现华丽词云
86 0
|
7月前
|
数据采集 自然语言处理 Serverless
使用Gensim库进行情感分析
【4月更文挑战第21天】使用Gensim进行情感分析,首先安装Gensim库(`pip install gensim`),然后导入所需模块,包括Word2Vec和KeyedVectors。对数据进行预处理,如分词和去除停用词。训练Word2Vec模型并保存,或加载预训练模型。最后,定义函数计算句子情感分数,并应用到文档上。代码示例展示了基本流程,实际应用中可按需调整。
95 10
|
7月前
|
机器学习/深度学习 算法 数据可视化
利用Python实现简单的文本分类器
本文介绍了如何使用Python编写一个简单的文本分类器,通过基于词袋模型和朴素贝叶斯算法的方法实现对文本进行分类。通过示例代码和详细说明,读者可以了解如何构建一个能够自动对文本进行分类的程序,并在实际应用中使用这种技术。
|
7月前
|
数据采集 机器学习/深度学习 自然语言处理
Python实现文本分类的方法详解
本文详细介绍了Python实现文本分类的方法,包括数据清洗、特征提取、模型训练和预测等步骤。通过代码示例和实际案例,帮助读者快速掌握文本分类的基本原理和实现方法。
135 1
|
机器学习/深度学习 数据挖掘 测试技术
自组织映射(SOM)聚类分析Python第三方库实现<minisom>
自组织映射(SOM)聚类分析Python第三方库实现<minisom>
自组织映射(SOM)聚类分析Python第三方库实现<minisom>
|
机器学习/深度学习 算法框架/工具 Python