新闻内容分词后在Jupyter Notebook中使用TF-IDF算法提取关键词

2021-7-30 17:01| 发布者: Fuller| 查看: 4805| 评论: 2

摘要: 1,背景介绍今天这个Jupyter Notebook,是《Jupyter Notebook使用sklearn的TF-IDF算法计算关键词权重》的续篇,这次使用真实数据做分析实验。把网络爬虫软件收集的腾讯新闻文本内容导入GooSeeker文本分词和情感分析 ...

1,背景介绍

今天这个Jupyter Notebook,是《Jupyter Notebook使用sklearn的TF-IDF算法计算关键词权重》的续篇,这次使用真实数据做分析实验。

把网络爬虫软件收集的腾讯新闻文本内容导入GooSeeker文本分词和情感分析工具做分词,然后导出分词效果表,使用Python基于TF-IDF算法做进一步的关键词提取。

1.1,TF-IDF算法介绍

Jupyter Notebook使用sklearn的TF-IDF算法计算关键词权重》一文做了讲解,本文不再赘述。在上文基础上,本文将使用实际数据进行计算。

1.2,本模板适应的场景

本模板根据GooSeeker分词和文本分析软件生成的分词效果表,对数据进行基本处理后,调用sklearn库做进一步TF-IDF计算处理。

1.3,使用方法

基本操作顺序是:

1. 在GooSeeker分词和文本分析软件上进行任务创建并导入包含原始内容的excel,并导出分词效果表

2. 将导出的分词效果表放在本notebook的data/raw文件夹中

3. 从头到尾执行本notebook的单元

注意:每个notebook项目目录都预先规划好了,具体参看Jupyter Notebook项目目录规划参考。如果要做多个分析项目,把整个模板目录专门拷贝一份给每个分析项目。

1.4,简要技术说明

在每个功能项单元,如果不需要关心的编程细节,将注明【编程细节】。

本notebook主要实现以下几个步骤:

1. 读取data/raw文件夹中的从分词工具导出的分词效果表

2. 对分词效果表进行基本的预处理

3. 使用sklearn库做TF-IDF关键词提取实验

2,第三方库

Scikit-learn(简记 sklearn),是面向 Python 的免费机器学习库。Sklearn 包含了很多种机器学习的方式:如分类、回归、聚类算法以及降维、模型选择和数据预处理等机器学习算法。Sklearn 同时支持 NumPy 和 SciPy 数据结构和 Matplotlib 库。

3,数据源

数据源是GooSeeker分词和文本分析软件生成的分词效果表。 原始数据是使用GooSeeker快捷采集得到的新闻数据。供参考和实验。

将原始的文本内容以Excel格式导入GooSeeker分词软件,几分钟后就能得到词频词性表和分词效果表。如果还做了关键词筛选,还可以生成共词矩阵和社交关系图。另外情感分析也可自动执行,也可以配置自己的情感词库和文本分类关键词。本文使用Python对分词效果表进行统计分析和画图。下图显示的是从集搜客分词和文本分析软件导出的分词效果表数据,下面我们会读取这个excel并且把"分词数据"这一列"做处理和转换。

4,修改历史

2021-07-28:第一版发布

5,版权说明

本notebook是GooSeeker大数据分析团队开发的,所分析的源数据是GooSeeker分词和文本分析软件生成的,本notebook中的代码可自由共享使用,包括转发、复制、修改、用于其他项目中。 

6,准备程序环境

6.1,引入sklearn库及下面的子库

Scikit-learn(简记 sklearn),是面向 Python 的免费机器学习库。Sklearn 包含了很多种机器学习的方式:如分类、回归、聚类算法以及降维、模型选择和数据预处理等机器学习算法。Sklearn 同时支持 NumPy 和 SciPy 数据结构和 Matplotlib 库。

Sklearn 是机器学习中一个常用的 Python 第三方模块,能够为用户提供各种机器学习算法接口,可以让用户简单、高效地进行数据挖掘和数据分析。

sklearn库共分为6大部分,分别用于完成分类任务、回归任务、聚类任务、降维任务、模型选择以及数据的预处理。

# coding:utf-8    

from sklearn import feature_extraction  

from sklearn.feature_extraction.text import TfidfTransformer  

from sklearn.feature_extraction.text import CountVectorizer  


6.2,引入其他程序包并设定重要变量

设定要分析的文件名变量。使用以下变量对应GooSeeker分词结果表:

