文本聚类

(纯属为了记录自己学习的点滴过程,引用资料都附在参考列表)

1 基本概念

聚类(cluster analysis )指的是将给定对象的集合划分为不同子集的过程,目标是使得每个子集内部的元素尽量相似,不同子集间的元素尽量不相似。

  • 注意,单词的颗粒度(分词、新词提取、关键词提取) < 短语的颗粒度(短语提取) < 句子的颗粒度(关键句提起) < 文章颗粒度(聚类),这些无监督任务一直体现着高内聚、低耦合的原则。

2 问题

对多个文档,在文档颗粒上进行聚类;

3 解决思路

3.1 基本思想

文本聚类的基本流程分为特征提取和向量聚类两步, 如果能将文档表示为向量,就可以对其应用聚类算法。这种表示过程称为特征提取,而一旦将文档表示为向量,剩下的算法就与文档无关了。这种抽象思维无论是从软件工程的角度,还是从数学应用的角度都十分简洁有效。

3.2 文档特征提取

词袋(bag-of-words )是信息检索与自然语言处理中最常用的文档表示模型,它将文档想象为一个装有词语的袋子, 通过袋子中每种词语的计数等统计量将文档表示为向量。比如下面的例子:

人 吃 鱼。
美味 好 吃!

统计词频后如下:

人=1
吃=2
鱼=1
美味=1
好=1

文档经过该词袋模型得到的向量表示为[1,2,1,1,1],这 5 个维度分别表示这 5 种词语的词频。
一般选取训练集文档的所有词语构成一个词表,词表之外的词语称为 oov,不予考虑。一旦词表固定下来,假设大小为 N。则任何一个文档都可以通过这种方法转换为一个N维向量。比如“人 吃 大 鱼”这个文档,它的词频统计为:

人=1
吃=1
鱼=1
美味=0
好=0

那么它的词袋向量就是[1,1,1,0,0],其中后两个维度上的词语没有出现,所以都是0。而“大”这个词属于OOV,散落在词袋之外,所以不影响词袋向量。
词袋模型不考虑词序,也正因为这个原因,词袋模型损失了词序中蕴含的语义,比如,对于词袋模型来讲,“人吃鱼”和“鱼吃人”是一样的,这就荒谬了,但在实际工程中,词袋模型依然是一个很难打败的基线模型。

词袋中的统计量

  • 布尔词频: 词频非零的话截取为1,否则为0,适合长度较短的数据集
  • TF-IDF: 适合主题较少的数据集
  • 词向量: 如果词语本身也是某种向量的话,则可以将所有词语的词向量求和作为文档向量。适合处理 OOV 问题严重的数据集。
  • 词频向量: 适合主题较多的数据集

3.3 k均值聚类

详细推导见《统计学习方法》;

3.4 层次聚类

《统计学习方法》中只介绍了自下而上的聚合层次聚类,没有介绍自上而下的分裂层次聚类,而本节实现中使用的是分裂层次聚类。

4 实现

4.1 聚类算法实现

该聚类模块可以接受任意文本作为文档,而不需要用特殊分隔符隔开单词。

# -*- coding:utf-8 -*-from pyhanlp import *ClusterAnalyzer = JClass('com.hankcs.hanlp.mining.cluster.ClusterAnalyzer')if __name__ == '__main__':analyzer = ClusterAnalyzer()analyzer.addDocument("赵一", "流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 流行, 蓝调, 蓝调, 蓝调, 蓝调, 蓝调, 蓝调, 摇滚, 摇滚, 摇滚, 摇滚")analyzer.addDocument("钱二", "爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲")analyzer.addDocument("张三", "古典, 古典, 古典, 古典, 民谣, 民谣, 民谣, 民谣")analyzer.addDocument("李四", "爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 爵士, 金属, 金属, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲, 舞曲")analyzer.addDocument("王五", "流行, 流行, 流行, 流行, 摇滚, 摇滚, 摇滚, 嘻哈, 嘻哈, 嘻哈")analyzer.addDocument("马六", "古典, 古典, 古典, 古典, 古典, 古典, 古典, 古典, 摇滚")print(analyzer.kmeans(3))print(analyzer.repeatedBisection(3))print(analyzer.repeatedBisection(1.0))  # 自动判断聚类数量k

运行结果:

[[王五, 赵一], [马六, 张三], [李四, 钱二]]
[[李四, 钱二], [王五, 赵一], [张三, 马六]]
[[李四, 钱二], [王五, 赵一], [张三, 马六]]

