Press "Enter" to skip to content

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

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

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
')
​
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
otebook\新闻内容分词后使用TF-IDF算法提取关键词(Jupyter Notebook)
otebook\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,"
")
    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)

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注