Ответ 1
HashingTF
использует хеширование для сопоставления потенциально неограниченного количества функций с вектором ограниченного размера. Существует вероятность столкновений объектов, но это можно уменьшить, выбирая большее количество функций в конструкторе.
Чтобы создавать функции, основанные не только на содержании функции, но и на некоторых метаданных (например, с тегом "кошек", а не с словом "кошки" в документе), вы можете подать HashingTF
класс вроде "tag: cats", так что тег со словом будет хешем в другом слоте, чем просто слово.
Если вы создали векторы счетчика функций с помощью HashingTF
, вы можете использовать их для создания мешков с функциями слов, установив любые значения выше нуля на 1. Вы также можете создавать векторы TF-IDF, используя класс IDF
val tfIdf = new IDF().fit(featureCounts).transform(featureCounts)
В вашем случае похоже, что вы уже вычислили количество слов на один документ. Это не будет работать с классом HashingTF
, поскольку он предназначен для подсчета для вас.
В этой статье приводятся некоторые аргументы в отношении того, почему коллизии функций не так много проблем в языковых приложениях. Существенными причинами являются то, что большинство слов являются необычными (из-за свойств языков) и что столкновения не зависят от частот слов (из-за свойств хеширования), поэтому маловероятно, что слова, которые достаточно распространены для помощи с одной моделью, тот же слот.