Spark机器学习实战 (十一) - 文本情感分类项目实战

简介: Spark机器学习实战 (十一) - 文本情感分类项目实战

0 相关源码

将结合前述知识进行综合实战,以达到所学即所用。文本情感分类这个项目会将分类算法、文本特征提取算法等进行关联,使大家能够对Spark的具体应用有一个整体的感知与了解。

1 项目总体概况

2 数据集概述

3 数据预处理

4 文本特征提取

官方文档介绍


提取,转换和选择特征

本节介绍了使用特征的算法,大致分为以下几组:

提取:从“原始”数据中提取特征

转换:缩放,转换或修改特征

选择:从中选择一个子集一组更大的特征局部敏感散列(LSH):这类算法将特征变换的各个方面与其他算法相结合。

(TF-IDF) 是在文本挖掘中广泛使用的特征向量化方法,以反映术语对语料库中的文档的重要性。

用t表示一个术语,用d表示文档,用D表示语料库。术语频率TF(t,d)是术语t出现在文档d中的次数,而文档频率DF(t,D)是包含术语的文档数T


如果我们仅使用术语频率来衡量重要性,那么过分强调经常出现但很少提供有关文档的信息的术语非常容易,例如: “a”,“the”和“of”。

如果术语在语料库中经常出现,则表示它不包含有关特定文档的特殊信息。


  • 反向文档频率是术语提供的信息量的数字度量:

其中| D |是语料库中的文档总数。由于使用了对数,如果一个术语出现在所有文档中,其IDF值将变为0.

请注意,应用平滑术语以避免语料库外的术语除以零。


  • TF-IDF测量仅仅是TF和IDF的乘积

术语频率和文档频率的定义有几种变体。在MLlib中,我们将TF和IDF分开以使它们变得灵活。


TF:HashingTF和CountVectorizer都可用于生成术语频率向量。

HashingTF是一个转换器,它接受一组术语并将这些集合转换为固定长度特征向量。

在文本处理中,“一组术语”可能是一些单词。HashingTF利用散列技巧。通过应用散列函数将原始特征映射到索引(术语)。这里使用的哈希函数是MurmurHash 3.然后,基于映射的索引计算术语频率。这种方法避免了计算全局术语到索引映射的需要,这对于大型语料库来说可能是昂贵的,但是它遭受潜在的哈希冲突,其中不同的原始特征可能在散列之后变成相同的术语。为了减少冲突的可能性,我们可以增加目标特征维度,即哈希表的桶的数量。由于散列值的简单模数用于确定向量索引,因此建议使用2的幂作为要素维度,否则要素将不会均匀映射到向量索引。默认要素尺寸为218 = 262,144218 = 262,144。可选的二进制切换参数控制术语频率计数。设置为true时,所有非零频率计数都设置为1.这对于模拟二进制而非整数计数的离散概率模型特别有用。


CountVectorizer将文本文档转换为术语计数向量


IDF:IDF是一个Estimator,它适合数据集并生成IDFModel。 IDFModel采用特征向量(通常从HashingTF或CountVectorizer创建)并缩放每个特征。直观地说,它降低了在语料库中频繁出现的特征。


注意:spark.ml不提供文本分割工具.


在下面的代码段中,我们从一组句子开始。我们使用Tokenizer将每个句子分成单词。对于每个句子(单词包),我们使用HashingTF将句子散列为特征向量。我们使用IDF重新缩放特征向量;这通常会在使用文本作为功能时提高性能。然后我们的特征向量可以传递给学习算法。


import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}
val sentenceData = spark.createDataFrame(Seq(
  (0.0, "Hi I heard about Spark"),
  (0.0, "I wish Java could use case classes"),
  (1.0, "Logistic regression models are neat")
)).toDF("label", "sentence")
val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val wordsData = tokenizer.transform(sentenceData)
val hashingTF = new HashingTF()
  .setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(20)
val featurizedData = hashingTF.transform(wordsData)
// alternatively, CountVectorizer can also be used to get term frequency vectors
val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(featurizedData)
val rescaledData = idfModel.transform(featurizedData)
rescaledData.select("label", "features").show()

5 训练分类模型

  • 代码

  • data.show(false)
  • println(neg.count(),data.count())//合并

  • result.show(false)
  • println(s""“accuracy is $accuracy”"")

6 Spark机器学习实践系列

基于Spark的机器学习实践 (一) - 初识机器学习

基于Spark的机器学习实践 (二) - 初识MLlib

基于Spark的机器学习实践 (三) - 实战环境搭建

基于Spark的机器学习实践 (四) - 数据可视化

基于Spark的机器学习实践 (六) - 基础统计模块

基于Spark的机器学习实践 (七) - 回归算法

基于Spark的机器学习实践 (八) - 分类算法

基于Spark的机器学习实践 (九) - 聚类算法

基于Spark的机器学习实践 (十) - 降维算法

基于Spark的机器学习实践(十一) - 文本情感分类项目实战


目录
相关文章
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
机器学习之线性回归与逻辑回归【完整房价预测和鸢尾花分类代码解释】
|
23天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【机器学习】揭秘!机器学习如何助力我们高效优化文本?
【机器学习】揭秘!机器学习如何助力我们高效优化文本?
29 3
|
1月前
|
机器学习/深度学习 数据可视化 算法
机器学习中的分类问题:如何选择和理解性能衡量标准
机器学习中的分类问题:如何选择和理解性能衡量标准
机器学习中的分类问题:如何选择和理解性能衡量标准
|
17天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【机器学习】揭秘!机器学习如何助力我们高效优化文本?
【机器学习】揭秘!机器学习如何助力我们高效优化文本?
28 0
|
15天前
|
机器学习/深度学习 自然语言处理 算法
|
8天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
30 7
|
18天前
|
机器学习/深度学习 数据采集 算法
机器学习实战第3天:手写数字识别
机器学习实战第3天:手写数字识别
23 0
|
1月前
|
SQL 分布式计算 Java
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
Spark学习---SparkSQL(概述、编程、数据的加载和保存、自定义UDFA、项目实战)
98 1
|
1月前
|
机器学习/深度学习 算法
机器学习的魔法(二)超越预测的界限-揭秘机器学习的黑科技-探索监督学习中的回归和分类问题
机器学习的魔法(二)超越预测的界限-揭秘机器学习的黑科技-探索监督学习中的回归和分类问题
132 0
|
1月前
|
存储 分布式计算 Spark
实战|使用Spark Streaming写入Hudi
实战|使用Spark Streaming写入Hudi
40 0