file_word_freq:词频表

file_seg_effect: 分词效果表

file_word_choice_matrix: 选词矩阵表

file_word_choice_match: 选词匹配表

file_word_choice_result: 选词结果表

file_co_word_matrix: 共词矩阵表

【编程细节】本节下面的代码将对上述词频表名变量赋值

import pandas as pd

import os

%xmode Verbose

import warnings

warnings.filterwarnings("ignore", category=DeprecationWarning)

# 存原始数据的目录

raw_data_dir = os.path.join(os.getcwd(), '..\\..\\data\\raw')

# 存处理后的数据的目录

processed_data_dir = os.path.join(os.getcwd(), '..\\..\\data\\processed')

filename_temp = pd.Series(['分词效果'])

file_seg_effect = ''


6.3,检测data\raw目录下是否有分词效果表

# 0:'词频', 1:'分词效果', 2:'选词矩阵', 3:'选词匹配', 4:'选词结果', 5:'共词矩阵'

print(raw_data_dir + '\r\n')

for item_filename in os.listdir(raw_data_dir):

    if filename_temp[0] in item_filename:

        file_seg_effect = item_filename

        continue

if file_seg_effect:

    print("分词效果excel表:", "data\\raw\\", file_seg_effect)

else:

    print("分词效果excel表:不存在")


输出结果:

C:\Users\work\workspace_219\notebook\新闻内容分词后使用TF-IDF算法提取关键词(Jupyter Notebook)\notebook\eda\..\..\data\raw

分词效果excel表: data\raw\ 分词效果_202107271616276280.xlsx


7,读取分词效果表

以下的演示以GooSeeker分词和文本分析软件生成的分词效果excel表为例,需要把分词效果表放到本notebook的data/raw文件夹下

df = pd.read_excel(os.path.join(raw_data_dir, file_seg_effect))


8,在打开的excel最右边新增1列“TF-IDF关键词”

df["TF-IDF关键词"] = ''


9,查看excel表前10行数据

已有的“关键词”列是GooSeeker分词工具提取的关键词,新增的“TF-IDF关键词”列目前的值是空的,本notebook运行完成后,“TF-IDF关键词”列将填上内容,可以对比一下GooSeeker分词工具提取的关键词与基于tf-idf提取的关键词有哪些不同。用tf-idf提取关键词还有一个最大的特点:可以自己控制关键词数量,注意观察后面代码中的topN变量。


10,把表格的“分词数据”这一列取出来

把“分词数据”这一列取出来,添加到corpus,作为已经分词的语料库

corpus = []

for item in df["分词数据"]:

    corpus.append(item)

print(corpus[1])


输出结果:

