如何在 Spark 中正确地将数字特征与文本(词袋)结合起来?

Posted

技术标签:

【中文标题】如何在 Spark 中正确地将数字特征与文本(词袋)结合起来?【英文标题】:How do I properly combine numerical features with text (bag of words) in Spark? 【发布时间】:2018-06-16 13:56:10 【问题描述】:

我的问题与this 类似,但对于 Spark,原始问题没有令人满意的答案。

我正在使用带有推文数据作为输入的 Spark 2.2 LinearSVC 模型:推文的文本(已预处理)为 hash-tfidf,其月份如下:

val hashingTF = new HashingTF().setInputCol("text").setOutputCol("hash-tf")
  .setNumFeatures(30000) 
val idf = new IDF().setInputCol("hash-tf").setOutputCol("hash-tfidf")
  .setMinDocFreq(10)
val monthIndexer = new StringIndexer().setInputCol("month")
  .setOutputCol("month-idx")
val va = new VectorAssembler().setInputCols(Array("month-idx",  "hash-tfidf"))
  .setOutputCol("features")

如果有 30,000 个单词的功能,这些功能不会淹没这个月吗?或者VectorAssembler 足够聪明来处理这个问题。 (如果可能的话,我如何获得该模型的最佳功能?)

【问题讨论】:

【参考方案1】:

VectorAssembler 将简单地将所有数据组合到一个向量中,它对权重或其他任何事情都没有任何作用。

由于 30,000 个词向量非常稀疏,因此更密集的特征(月份)很可能会对结果产生更大的影响,因此这些特征可能不会像您所说的那样被“淹没”。您可以训练模型并检查特征的权重以确认这一点。只需使用LinearSVCModel 提供的coefficients 方法即可查看这些特征对最终总和的影响程度:

val model = new LinearSVC().fit(trainingData)
val coeffs = model.coefficients

系数越高的特征对最终结果的影响越大。

如果赋予月份的权重太低/太高,可以使用setWeightCol() 方法为这些月份设置权重。

【讨论】:

谢谢!您能否简要解释一下如何“检查特征的权重以确认这一点”。只需使用提供的 LinearSVCModel 系数方法。' @schoon:添加了更多解释

以上是关于如何在 Spark 中正确地将数字特征与文本(词袋)结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中带有词袋和附加情感特征的文本分类器

文本分类学习 特征权重(TF/IDF)和特征提取

如何在分类中包含单词作为数字特征

文本特征提取函数: 词袋法与TF-IDF(代码理解)

用于分类的词袋 - 特征与像素

机器学习---文本特征提取之词袋模型(Machine Learning Text Feature Extraction Bag of Words)