又开源了一个某机构整理的今日头条数据,可见:今日头条中文新闻文本(多层)分类数据集
本数据集有1000+分类,2914000条数据,虽然没有放开正文,但是也是非常好的词包收集源,于是笔者花了很久整理一版本。今日头条的数据样式为:
以|,|分割的各字段,从前往后分别是 新闻ID,分类代码,新闻字符串(仅含标题),新闻关键词,新闻label
1000866069|,|tip,news|,|【互联网资讯】PPT设计宝典!十招教你做出拿得出手的PPT|,|互联网,美国,ppt,powerpoint,幻灯片,演示文稿,微软,字体列表|,|
由开源的内容就可以构建一套新闻类的词包。但是发现,分类代码太过详细,1000+类别,项目太多,而且准确率有待考察,还不如直接归类到大类,粗线条一些的。下面做了一些数据清洗:
digital/appliances/small_home_appliance
或digital/appliances/television
折算成digital
'新闻关键词'
与'新闻label'
字段,同质化挺多,经过筛选之中,两个语料质量都挺高的。
主题词包素材,包括四样内容:
topic
;topic_detail
;tf
;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,以及分属主题以及每个主题出现频次。
有些主题判定分出关键内容之后就打上一个标签,但是每个词语的属性很多样,那么句子的属性也有可能有很多属性。 基于前面整理的词包素材内容,包含词粒度的四样内容:每个词分属主题、分属主题频数、词TF/IDF信息。 那么接下来的流程就是:
网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。
jieba.add_word
并规定词性,然后分词时候根据自定义的词性就可以比较好的筛选出这些关键词。当然这些关键词把顺序打乱了。
这边主题得分可以有两种类型:
那么这个就是细粒度版本的,可以看到每个主题的计数都很夸张,这个把每个单词的属性;
{'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%分位数的进行保留。
从词包之中拿出来,贴出:
{'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}}
在本篇使用的函数中,笔者为了方便自己记忆,有如下的函数:
TopicClassifier(sentense,TopicDict,topic_class,percs = 90,allowPOSs = ['topic'])
其中,
由于整理出来的质量高的分类都是新闻类的,所以笔者自己整理的数据集比较适合鉴别新闻类文本的主题。 主题标记的粗粒度以及细粒度版本都各有自己优缺点。
那么模块如何使用,就留由看客自己鉴定了。
案例一:
‘网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。’ 关键词:音乐、音乐人、网易云音乐、打造、生活 细粒度主题:娱乐、数码 粗粒度主题:科技、娱乐、数码、金融
案例二:
‘世界杯小组赛进入最后一轮,前2轮表现极其出色的C罗赢得了全世界的称赞,就连葡萄牙总统马塞洛-雷贝洛-德索萨也在同俄罗斯总统普京会面时,也不禁自夸:我们葡萄牙可是有C罗这种顶级巨星的。’ 关键词:C罗、马塞洛、葡萄牙、表现、总统、俄罗斯总统普京 细粒度主题:体育 粗粒度主题:体育、国际、健康
案例三:
‘《创造101》终于收官了——经过昨晚(6月23日)的一夜鏖战,十一名女团人选最终确定:孟美岐、吴宣仪、杨超越、段奥娟、yamy、赖美云、紫宁、Sunnee(杨芸晴)、李紫婷、傅菁、徐梦洁。’ 关键词:创造101、女团、杨超越 细粒度主题:娱乐 粗粒度主题:娱乐、时尚、体育