6.Spark ML学习笔记—Spark ML文本—特征的提取、特征的转换(重点) 和 特征的选择
第6章 使用Spark ML进行文本分析
6.1 特征的提取
6.1.1 TF-IDF (词频-逆向文档频率)
TF-IDF
是一种在文本挖掘中广泛使用的特征向量化方法,以反映一个单词在语料库中的重要性。- 词频
TF(t, d)
表示某一个给定的单词t
在文档d
中出现的 频率。 - 逆文档频率
IDF(t, D)
表示包含单词t
的文档 逆频率。IDF = 总文档数量 / 包含 t 的文档数量
- 一旦有了
TF
和IDF
,就可以将它们相乘得到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
CountVectorizer
和 CountVectorizerModel
是将 文本文档集合 转换为 向量。当先验词典不可用时,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
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13