我正在尝试使用Spark的MLLib构建一个NaiveBayes分类器,它将一组文档作为输入。
我想把一些东西作为功能(即作者,显式标签,隐式关键词,类别),但是看the documentation似乎LabeledPoint
只包含双打,即它看起来像LabeledPoint[Double, List[Pair[Double,Double]]
。
相反,我从其余代码输出的内容将类似于LabeledPoint[Double, List[Pair[String,Double]]
。
我可以编造自己的转换,但这看起来很奇怪。我怎么用MLLib处理这个?
我相信答案是在HashingTF
课程(即散列功能),但我不明白它是如何工作的,它似乎需要某种容量值,但我的关键字列表和主题实际上是无限的(或者更好,一开始就是未知的)。
答案 0 :(得分:10)
HashingTF
使用hashing trick将可能无限数量的要素映射到有界大小的向量。可能存在特征冲突,但通过在构造函数中选择大量特征可以使其更小。
为了不仅基于特征的内容而且基于某些元数据创建特征(例如,具有'猫'的标签而不是在文档中具有'猫'字样),您可以提供{{1类似'tag:cats'之类的东西,这样带有单词的标签会散列到不同于单词的不同位置。
如果您使用HashingTF
创建了要素计数向量,则可以使用它们通过将任何高于0的计数设置为1来创建单词包功能。您还可以使用{{1}创建TF-IDF向量像这样的类:
HashingTF
在您的情况下,您似乎已经计算了每个文档的单词计数。这不适用于IDF
类,因为它旨在为您进行计数。
This paper有一些争论,说明为什么特征冲突在语言应用程序中不是那么多问题。主要原因是大多数单词不常见(由于语言的属性),并且冲突与单词频率无关(由于散列属性),因此,对于一个人的模型来说,通用的单词很可能都会散列到相同的插槽。