MOne︱基于词包的无监督多主题得分

时间:2022-06-22
本文章向大家介绍MOne︱基于词包的无监督多主题得分,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 开源的今日头条数据

又开源了一个某机构整理的今日头条数据,可见:今日头条中文新闻文本(多层)分类数据集

本数据集有1000+分类,2914000条数据,虽然没有放开正文,但是也是非常好的词包收集源,于是笔者花了很久整理一版本。今日头条的数据样式为:

以|,|分割的各字段,从前往后分别是 新闻ID,分类代码,新闻字符串(仅含标题),新闻关键词,新闻label

1000866069|,|tip,news|,|【互联网资讯】PPT设计宝典!十招教你做出拿得出手的PPT|,|互联网,美国,ppt,powerpoint,幻灯片,演示文稿,微软,字体列表|,|

由开源的内容就可以构建一套新闻类的词包。但是发现,分类代码太过详细,1000+类别,项目太多,而且准确率有待考察,还不如直接归类到大类,粗线条一些的。下面做了一些数据清洗:

  • 1、分类约束,只考察大类,把譬如: digital/appliances/small_home_appliancedigital/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、女团、杨超越 细粒度主题:娱乐 粗粒度主题:娱乐、时尚、体育