Apache spark MLLib: как создавать помеченные точки для строковых функций?

Я пытаюсь создать классификатор NaiveBayes с Spark MLLib, который принимает в качестве входных данных набор документов.

Я хотел бы поместить некоторые функции в качестве функций (то есть авторов, явных тегов, неявных ключевых слов, категории), но глядя на документацию кажется, что a LabeledPoint содержит только удвоения, т.е. выглядит как LabeledPoint[Double, List[Pair[Double,Double]].

Вместо того, что у меня есть как вывод из остальной части моего кода, будет что-то вроде LabeledPoint[Double, List[Pair[String,Double]].

Я мог бы составить свое собственное преобразование, но это кажется странным. Как я должен обращаться с этим методом MLLib?

Я считаю, что ответ находится в классе HashingTF (т.е. хеширующие функции), но я не понимаю, как это работает, кажется, что он требует определенного значения емкости, но мой список ключевых слов и тем эффективно неограничен (или лучше, неизвестно в начале).

Ответы

Ответ 1

HashingTF использует хеширование для сопоставления потенциально неограниченного количества функций с вектором ограниченного размера. Существует вероятность столкновений объектов, но это можно уменьшить, выбирая большее количество функций в конструкторе.

Чтобы создавать функции, основанные не только на содержании функции, но и на некоторых метаданных (например, с тегом "кошек", а не с словом "кошки" в документе), вы можете подать HashingTF класс вроде "tag: cats", так что тег со словом будет хешем в другом слоте, чем просто слово.

Если вы создали векторы счетчика функций с помощью HashingTF, вы можете использовать их для создания мешков с функциями слов, установив любые значения выше нуля на 1. Вы также можете создавать векторы TF-IDF, используя класс IDF

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

В вашем случае похоже, что вы уже вычислили количество слов на один документ. Это не будет работать с классом HashingTF, поскольку он предназначен для подсчета для вас.

В этой статье приводятся некоторые аргументы в отношении того, почему коллизии функций не так много проблем в языковых приложениях. Существенными причинами являются то, что большинство слов являются необычными (из-за свойств языков) и что столкновения не зависят от частот слов (из-за свойств хеширования), поэтому маловероятно, что слова, которые достаточно распространены для помощи с одной моделью, тот же слот.