4.2 Evaluation

聚类任务常用的一种评测手段是沿用分类任务的F1F_1F1,将一些人工分类好的文档去掉标签交给聚类分析器,统计结果中有多少同类别的文档属于同一个簇。具体计算公式如下:
P(i,j)=nijnjR(i,j)=nijniF1(i,j)=2×P(i,j)×R(i,j)P(i,j)+R(i,j)\begin{aligned} & P(i, j) = \frac{n_{ij}}{n_j} \\ & R(i, j) = \frac{n_{ij}}{n_i} \\ & F_1(i, j) = \frac{2 \times P(i,j) \times R(i, j)}{P(i,j) + R(i,j)} \end{aligned} P(i,j)=njnijR(i,j)=ninijF1(i,j)=P(i,j)+R(i,j)2×P(i,j)×R(i,j)
nijn_{ij}nij:表示簇j中属于类别iii的文档;
njn_jnj:表示簇jjj中文档总数;
nin_ini:表示类别iii中文档总数;
对整个评测任务而言,它的综合F1F_1F1是所有类目上分值的加权平均,如下公式所述:
F1=∑ininmax⁡j(F1(i,j))F_1 = \sum\limits_{i}\frac{n_i}{n}\max\limits_j(F_1(i, j)) F1=innijmax(F1(i,j))
其中n=∑inin = \sum\limits_i n_in=ini

本次评测选择搜狗实验室提供的文本分类语料的一个子集,我称它为“搜狗文本分类语料库迷你版”。该迷你版语料库分为5个类目,每个类目下1000 篇文章,共计5000篇文章。运行代码如下:

# -*- coding:utf-8 -*-from pyhanlp import *
from tests.demos.demo_text_classification import sogou_corpus_pathClusterAnalyzer = JClass('com.hankcs.hanlp.mining.cluster.ClusterAnalyzer')if __name__ == '__main__':for algorithm in "kmeans", "repeated bisection":print("%s F1=%.2f\n" % (algorithm, ClusterAnalyzer.evaluate(sogou_corpus_path, algorithm) * 100))

运行结果:

...
加载中...
[教育]...100.00% 1000 篇文档
[汽车]...100.00% 1000 篇文档
[健康]...100.00% 1000 篇文档
[军事]...100.00% 1000 篇文档
[体育]...100.00% 1000 篇文档
耗时 13399 ms 加载了 5 个类目,5000 篇文档
kmeans聚类中...耗时 83538 ms 完毕。
kmeans F1=72.22...
加载中...
[教育]...100.00% 1000 篇文档
[汽车]...100.00% 1000 篇文档
[健康]...100.00% 1000 篇文档
[军事]...100.00% 1000 篇文档
[体育]...100.00% 1000 篇文档
耗时 9857 ms 加载了 5 个类目,5000 篇文档
repeated bisection聚类中...耗时 45148 ms 完毕。
repeated bisection F1=80.40

5 参考文献

  1. 何晗《自然语言处理入门》;
  2. 宗成庆《统计自然语言处理》;
  3. 李航《统计学习方法》;

6 需要解决的问题

  1. 理解k-meas聚类、层次聚类更多数学细节;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sublime text3下BracketHighlighter的配置方法

st3的配置方法和st2是有区别的&#xff0c;所以网上搜索到的方法大多不能用&#xff0c;我google之后总结了一下。 一、 1、在st3中按preferences-->package settings-->Bracket highlighter-->Bracket settings-Default打开配置文件。 2、将配置文件信息全选复制一份…

利用spring注解创建bean

spring注解spring 原始注解1.1 Component注解1.2 Controller,Service,Repository同上1.3 注解方式依赖注入spring 新注解1. 用来解析配置类&#xff0c;利用配置类替代xml注解代替了xml的繁琐配置 spring 原始注解 1.1 Component注解 <!--spring 使用注解创建对象 compone…

文本分类--普通分类

1 基本概念 文本分类 文本分类&#xff08;text classification&#xff09;&#xff0c;指的是将一个文档归类到一个或多个类别的自然语言处理任务。文本分类的应用场景非常广泛&#xff0c;包括垃圾邮件过滤、自动打标等任何需要自动归档文本的场合。 文本分类在机器学习中属…

hdoj 2041 超级阶梯

代码&#xff1a; #include <stdio.h>int main(){int n;int i;int m;int count;int dp[50];while(scanf("%d",&n)!EOF){dp[1]1;dp[2]1;dp[3]2;while(n--){count0;scanf("%d",&m);for(i4; i<m; i){dp[i]dp[i-1]dp[i-2];}printf("%d\n…

