apache spark MLLib:如何为字符串功能构建标记点?

我正在尝试使用Spark的MLLib构建一个NaiveBayes分类器,该分类器将一组文档作为输入。

我想把一些东西作为功能(即作者,显式标签,隐式关键字,类别),但是从文档中看,似乎a只包含替身,即它看起来像.LabeledPointLabeledPoint[Double, List[Pair[Double,Double]]

相反,我从其余代码中输出的内容类似于 .LabeledPoint[Double, List[Pair[String,Double]]

我可以自己做出转换,但这似乎很奇怪。我应该如何使用MLLib来处理这个问题?

我相信答案是在课堂上(即散列功能),但我不明白它是如何工作的,它似乎需要某种容量值,但我的关键字和主题列表实际上是无限的(或者更好,在开始时是未知的)。HashingTF


答案 1

HashingTF使用哈希技巧将潜在无限数量的要素映射到有界大小的向量。存在特征冲突的可能性,但可以通过在构造函数中选择更多数量的特征来减小这种冲突。

为了创建功能,不仅要基于功能的内容,还要基于一些元数据(例如,在文档中具有“cats”标签,而不是在文档中使用单词“cats”),您可以为类提供类似“tag:cats”的内容,以便带有单词的标签将哈希到不同的插槽,而不仅仅是单词。HashingTF

如果您已使用 创建了要素计数向量,则可以通过将大于 0 的任何计数设置为 1 来使用它们来创建词袋要素。您还可以使用如下类创建 TF-IDF 向量:HashingTFIDF

val tfIdf = new IDF().fit(featureCounts).transform(featureCounts)

在您的情况下,看起来您已经计算了每个文档的字数。这不适用于该类,因为它旨在为您进行计数。HashingTF

本文对为什么功能冲突在语言应用程序中不是那么大的问题有一些论点。基本原因是大多数单词不常见(由于语言的属性),并且冲突与单词频率无关(由于哈希属性),因此足够常见的单词不太可能同时哈希到同一个插槽。


答案 2

推荐