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

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

我想把一些东西作为特征(即作者,显式标签,隐式关键字,类别),但看文档似乎LabeledPoint只包含双打,即看起来像LabeledPoint[Double, List[Pair[Double,Double]]

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

我可以编造自己的转换,但看起来很奇怪。 我怎么用MLLib来处理这个问题?

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

HashingTF使用散列技巧将可能无限数量的HashingTF映射到有界大小的向量。 存在特征冲突的可能性,但是通过在构造函数中选择大量特征可以使其更小。

为了不仅基于特征的内容而且基于某些元数据创建特征(例如,具有’猫’的标签而不是在文档中具有’猫’字样),您可以为HashingTF类提供类似’标签的内容:cats’所以带有单词的标签将散列到不同于单词的不同插槽。

如果您使用HashingTF创建了要素计数向量, HashingTF可以通过将任何高于0的计数设置为1来使用它们来创建单词特征包。您还可以使用IDF类创建TF-IDF向量,如下所示:

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

在您的情况下,您似乎已经计算了每个文档的单词计数。 这不适用于HashingTF类,因为它旨在为您进行计数。

本文有一些争论,说明为什么特征冲突在语言应用程序中不是那么多问题。 基本原因是大多数单词并不常见(由于语言的属性),并且冲突与单词频率无关(由于散列属性),因此,对于一个人的模型来说,通用的单词不太可能会散列到相同的插槽。