本报 石家庄 7 月 26 日电 记者 徐运 平 张腾扬 一 支 香烟 刚刚 点燃 一 台 轮式 机器人 便 迅速 赶来 发出 火警 语音 提示 这 是 我们 研发 的 新 一代 智能 消防 巡 检 灭火 机器人 用于 文物 古建筑 保护 它 能 迅速 定位 火情 并 抵达 起火 位置 喷射 超细 干粉 灭火 在 河北省 唐山市 中信 重工 开诚 智能 装备 有限公司 展厅 总经理 陆文涛 介绍 现在 平均 每 两 个 月 就 有 一 款 新 产品 诞生 2016 年 7 月 习近平 总书记 在 唐山市 考察 时 强调 希望 唐山 广大干部 群众 继续 弘扬 抗震 精神 抓住 国家 推动 京津 冀 协同 发展 的 有利 时机 按照 三 个 努力 建成 目标 再接再厉 不懈努力 全面 做 好 改革 发展 稳定 各项 工作 争取 在 转变 发展 方式 调整 经济 结构 推进 供给 侧 结构性 改革 等 方面 走 在 前列 使 这 座 英雄 城市 再创 辉煌 抓住 转 字 做文章 唐山 近年 来 推动 制造业 数字化 智能化 转型 完善 产业链 供应 链 培育 新 动能 新 优势 加快 构建 现代 产业 体系 2020 年 8 月 16 日 位于 主城区 的 河钢 集团 唐钢 公司 老厂 区 炼 完 最后 一 炉 钢 20 多 天 后 地处 乐亭县 渤海湾 边 的 唐钢 公司 新厂区 正式 投产 从 城区 到 沿海 不仅 是 厂 区 搬迁 更是 全新 转型 升级 走 进 新厂区 600 多 米 长 的 轧钢 生产线 上 空无一人 主控 室内 操作 工 轻 点 鼠标 便 完成 炼钢 出 钢 溅 渣 等 工序 新厂区 构建 起 全 流程 一体化 的 生产 管 控系统 实现 可视 化 数字化 全智能 模式 公司 生产 制造部 生产 指挥 中心 主任 田伟 介绍 高 铁 是 唐山 的 新 名片 去年底 时速 350 公里 的 高速 货 运动 车组 在 中 车 唐山 机车车辆 有限公司 下 线 货物 单位 重量 能耗 仅 为 飞机 的 8 还 能用 大 数据 分析 云端 虚拟 配 载 等 技术 实现 货物 智能 配 载 和 精准 识别 定位 公司 产品 研发 中心 高级 工程师 梁永廷 说 新 技术 新 业态 正在 加速 崛起 炎炎夏日 路南区 九天 微星 卫星 研发 制造 基地 项目 一期 工程 完工 技术人员 正 紧张 调试 设备 项目 建成 后 将 拥有 年产 100 颗卫星 的 研制 生产能力 唐山 九天 微星 航天 科技 有限公司 负责人 介绍 眼下 路南区 正 整合 上下游 配套 资源 打造 集 研发 测试 制造 运营 于 一体 的 国际航空 航天 产业园 在 唐山 高新区 集 研发 生产 销售 服务 于 一体 的 机器人 产业 集 群 业已 成型 涉 机器人 研发 制造 的 企业 总数 达 70 多 家 产品 达 100 多 个 品种 其中 特种 机器人 和 焊接 机器人 的 规模 技术水平 均 居 全国 前列 今年 上半年 唐山 高新区 机器人 产业 主营业务 收入 30亿 元 同比 增长 23 今年 上半年 唐山 全市 地区 生产总值 完成 3805.4亿 元 同比 增长 11.3 全市 高新技术 产业 增加值 增速 达 13.3 河北省委 常委 唐山市委 书记 张古江 表示 我们 将 进一步 聚焦 聚 力 构建 现代 产业 体系 加快 实施 创新 驱动 战略 提升 产业链 供应 链 现代化 水平 培育 壮大 发展 新 动能 努力 在 转变 发展 方式 调整 经济 结构 推进 供给 侧 结构性 改革 等 方面 走 在 前列


11,生成关键词矩阵

11.1,定义CountVectorizer类的对象

该对象会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频

vectorizer=CountVectorizer()         

11.2,将文本转换成关键词矩阵

使用vectorizer的fit_transform方法将文本转为词频矩阵

X=vectorizer.fit_transform(corpus) 


12,计算tf-idf

12.1,定义TfidfTransformer类的对象

该对象会统计每个词语的tf-idf权值

transformer=TfidfTransformer()


12.2,计算tf-idf

使用transformer的fit_transform方法计算tf-idf

tfidf=transformer.fit_transform(X)


13,获取词袋模型中的所有词语

word=vectorizer.get_feature_names() 

14,取td-idf矩阵

将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重

weight=tfidf.toarray()   

print(weight[1])

输出结果:

[0.         0.06430797 0.         ... 0.         0.04603042 0.        ]


15,设置每篇新闻提取10个关键词

如果需要更多或更少的关键词,请更改下面这条复制语句

topN = 10


16,输出tf-idf提取的关键词

实现了以下过程:

1. 输出tf-idf提取的关键词

2. 把通过tf-idf提取的关键词写入df表格里

for i in range(len(weight)):         

    print("-------这里输出第",i,u"篇文本的tf-idf关键词------" )

    df2 = pd.DataFrame()

    list2 = []

    keyword = ''

    df3 = pd.DataFrame()

    for j in range(len(weight[i])):

        if weight[i][j] >0:

            list2.append([word[j],float(weight[i][j])])

    df2 = pd.DataFrame(data=list2, columns=['name','tf-idf-value'])

    df3 = df2.sort_values(by='tf-idf-value',ascending=False).head(topN)

    print(df3,"\n")

    for item in df3["name"]:

        keyword = keyword + item + ' '

    df.loc[i,"TF-IDF关键词"] = keyword


输出结果:

-------这里输出第 0 篇文本的tf-idf关键词------

    name  tf-idf-value

407   畜禽      0.506194

339  检查组      0.331111

521   遗传      0.257530

