案例背景
本案例是从一堆新闻文件中建立相应的主题模型,然后得到不同模型的主题特点,并通过对新文本数据集的预测得到其可能的主题分类。
相关知识
TF-IDF
TF-IDF(term frequency–inverse document frequency)是一种针对关键字的统计分析方法,用来评估关键字或词语对于文档、语料库和文件集合的重要程度。关键字的重要程度跟它在文档中出现的次数成正比,但同时跟它出现的频率呈反比。这种加权的形式能有效避免常用词对于关键字搜索结果的影响,提高搜索结果与关键字之间的相关性。
TF-IDF的主要思想是:如果某个关键字在一篇文档中出现的频率(TF, Term Frequ-ency)高,并且在其他文档中很少出现,那么认为该关键字具有良好的区分不同文档的能力,也就越重要。
词性标注
所谓词性标注是给每个词语确定一个词性分类。例如,“我爱Python数据分析与数据化运营”分词后的结果可能是“我|爱|Python|数据分析|与|数据|化|运营”,其中每个词都有专属的分类:
- 我:代词
- 爱:动词
- Python:英语
- 数据分析:习用语
- 与:介词
- 数据:名词
- 化:名词
- 运营:名动词,具有名词功能的动词
在运营中,有很多场景需要做词性标注,然后基于标注的词性可以做进一步应用。例如统计竞争对手新闻稿的主要词语分布、分词结果筛选和过滤、配合文章标签的提取等。
案例数据
案例数据来自搜狐新闻2012年6月到7月的部分新闻数据,涵盖了新闻、家居、体育等主题频道。压缩包中有10个新闻文件,每个文件中包含多条新闻,每条新闻的格式相同,包含新闻URL、页面ID、页面标题和页面内容4部分。以下是文件内容格式示例:
<doc>
<url>页面URL</url>
<docno>页面ID</docno>
<contenttitle>页面标题</contenttitle>
<content>页面内容</content>
</doc>
python实现
导入模块
# tar压缩包库
import tarfile
import os
# 带词性标注的分词模块
import jieba.posseg as pseg
# gensim的词频统计和主题建模模块
from gensim import corpora, models
# 用于处理xml格式文件
from bs4 import BeautifulSoup
解压文件
#### 解压缩文件 #####
if not os.path.exists('./news_data'): # 如果不存在数据目录,则先解压数据文件
tar = tarfile.open('news_data.tar.gz') # 打开tar.gz压缩包对象
names = tar.getnames() # 获得压缩包内的每个文件对象的名称
for name in names: # 循环读出每个文件
tar.extract(name, path='./') # 将文件解压到指定目录
tar.close() # 关闭压缩包对象
内容汇总
# 全角转半角
def str_convert(content):
'''
将内容中的全角字符,包含英文字母、数字键、符号等转换为半角字符
:param content: 要转换的字符串内容
:return: 转换后的半角字符串
'''
new_str = ''
for each_char in content: # 循环读取每个字符
code_num = ord(each_char) # 读取字符的ASCII值或Unicode值
if code_num == 12288: # 全角空格直接转换
code_num = 32
elif (code_num >= 65281 and code_num <= 65374): # 全角字符(除空格)根据关系转化
code_num -= 65248
new_str += chr(code_num)
return new_str
# 解析文件内容
def data_parse(data):