机器学习_PySpark-3.0.3文本特征提取(TF-IDF)流程

机器学习_PySpark-3.0.3文本特征提取(TF-IDF)流程

本例中 Tokenizer 是用于分词的模块。

本例中 HashingTF().tranform() 函数把词哈希成特征向量, 返回结果是 Vectors.sparse() 类型的。

本例中 IDF 类用于计算给定文档集合的反文档频率, 是一个词普遍重要性的度量 (即: 一个词存在多少个文档中)。

导入 pyspark.sql 相关模块

Spark SQL 是用于结构化数据处理的 Spark 模块。它提供了一种成为 DataFrame 编程抽象, 是由 SchemaRDD 发展而来。

不同于 SchemaRDD 直接继承 RDD, DataFrame 自己实现了 RDD 的绝大多数功能。

from pyspark.sql import SparkSession
from pyspark.ml.feature import Tokenizer, HashingTF, IDF

创建 SparkSession 对象

Spark 2.0 以上版本的 spark-shell 在启动时会自动创建一个名为 spark 的 SparkSession 对象。

当需要手工创建时, SparkSession 可以由其伴生对象的 builder 方法创建出来。

spark = SparkSession.builder.master("local[*]").appName("spark").getOrCreate()

使用 Spark 构建 DataFrame 数据 (行作为列表中的列表)

当数据量较小时, 可以使用该方法手工构建 DataFrame 数据。

构建数据集 (行作为列表中的列表):

# 创建一个简单的 DataFrame, 每一个句子代表一个文档。
Data_Set = [[0, "I heard about Spark and I love Spark"],[0, "I wish Java could use case classes"],[1, "Logistic regression models are neat"]]

将数据集转化到指定列名的 DataFrame 数据框:

SDF = spark.createDataFrame(Data_Set).toDF("label", "sentence")

输出 DataFrame 数据框:

print("[Message] Builded Spark DataFrame:")
SDF.show()

输出:

[Message] Builded Spark DataFrame:
+-----+--------------------+
|label|            sentence|
+-----+--------------------+
|    0|I heard about Spa...|
|    0|I wish Java could...|
|    1|Logistic regressi...|
+-----+--------------------+

特征提取 Step 1 - 使用 Tokenizer 创建分词器对象

# 特征提取 Step 1 - 创建分词器对象。
MyTokenizer = Tokenizer().setInputCol("sentence").setOutputCol("Words")
Data_for_Words = MyTokenizer.transform(SDF)# 输出 Tokenizer 的转换效果。
print("[Message] The Effect of Tokenizer:")
Data_for_Words.select(["label", "sentence", "Words"]).show()

输出:

[Message] The Effect of Tokenizer:
+-----+--------------------+--------------------+
|label|            sentence|               Words|
+-----+--------------------+--------------------+
|    0|I heard about Spa...|[i, heard, about,...|
|    0|I wish Java could...|[i, wish, java, c...|
|    1|Logistic regressi...|[logistic, regres...|
+-----+--------------------+--------------------+

特征提取 Step 2 - 使用 HashingTF 创建词频映射

HashingTF().tranform() 函数把词哈希成特征向量, 返回结果是 Vectors.sparse() 类型的。

这里设置哈希表的桶数 setNumFeatures 为1000 (注意: 该值设置太小会造成哈希冲突)。

# 特征提取 Step 2 - 使用 HashingTF 创建词频映射, 计算某个词在文件中出现的频率。
MyHashingTF = HashingTF().setInputCol("Words").setOutputCol("Features(Raw)").setNumFeatures(1000) # -> 返回一个 Transformers。
Featurized_for_Words = MyHashingTF.transform(Data_for_Words)# 输出 HashingTF 的转换效果。
print("[Message] The Effect of HashingTF:")
Featurized_for_Words.select(["label", "Words", "Features(Raw)"]).show()

输出:

[Message] The Effect of HashingTF:
+-----+--------------------+--------------------+
|label|               Words|       Features(Raw)|
+-----+--------------------+--------------------+
|    0|[i, heard, about,...|(1000,[240,286,67...|
|    0|[i, wish, java, c...|(1000,[80,133,307...|
|    1|[logistic, regres...|(1000,[59,286,604...|
+-----+--------------------+--------------------+

特征提取 Step 3 - 创建 IDF 类并计算 IDF 度量值

IDF 类: 计算给定文档集合的反文档频率, 是一个词普遍重要性的度量 (即: 一个词存在多少个文档中)。

某一特定词语的 IDF, 可以由总文件数目除以包含该词语之文件的数目, 再将得到的商取对数得到。

# 特征提取 Step 3 - 创建 IDF 类。
MyIDF = IDF().setInputCol("Features(Raw)").setOutputCol("Features(IDF)") # -> 返回一个 Estimator。IDFModel_for_Words = MyIDF.fit(Featurized_for_Words)# 计算每一个单词对应的 IDF 度量值。
Rescaled_for_Words = IDFModel_for_Words.transform(Featurized_for_Words)# 输出 IDF 的计算结果的 DataFrame。
print("[Message] The Calculation Result DataFrame of IDF:")
Rescaled_for_Words.select(["label", "Words", "Features(Raw)", "Features(IDF)"]).show()# 输出 IDF 的计算结果的 RDD。
print("[Message] The Calculation Result RDD of IDF:")
pprint.pprint(Rescaled_for_Words.rdd.take(3))

输出:

[Message] The Calculation Result DataFrame of IDF:
+-----+--------------------+--------------------+--------------------+
|label|               Words|       Features(Raw)|       Features(IDF)|
+-----+--------------------+--------------------+--------------------+
|    0|[i, heard, about,...|(1000,[240,286,67...|(1000,[240,286,67...|
|    0|[i, wish, java, c...|(1000,[80,133,307...|(1000,[80,133,307...|
|    1|[logistic, regres...|(1000,[59,286,604...|(1000,[59,286,604...|
+-----+--------------------+--------------------+--------------------+
[Message] The Calculation Result RDD of IDF:
[Row(label=0, sentence='I heard about Spark and I love Spark', Words=['i', 'heard', 'about', 'spark', 'and', 'i', 'love', 'spark'], Features(Raw)=SparseVector(1000, {240: 1.0, 286: 2.0, 673: 1.0, 756: 2.0, 891: 1.0, 956: 1.0}), Features(IDF)=SparseVector(1000, {240: 0.6931, 286: 0.5754, 673: 0.6931, 756: 0.5754, 891: 0.6931, 956: 0.6931})),Row(label=0, sentence='I wish Java could use case classes', Words=['i', 'wish', 'java', 'could', 'use', 'case', 'classes'], Features(Raw)=SparseVector(1000, {80: 1.0, 133: 1.0, 307: 1.0, 342: 1.0, 495: 1.0, 756: 1.0, 967: 1.0}), Features(IDF)=SparseVector(1000, {80: 0.6931, 133: 0.6931, 307: 0.6931, 342: 0.6931, 495: 0.6931, 756: 0.2877, 967: 0.6931})),Row(label=1, sentence='Logistic regression models are neat', Words=['logistic', 'regression', 'models', 'are', 'neat'], Features(Raw)=SparseVector(1000, {59: 1.0, 286: 1.0, 604: 1.0, 763: 1.0, 871: 1.0}), Features(IDF)=SparseVector(1000, {59: 0.6931, 286: 0.2877, 604: 0.6931, 763: 0.6931, 871: 0.6931}))]

结果解读

输出对象为 SparseVector, 这种 Vector 在保存数据的时候保存三个信息: 向量长度, 向量非零值的索引以及索引处的值。

输出的结果中, 240, 286 分别代表 “i”, “heard” 的哈希值。

0.6931, 0.5754 是 “i”, “heard” 对应的 IDF 值, 出现的次数越多, 值越小。

完整代码

#!/usr/bin/python3
# Create By GF 2023-12-29# 本例中 Tokenizer 是用于分词的模块。
# 本例中 HashingTF().tranform() 函数把词哈希成特征向量, 返回结果是 Vectors.sparse() 类型的。
# 本例中 IDF 类用于计算给定文档集合的反文档频率, 是一个词普遍重要性的度量 (即: 一个词存在多少个文档中)。import pprint
# --------------------------------------------------
from pyspark.sql import SparkSession
from pyspark.ml.feature import HashingTF, IDF, Tokenizer# Spark 2.0 以上版本的 spark-shell 在启动时会自动创建一个名为 spark 的 SparkSession 对象。
# 当需要手工创建时, SparkSession 可以由其伴生对象的 builder 方法创建出来。
spark = SparkSession.builder.master("local[*]").appName("spark").getOrCreate()# 创建一个简单的 DataFrame, 每一个句子代表一个文档。
Data_Set = [[0, "I heard about Spark and I love Spark"],[0, "I wish Java could use case classes"],[1, "Logistic regression models are neat"]]# 将数据集转化到指定列名的 DataFrame 数据框。
SDF = spark.createDataFrame(Data_Set).toDF("label", "sentence")print("[Message] Builded Spark DataFrame:")
SDF.show()# 特征提取 Step 1 - 创建分词器对象。
MyTokenizer = Tokenizer().setInputCol("sentence").setOutputCol("Words")
Data_for_Words = MyTokenizer.transform(SDF)# 输出 Tokenizer 的转换效果。
print("[Message] The Effect of Tokenizer:")
Data_for_Words.select(["label", "sentence", "Words"]).show()# 特征提取 Step 2 - 使用 HashingTF 创建词频映射, 计算某个词在文件中出现的频率。
MyHashingTF = HashingTF().setInputCol("Words").setOutputCol("Features(Raw)").setNumFeatures(1000) # -> 返回一个 Transformers。
Featurized_for_Words = MyHashingTF.transform(Data_for_Words)# 输出 HashingTF 的转换效果。
# - HashingTF().tranform() 函数把词哈希成特征向量, 返回结果是 Vectors.sparse() 类型的。
# - 这里设置哈希表的桶数 setNumFeatures 为1000 (注意: 该值设置太小会造成哈希冲突)。
print("[Message] The Effect of HashingTF:")
Featurized_for_Words.select(["label", "Words", "Features(Raw)"]).show()# 特征提取 Step 3 - 创建 IDF 类。
# - IDF 类: 计算给定文档集合的反文档频率, 是一个词普遍重要性的度量 (即: 一个词存在多少个文档中)。
# - 某一特定词语的 IDF, 可以由总文件数目除以包含该词语之文件的数目, 再将得到的商取对数得到。
MyIDF = IDF().setInputCol("Features(Raw)").setOutputCol("Features(IDF)") # -> 返回一个 Estimator。IDFModel_for_Words = MyIDF.fit(Featurized_for_Words)# 计算每一个单词对应的 IDF 度量值。
Rescaled_for_Words = IDFModel_for_Words.transform(Featurized_for_Words)# 输出 IDF 的计算结果的 DataFrame。
print("[Message] The Calculation Result DataFrame of IDF:")
Rescaled_for_Words.select(["label", "Words", "Features(Raw)", "Features(IDF)"]).show()# 输出 IDF 的计算结果的 RDD。
print("[Message] The Calculation Result RDD of IDF:")
pprint.pprint(Rescaled_for_Words.rdd.take(3))# 结果解读:
# - 输出对象为 SparseVector, 这种 Vector 在保存数据的时候保存三个信息: 向量长度, 向量非零值的索引以及索引处的值。
# - 输出的结果中, 240, 286 分别代表 "i", "heard" 的哈希值。
# - 0.6931, 0.5754 是 "i", "heard" 对应的 IDF 值, 出现的次数越多, 值越小。

总结

以上就是关于 机器学习 PySpark-3.0.3文本特征提取(TF-IDF)流程 的全部内容。

更多内容可以访问我的代码仓库:

https://gitee.com/goufeng928/public

https://github.com/goufeng928/public

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

Linux 内核的构建块:深入探索 C 结构体的应用

Linux 内核的构建块:深入探索 C 结构体的应用 Linux 内核,作为操作系统的中心和基础,承担着调度处理器、管理内存、处理输入/输出(I/O)等各种底层任务。要实现这些复杂的功能,内核的编写借助了 C 语言强大…

SAP FICO接口-OA-调取SAP供应商明细接口(应付预付明细)开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

需求说明: 根据OA查询条件查询ZVACDOCAZVACDOCA-BUKRS=查询公司代码; ZVACDOCA- LIFNR=查询供应商代码; ZVACDOCA-BELNR=查询凭证编号; ZVACDOCA-GJAHR=查询会计年度; ZVACDOCA-AWKEY=查询采购发票号*; ZVACDOCA-BLART≠W* ZVACDOCA-AUGBL=空 ZVACDOCA- XREVERSED…

ShrewSoft VPN无法连接.报错failed to attach to key daemon的解决方案

今天突然发现使用的ShrewSoft VPN 软件来连接公司网络。但是连接过程中,报错 “Fail to attach to key daemon” 解决步骤: 1. 重启电脑,可以解决90%问题。 2. 可能和ShrewSoft 相关的服务没有启动有关。 于是检查服务状态。 2.1 按Wind…

中国省级基础设施网络完善进程:2000-2022年数据分析与展望(无缺失值)

01、数据介绍 基础设施,作为为社会生产和居民生活提供公共服务的物质工程设施,是一个用于保证社会经济活动正常进行的公共服务系统。它不仅包括交通设施,还涵盖了邮电、供水供电、商业服务、科研与技术服务、园林绿化、环境保护、文化教育、…

富格林:明示虚假现象确保安全

富格林认为,当下的金融市场,投资者进行理财时都会特别关注盈利效率高的产品,而近来兴起的现货黄金则以此优势吸引着大批人关注。不过现货黄金市场相对于其他投资市场来说,会复杂一点不乏会蕴含着虚假现象。因此要确保我们的交易安…

Linux诊断机器故障工具—dmesg命令

在 Linux 系统中,经常会遇到各种各样的故障和问题,这些问题可能会导致系统性能下降、服务异常甚至系统崩溃。而 dmesg 命令是一个强大的工具,可以帮助我们诊断和解决这些故障。我们将介绍如何使用 dmesg 命令来分析和解决 Linux 系统中的常见…

基于单片机分舱式电开水炉位控制系统

**单片机设计介绍,基于单片机分舱式电开水炉位控制系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机分舱式电开水炉位控制系统概要主要涉及通过单片机对电开水炉的各个舱位进行精确控制,实现水位、温度…

Impala Daemon无法启动问题记录(25000端口被占用)

前言:集群主节点根目录内存快爆了,开始清理主节点内存重启组件,发现Kerberos认证的角色用户都过期了,又重新生成了一下角色,在启动impala组件过程中,其中一个Impala Daemon组件启动失败。 集群版本&#xf…

【热门话题】Stable Diffusion:本地部署教程

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 Stable Diffusion:本地部署教程一、引言二、环境准备1. 硬件配置2. …

在 Docker 部署的 MySQL 容器内安装和使用 vim

在 Docker 部署的 MySQL 容器内安装和使用 vim 文章目录 在 Docker 部署的 MySQL 容器内安装和使用 vim步骤一:进入 MySQL 容器步骤二:更新软件源和安装 vim步骤三:验证 vim 安装步骤四:使用 vim 进行文件编辑步骤五:保…

springboot项目框架讲解

文章目录 1.项目文件结构2.数据库连接信息3.其他配置信息4.java代码文件目录介绍5.entity层代码6.controller,service,dao,entity层之间的关系7.controller层代码8.登陆拦截功能实现9.文件上传功能 1.项目文件结构 2.数据库连接信息 3.其他配…

Linux中的网络命令深度解析与CentOS实践

Linux中的网络命令深度解析与CentOS实践 在Linux系统中,网络命令是管理和诊断网络问题的关键工具。无论是网络管理员还是系统开发者,熟练掌握这些命令都是必不可少的。本文将深入探讨Linux中常用的网络命令,并以CentOS为例,展示这些命令的具体应用。 一、ping命令 ping命…

大模型日报2024-04-06

大模型日报 2024-04-06 大模型资讯 Anthropic研究揭示大型语言模型存在安全漏洞 摘要: AI初创公司Anthropic的最新研究发现,大型语言模型(LLMs)存在漏洞,这些漏洞可能会使AI的安全训练措施失效。研究指出,尽管进行了安…

ETL中如何自定义规则

一、ETL中的规则 在使用规则之前我们先来了解一下什么是规则,ETL中规则在很多组件中都能看见,可以理解为按照事前约定好的逻辑去执行,规则可以使得数据更加的规范统一,同时也不需要去纵向的修改底层代码,只需要动态编…

【Frida】【Android】 工具篇:查壳工具大赏

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

LiveGBS流媒体平台GB/T28181常见问题-系统服务日志如何配置日志个数日志路径日志时长web操作日志操如何配置保留天数及过滤

LiveGBS系统服务日志如何配置日志个数日志路径日志时长web操作日志操如何配置保留天数及过滤 1、系统服务日志1.1、日志目录1.2、配置日志文件个数及记录时间1.3、配置日志文件路径 2、Web 操作日志2.1、配置保留天数2.2、配置不记录操作日志2.1.1、不记录所有2.1.2、不记录指定…

Golang中的上下文-context包的简介及使用

文章目录 简介context.Background()上下文取消函数上下文值传递建议Reference 简介 Go语言中的context包定义了一个名为Context的类型,它定义并传递截止日期、取消信号和其他请求范围的值,形成一个链式模型。如果我们查看官方文档,它是这样说…

java.lang.NoClassDefFoundError: javax/validation/constraints/Min

1、报错截图 2、解决办法 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>

基于SpringBoot Vue单位考勤管理系统

一、&#x1f4dd;功能介绍 基于SpringBoot Vue单位考勤管理系统 角色&#xff1a;管理员、员工 管理员&#xff1a;管理员进入系统主页面&#xff0c;主要功能包括对首页、个人中心、员工管理、部门信息管理、职位信息管理、加班申请管理、打卡信息管理、工作汇报管理、请假…