MOne︱基于词包的无监督多主题得分
1 开源的今日头条数据
又开源了一个某机构整理的今日头条数据,可见:今日头条中文新闻文本(多层)分类数据集
本数据集有1000+分类,2914000条数据,虽然没有放开正文,但是也是非常好的词包收集源,于是笔者花了很久整理一版本。今日头条的数据样式为:
以|,|分割的各字段,从前往后分别是 新闻ID,分类代码,新闻字符串(仅含标题),新闻关键词,新闻label
1000866069|,|tip,news|,|【互联网资讯】PPT设计宝典!十招教你做出拿得出手的PPT|,|互联网,美国,ppt,powerpoint,幻灯片,演示文稿,微软,字体列表|,|
由开源的内容就可以构建一套新闻类的词包。但是发现,分类代码太过详细,1000+类别,项目太多,而且准确率有待考察,还不如直接归类到大类,粗线条一些的。下面做了一些数据清洗:
- 1、分类约束,只考察大类,把譬如:
digital/appliances/small_home_appliance
或digital/appliances/television
折算成digital
- 2、有一些素材不是那么优质,主题点很多,反正数据2000W+,只筛选主题分类代码只有一种类别的素材
- 3、约束字数,不能有1个字以及字数超过8
'新闻关键词'
与'新闻label'
字段,同质化挺多,经过筛选之中,两个语料质量都挺高的。
2 准备主题词包素材
主题词包素材,包括四样内容:
- 每个词出现在哪些主题之中,
topic
; - 每个词出现在哪些主题之中,同时统计每个词主题频次,
topic_detail
; - 每个词TF,
tf
; - 每个词IDF,
idf
。
每个单词的格式样式为:
{
'word':{
'idf':1,
'tf':1,
'topic': ['new','sports']
'topic_detail':{
'digital': 16,
'emotion': 4,
'general_positive': 0
}
}
}
其中'topic'
和 'topic_detail'
是对应的。同时自己写了一个计算TFIDF的过程,但是计算IDF必须要不断遍历全文件,花了好几天时间终于计算出结果。
最终整理得到了如下为'网易云音乐'
的主题内容:
{'idf': 9.0134188194616147,
'tf': 88,
'topic': ['digital',
'news_tech',
'news_entertainment',
'news_baby',
'news_game',
'news_car',
'news_house',
'emotion',
'news_finance'],
'topic_detail': {'digital': 16,
'emotion': 4,
'general_positive': 0,
'news': 0,
'news_agriculture': 0,
'news_astrology': 0,
'news_baby': 2,
'news_car': 2,
'news_collect': 0,
'news_comic': 0,
'news_culture': 0,
'news_design': 0,
'news_edu': 0,
'news_entertainment': 35,
'news_fashion': 0,
'news_finance': 1,
'news_food': 0,
'news_game': 4,
'news_health': 0,
'news_history': 0,
'news_home': 0,
'news_house': 1,
'news_military': 0,
'news_novel': 0,
'news_pet': 0,
'news_politics': 0,
'news_society': 0,
'news_sports': 0,
'news_tech': 28,
'news_travel': 0,
'news_world': 0,
'science_all': 0,
'technique': 0,
'video_ent': 0}}
记录每个词的词频、IDF,以及分属主题以及每个主题出现频次。
3 MOneTopic 无监督主题得分流程
有些主题判定分出关键内容之后就打上一个标签,但是每个词语的属性很多样,那么句子的属性也有可能有很多属性。 基于前面整理的词包素材内容,包含词粒度的四样内容:每个词分属主题、分属主题频数、词TF/IDF信息。 那么接下来的流程就是:
3.1 一句话输入:
网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。
3.2 用户词典载入
jieba.add_word
并规定词性,然后分词时候根据自定义的词性就可以比较好的筛选出这些关键词。当然这些关键词把顺序打乱了。
3.3 计算主题得分
这边主题得分可以有两种类型:
- 粗粒度:每个词分属主题topic、
- 细粒度:分属主题频数topic_detail {‘perTopic’: {‘digital’: {‘degree’: 5.1740782122905022, ‘num’: 1362}, ‘news_baby’: {‘degree’: 1.3448044692737429, ‘num’: 354}, ‘news_culture’: {‘degree’: 1.4739664804469272, ‘num’: 388}, ‘news_entertainment’: {‘degree’: 19.64022346368715, ‘num’: 5170}}
那么这个就是细粒度版本的,可以看到每个主题的计数都很夸张,这个把每个单词的属性;
{'totalTopic': {'digital': {'degree': 2.6153846153846154, 'num': 6},
'news_entertainment': {'degree': 2.6153846153846154, 'num': 6},
'news_finance': {'degree': 2.6153846153846154, 'num': 6},
'news_tech': {'degree': 3.4871794871794872, 'num': 8}
粗粒度版本中的主题数量就没那么夸张。
这边的筛选规则是,超过这些主题内容的数值的90%分位数的进行保留。
3.4 贴上关键词的TF/IDF
从词包之中拿出来,贴出:
{'DJ': {'idf': 10.794004988091546,
'tf': 14,
'tfidf': 151.11606983328164},
'产品': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
'分享': {'idf': 12.808908008633811, 'tf': 1, 'tfidf': 12.808908008633811},
'发现': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
'好友': {'idf': 10.729466466953975, 'tf': 15, 'tfidf': 160.94199700430963},
'打造': {'idf': 10.457532751470332, 'tf': 20, 'tfidf': 209.15065502940664},
'推荐': {'idf': 11.7102957199657, 'tf': 5, 'tfidf': 58.551478599828499},
'生活': {'idf': 10.668841845137539, 'tf': 16, 'tfidf': 170.70146952220063},
'用户': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
'社交功能': {'idf': 12.403442900525645, 'tf': 2, 'tfidf': 24.80688580105129},
'网易云音乐': {'idf': 9.0134188194616147, 'tf': 88, 'tfidf': 793.18085611262211},
'音乐': {'idf': 4.4418402757952107, 'tf': 8605, 'tfidf': 38222.035573217785},
'音乐人': {'idf': 8.4458093838454467, 'tf': 156, 'tfidf': 1317.5462638798897}}
4 MOneTopic 函数记录
在本篇使用的函数中,笔者为了方便自己记忆,有如下的函数:
- getPseg:按照词性进行分词,可以有效将定义的关键词暴露出来;
- totalTopic,粗粒度主题得分,每个词基本属性,不带词频,[‘体育’,’新闻’]
- perTopic,细粒度主题打分,每个基本属性+带词频,[‘体育’:10,’新闻’:1]
- ShowTfidf,根据词典把每个词的IDF、TF灌入;
- TopN,主要对totalTopic/perTopic进行排序处理,原则是大于90%分位数的保留,该函数可以调节。
- TopicClassifier,主函数,如下解释。
TopicClassifier(sentense,TopicDict,topic_class,percs = 90,allowPOSs = ['topic'])
其中,
- sentense为输入单个句子;
- TopicDict为今日头条整理的词典;
- topic_class,如附件;
- percs,代表粗粒度、细粒度主题得分的时候,筛选前90%分位数;
- allowPOSs ,代表分词的时候,给入的词性。
MOneTopic 无监督主题标记设想
由于整理出来的质量高的分类都是新闻类的,所以笔者自己整理的数据集比较适合鉴别新闻类文本的主题。 主题标记的粗粒度以及细粒度版本都各有自己优缺点。
那么模块如何使用,就留由看客自己鉴定了。
案例一:
‘网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。’ 关键词:音乐、音乐人、网易云音乐、打造、生活 细粒度主题:娱乐、数码 粗粒度主题:科技、娱乐、数码、金融
案例二:
‘世界杯小组赛进入最后一轮,前2轮表现极其出色的C罗赢得了全世界的称赞,就连葡萄牙总统马塞洛-雷贝洛-德索萨也在同俄罗斯总统普京会面时,也不禁自夸:我们葡萄牙可是有C罗这种顶级巨星的。’ 关键词:C罗、马塞洛、葡萄牙、表现、总统、俄罗斯总统普京 细粒度主题:体育 粗粒度主题:体育、国际、健康
案例三:
‘《创造101》终于收官了——经过昨晚(6月23日)的一夜鏖战,十一名女团人选最终确定:孟美岐、吴宣仪、杨超越、段奥娟、yamy、赖美云、紫宁、Sunnee(杨芸晴)、李紫婷、傅菁、徐梦洁。’ 关键词:创造101、女团、杨超越 细粒度主题:娱乐 粗粒度主题:娱乐、时尚、体育
- 帝国cms栏目别名如何调用?
- 数据库安全·保护表字段
- 【实践】伪造名人的脸—做一个小示例了解生成式对抗网络
- Spring 常见问题与解决方法
- 如何通过css控制内容显示顺序 第二行的内容优先显示
- 杨廷琨 - 用SQL解析神奇的扑克牌魔术
- Spring boot with Spring security
- Spring RestFul and RestTemplate
- Spring boot with Velocity template
- Oracle 11g R2 RAC 高可用连接特性 – SCAN 详解
- Spring boot · 链接池配置
- Linux下命令行图片格式转换
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序可移动浮窗
- Vant实现省市区三级联动
- springboot+Druid+mybatis整合
- Vue_cli升级4.x版本搭建项目
- String系列之format方法
- Flutter使用StatefulWidget有状态组件累计添加数组
- SpringMVC系列一
- Flutter循环Json数组
- Flutter组件随笔练习
- TKE 容器健康检查最佳实践
- 微信小程序修改checkbox和radio的样式
- TRTC Android端开发接入学习之实现实时屏幕分享(四)
- Vue使用组件递归实现评论盖楼功能笔记
- 自监督注意力在密集光流估计中的应用
- SpringBoot+MyBatis+Spring 技术整合实现商品模块的CRUD操作