• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

6.Spark ML学习笔记—Spark ML文本—特征的提取、特征的转换(重点) 和 特征的选择

武飞扬头像
页川叶川
帮助1

第6章 使用Spark ML进行文本分析

6.1 特征的提取

6.1.1 TF-IDF (词频-逆向文档频率)

  • TF-IDF 是一种在文本挖掘中广泛使用的特征向量化方法,以反映一个单词在语料库中的重要性。
  • 词频 TF(t, d) 表示某一个给定的单词 t 在文档 d 中出现的 频率
  • 逆文档频率 IDF(t, D) 表示包含单词 t 的文档 逆频率
    IDF = 总文档数量 / 包含 t 的文档数量
  • 一旦有了 TFIDF,就可以将它们相乘得到 TF-IDF 值: TF-IDF = TF * IDF
6.1.1.1 HashingTF

HashingTF 也是一个转换器 (包含 transform() 方法),它接收一组单词,并通过使用 哈希函数,对每个项进行哈希操作,将其转换为固定长度的 向量,进而生成每个项的 索引。然后使用哈希表的索引来生成项的频率,也就是 词频

// 使用 HashingTF, 需导入如下的包
import org.apache.soark.ml.feature.HashingTF

val hashingTF = new HashingTF()
	.setInputCol("filtereWords")
	.setOutputCol("rawFeatures")
	.setNumFeatures(100)
	
// 基于输入数据集调用 transform() 函数来生成输出数据集
val rawFeaturesDF = hashingTF.transform(noStopWordsDF)

rawFeaturesDF.show(false)
6.1.1.2 逆文档频率(IDF)

IDF 是一个评估转换器(包含 fit() 方法), 它会拟合数据集, 并通过缩放输入特征来生成输出特征。因此, IDF 适用于处理 HashingDF 转换器的输出。

// 使用 IDF, 需导入如下的包
import org.apache.spark.ml.feature.IDF

val idf = new IDF()
  .setInputCol("rawFeatures")
  .setOutputCol("features")

// 基于输入数据集来调用 fit() 函数并生成输出
val idfModel = idf.fit(rawFeaturesDF)

// 基于输入数据集调用 transform() 函数来生成输出数据集
val featuresDF = idfModel.transform(rawFeaturesDF)

featuresDF.select("id", "features").show(5, false)

featuresDF.show(false)
学新通

6.1.2 Word2Vec

Word2Vec 是一个 Estimator(评估器),它采用表示文档的 单词序列,并训练一个Word2VecModel。该模型将每个单词映射到一个唯一的固定大小 向量Word2VecModel 使用文档中所有单词的 平均值 将每个文档转换为向量; 该向量然后可用作 预测文档相似性计算等功能。

让我们分析一个通过查看有关动物的句子集合来使用它的示例:

  • 一只狗在吠叫
  • 有些奶牛在吃草
  • 狗经常随机吠叫
  • 奶牛喜欢草

使用具有隐藏层的神经网络(在许多无监督学习应用中使用的机器学习算法),可以学习到 狗 和 吠叫 是有关系的,同时 牛 和 草 也是相关的,因为这些看起来彼此十分接近,当然,这是通过 概率 来衡量的。Word2Vec 的输出是 Double 类型特征的 向量

import org.apache.spark.ml.feature.Word2Vec

val word2Vec = new Word2Vec()
  .setInputCol("words")
  .setOutputCol("wordvector")
  .setVectorSize(3)
  .setMinCount(0)

// 基于输入数据集来调用 fit() 函数并生成输出
val word2VecModel = word2Vec.fit(noStopWordsDF)

// 基于输入数据集调用 transform() 函数来生成输出数据集
val word2VecDF = word2VecModel.transform(noStopWordsDF)

word2VecDF.show(false)

6.1.3 CountVectorizer

CountVectorizerCountVectorizerModel 是将 文本文档集合 转换为 向量。当先验词典不可用时,CountVectorizer 可以用作 评估器 来提取词汇表,并生成 CountVectorizerModel。该模型通过词汇生成文档的 稀疏表示,然后可以将其传递给其他算法,如 LDA

import org.apache.spark.ml.feature.CountVectorizer

val countVectorizer = new CountVectorizer()
  .setInputCol("filteredWords")
  .setOutputCol("features")

// 基于输入数据集来调用 fit() 函数并生成输出
val countVectorizerModel = countVectorizer.fit(noStopWordsDF)

// 基于输入数据集调用 transform() 函数来生成输出数据集
val countVectorizerDF = countVectorizerModel.transform(noStopWordsDF)

countVectorizerDF.show(false)

6.2 特征的转换 (重要)

6.2.1 Tokenizer (分词器)

分词器(Tokenizer) 将输入字符串转换为小写,然后将带有空格的 字符串 拆分为 单词。可以使用默认的空格分隔符,或者基于客户的正则表达式将给定语句拆分为单词。无论哪种情况,输入列都会被转换为输出列。输入列通常为 字符串,输出列则是 单词的序列

  • Tokenization 是将 文本 (如一个句子) 拆分成 单词 的过程。(在Spark ML中) Tokenizer (分词器)提供此功能。
  • RegexTokenizer 提供了 (更高级的) 基于 正则表达式(regex) 匹配的 (对句子或文本的) 单词拆分。默认情况下, 参数 “pattern”(默认的正则表达式: “\\s ”) 作为 分隔符 用于拆分输入的文本。或者,用户可以将参数 “gaps” 设置为 false ,指定正则表达式 “pattern” 表示 “tokens”,而不是分隔符,这样作为划分结果找到的所有匹配项。