88    保护      0.218940

405  畜牧业      0.202345

113   养殖      0.150490

492   资源      0.138818

190   地方      0.121633

278   抽查      0.110370

466   育种      0.110370 

-------这里输出第 1 篇文本的tf-idf关键词------

    name  tf-idf-value

87    唐山      0.368243

175  机器人      0.250628

212   研发      0.192924

66    制造      0.138091

161  新厂区      0.138091

69    前列      0.138091

58    公司      0.128616

202   生产      0.128616

37    产业      0.120184

80    发展      0.109638 

-------这里输出第 2 篇文本的tf-idf关键词------

    name  tf-idf-value

300   直播      0.367581

141   增长      0.295681

198   恢复      0.258887

277   消费      0.251563

29   上半年      0.192542

113   同比      0.175038

387  销售额      0.164747

153   季度      0.164747

389   门店      0.141211

122   商品      0.141211 

-------这里输出第 3 篇文本的tf-idf关键词------

    name  tf-idf-value

87    唐山      0.368243

175  机器人      0.250628

212   研发      0.192924

66    制造      0.138091

161  新厂区      0.138091

69    前列      0.138091

58    公司      0.128616

202   生产      0.128616

37    产业      0.120184

80    发展      0.109638 

-------这里输出第 4 篇文本的tf-idf关键词------

    name  tf-idf-value

148   养老      0.521692

617  老年人      0.292512

481   机构      0.245333

601   结合      0.226461

467   服务      0.184672

422   支柱      0.144298

567   社区      0.132102

543   生育      0.122098

464  有所为      0.110998

398   护理      0.110998 

-------这里输出第 5 篇文本的tf-idf关键词------

    name  tf-idf-value

172   农业      0.505958

531   潍坊      0.372692

673   蔬菜      0.295583

337   寿光      0.205623

306   大棚      0.179920

501   标准      0.139948

551   生产      0.116704

116   以上      0.115663

173  农产品      0.109959

502  标准化      0.109959 

-------这里输出第 6 篇文本的tf-idf关键词------

    name  tf-idf-value

172   农业      0.505958

531   潍坊      0.372692

673   蔬菜      0.295583

337   寿光      0.205623

306   大棚      0.179920

501   标准      0.139948

551   生产      0.116704

116   以上      0.115663

173  农产品      0.109959

502  标准化      0.109959 

-------这里输出第 7 篇文本的tf-idf关键词------

     name  tf-idf-value

77    博物馆      0.784910

203    智慧      0.280908

193    文物      0.210802

47     保护      0.144168

287    观众      0.130818

145    建设      0.116909

259    管理      0.093636

170    技术      0.077429

194  文物保护      0.065409

64   内部管理      0.065409 

-------这里输出第 8 篇文本的tf-idf关键词------

    name  tf-idf-value

218   营销      0.566060

180   用户      0.339672

67    发送      0.199786

166   治理      0.173351

92    安宁      0.166488

84    垃圾      0.166488

46    信息      0.158183

252   违规      0.133191

75    同意      0.133191

81    商家      0.133191 

-------这里输出第 9 篇文本的tf-idf关键词------

     name  tf-idf-value

202  职业教育      0.799885

63     发展      0.135837

106    建设      0.125778

14     中国      0.119431

123    技能      0.109673

172    特色      0.109673

51     办学      0.103211

196  经济社会      0.103211

141    教育      0.095951

22     人才      0.091933 


17,观察利用tf-idf提取的关键词

显示已经填充了“TF-IDF关键词”字段值后的表格的前10行,可以对比一下GooSeeker分词软件提取的关键词(“关键词”一列)和利用tf-idf提取的关键词(“TF-IDF关键词”一列)

df.head(10)


18,下载本Jupyter Notebook

作为数据探索实验,本notebook放在文件:notebook\eda

新闻内容分词后使用TF-IDF算法提取关键词(Jupyter Notebook).zip


鲜花

握手

雷人

路过

鸡蛋
发表评论

最新评论

评论 Fuller 2021-10-16 10:17
15964002091: 这个能不能将所有结果按照tfidf值进行排序
把topN调大,足够大,就相当于把所有结果按照tfidf排序。另外,在第16节,不要使用weight > 0的条件
评论 15964002091 2021-10-16 09:11
这个能不能将所有结果按照tfidf值进行排序

查看全部评论(2)

GMT+8, 2024-4-20 07:15