文本分类--情感分析

&#xff08;纯属为了记录自己学习的点滴过程&#xff0c;引用资料都附在参考列表&#xff09; 1 基本概念 情感分析 对于情感分析而言&#xff0c;只需要准备标注了正负情感的大量文档&#xff0c;就能将其视作普通的文本分类任务来解决。此外&#xff0c;一些带有评分的电影…

websocket使用

websocket1. 概述2. websocket的用法3. js代码实现4. 服务器端代码实现maven下载地址&#xff1a;https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket 1. 概述 什么是websocket - WebSocket是一种网络传输协议&#xff0c; 可在单个TCP连接上进行全双工…

深度学习与自然语言处理

&#xff08;纯属为了记录自己学习的点滴过程&#xff0c;引用资料都附在参考列表&#xff09; 1 传统方法的局限 1.1 传统方法的套路 传统方法的处理流程简单来说就是&#xff1a;特征提取传统机器学习模型训练&#xff1b; 特征提取&#xff1a; 使用了特征模板、TF-IDF、…

linux 烧写(1)

第一部分: 一、BootLoader的概念 BootLoader是系统加电启运行的第一段软件代码&#xff0e;回忆一下PC的体系结构我们可以知道&#xff0c;PC机中的引导加载程序由BIOS&#xff08;其本质就是一段固件程序&#xff09;和位于硬盘MBR中的引导程序一起组成。BIOS在完成硬件检测和…

利用websocket实现一对一聊天

一对一聊天websocket1. 效果展示2. 业务分析&#xff08;逻辑展示...&#xff09;3. 技术点功能 即时发送消息||随时发送消息历史消息显示已读未读状态 1. 效果展示 由于没做登录&#xff0c;就以jack和rose两人聊天 两人可相互发消息 持续输出. . 当只有jack在线时 嘤…

中文分词--词典分词--最长匹配

&#xff08;个人学习笔记&#xff0c;慎重参考&#xff09; 1 基本概念 中文分词 指的是将一段文本拆分为一系列单词的过程&#xff0c;这些单词顺序拼接后等于原文本。 作为中文信息处理的第一站&#xff0c;是后续nlp任务的基础&#xff0c;中文分词算法大致可分为词典规则…

css3动画animation,transition

animation demo1 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>animation动画</title><style>#div1 {width: 100px;height: 100px;background-color: pink;position: absolute;top: 10%;left: 25%;}/* 延迟…

PLSQL Developer 运用Profiler 分析存储过程性能

最近应公司需要&#xff0c;需要编写ORACLE存储过程。本人新手&#xff0c;在完成存储过程的编写后&#xff0c;感觉需要对存储过程中各个语句的执行时间进行分析&#xff0c;以便 对整个存储过程进行优化。 由于用的是PLSQL Developer 客户端工具&#xff0c;而网上大多介绍的…

四、Dynamic-programming algorithm Dynamic--LCS

(学习笔记&#xff0c;无什参考价值&#xff01;) 1 问题 2 算法 2.1 Brute-force LCS algorithm 检查每一个subsequence是否是yyy的子列时&#xff0c;遍历yyy的每一个元素&#xff0c;看是否依次可以全部覆盖subsequence所有元素&#xff0c;所以其复杂度为O(n)O(n)O(n); …

Spring JdbcTemplate Curd

curd1. 实现步骤2. maven dependency3. curd代码database: oracledataSource: alibaba druid 1. 实现步骤 1. 导入spring-jdbc 和 spring-tx(事务)坐标 2. 创建数据库表和实体 3.创建JdbcTemplate对象JdbcTemplate jdbc new JdbcTemplate();jdbc.setDataSource(dataSource);…

linux环境配置与使用合集

配置linux和samba共享 1.  安装linux操作系统 2.  通过windows操作系统ping linux看看是否可以ping通 3.  相关软件安装 a. 安装samba sudo apt-get install samba4, sudo apt-get install system-config-samba b. 安装ssh&#xff0c;这样windows可以远程登录linux, sud…

五、分治法应用--矩阵乘法

1 朴素算法 这个算法就是矩阵乘法的定义&#xff1a; 很容易看出这个算法复杂度是Θ(n3)\Theta(n^3)Θ(n3)。 2 递归算法 分治法首先是从分割问题开始的&#xff0c;得到数学上的递归关系后&#xff0c;然后使用递归的方式实现。 由上面的数学性质&#xff0c;可以使用递…