import org.apache.spark.ml.feature.RegexTokenizer
import org.apache.spark.ml.feature.Tokenizer

val tokenizer = new Tokenizer()
  .setInputCol("sentence")
  .setOutputCol("words")

// 基于输入数据集调用 transform() 函数来生成输出数据集
val wordsDF = tokenizer.transform(sentenceDF)

wordsDF.show(false)

----------------------------------------------------------------------------------------------------
// 如果你想基于 Tokenizer 来创建一个正则表达式, 需要使用 RegexTokenizer 来代替 Tokenizer 
val regexTokenizer = new RegexTokenizer()
  .setInputCol("sentence")
  .setOutputCol("regexWords")
  .setPattern("\\W")

// 基于输入数据集调用 transform() 函数来生成输出数据集
val regexWordsDF = regexTokenizer.transform(sentenceDF)

regexWordsDF.show(false)
学新通

6.2.2 StopWordsRemover

Stop words(停用词) 是在文档中频繁出现,但未携带太多意义的词语,它们不应该参与算法运算。

StopWordsRemover 也是一个转换器, 它可以接收一个 字符串数组 的单词, 然后在删除所有停用词之后返回一个字符串数组。停用词 (如我、你) 在英语中相当常用。可以对停用词集进行覆盖或扩充,以满足自己的需求。如果没有这个清理过程,后续算法可能因为 常用词 而出现偏差。

import org.apache.spark.ml.feature.StopWordsRemover

val remover = new StopWordsRemover()
  .setInputCol("words")
  .setOutputCol("filteredWords")

// 基于输入数据集调用 transform() 函数来生成输出数据集
val noStopWordsDF = remover.transform(wordsDF)

noStopWordsDF.show(false)

noStopWordsDF.select("sentence", "filteredWords").show(5, false)

-----------------------------------------------------------------------------------------------
// 从过滤后的单词中删除 hello, 并将 hello 作为停用词
val noHello = Array("hello")    remover.getStopWords

val removerCustom = new StopWordsRemover()
  .setInputCol("words")
  .setOutputCol("filteredWords")
  .setStopWords(noHello)

// 基于输入数据集调用 transform() 函数来生成输出数据集
val noStopWordsDFCustom = removerCustom.transform(wordsDF)

noStopWordsDFCustom.select("sentence", "filteredWords").show(5, false)
学新通

6.2.3 NGram (N元模型)

  • 一个 NGram 是一个长度为 n (整数) 的字的序列。NGram 可用于将输入特征转换成 NGrams
  • NGram 的输入为一系列的字符串(例如:Tokenizer分词器的输出)。参数 n 表示每个 NGram单词 (terms) 的数量。输出将由 NGram 序列组成,其中每个 NGram 由空格分隔的 n 个连续词的字符串表示。如果输入的字符串序列少于 n 个单词,NGram 输出为空。
import org.apache.spark.ml.feature.NGram

val ngram = new NGram()
  .setN(2)
  .setInputCol("filteredWords")
  .setOutputCol("ngrams")

// 基于输入数据集调用 transform() 函数来生成输出数据集
val nGramDF = ngram.transform(noStopWordsDF)

nGramDF.show(false)

nGramDF.select("sentence", "ngrams").show(5, false)

6.2.4 Binarizer (二值化)

  • Binarization (二值化) 是将 数值特征 阈值化为 二进制 (0/1) 特征的过程。
  • Binarizer (ML提供的二元化方法) 二元化涉及的参数有 inputCol (输入)、outputCol (输出) 以及threshold(阀值)。(输入的) 特征值大于 阀值 将二值化为1.0,特征值小于等于阀值将二值化为0.0。inputCol支持 向量(Vector) 和 双精度 (Double) 类型。

6.2.5 PCA (主元分析)

PCA 是使用 正交变换 将可能相关变量的一组 观察值 转换为称为 主成分 的线性不相关变量的值的一组 统计过程。PCA 类训练使用PCA将向量投影到低维空间的模型。(用于降低数据维度)

6.2.6 IndexToString (索引-字符串变换)

StringIndexer 对应,IndexToString索引化标签 还原成原始 字符串。一个常用的场景是先通过 StringIndexer 产生索引化标签,然后使用索引化标签进行训练,最后再对预测结果使用IndexToString来获取其原始的标签字符串。

6.2.7 OneHotEncoder (独热编码)

独热编码 (One-hot encoding) 将一列标签索引映射到一列 二进制向量,最多只有 一个单值。该编码允许期望连续特征 (例如逻辑回归) 的算法使用分类特征。

6.2.8 其他转换器

  • (8) VectorIndexer (向量类型索引化)
  • (9) Interaction (相互作用)
  • (10) Normalizer (范数p-norm规范化)
  • (11) StandardScaler (标准化)
  • (12) MinMaxScaler (最大-最小规范化)
  • (13) MaxAbsScaler (绝对值规范化)
  • (14) VectorAssembler (特征向量合并)

6.3 特征的选择

6.3.1 VectorSlicer (向量切片机)

学新通

6.3.2 RFormula (R模型公式)

RFormula 选择由 R模型公式 (R model formula)指定的列。目前,我们支持 R运算符 的有限子集,包括’~’, ‘.’, ‘:’,’ ‘以及’-’,基本操作如下:

  • ~: 分隔目标和对象
  • : 合并对象," 0" 表示删除截距
  • -: 删除对象,"-1" 表示删除截距
  • :: 交互 (数字乘法 或 二值化分类值)
  • .: 除了目标外的全部列

6.3.3 ChiSqSelector (卡方特征选择器)

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgacjbj
系列文章
更多 icon
同类精品
更多 icon
继续加载