В чем разница между HashingTF и CountVectorizer в Spark?

попытка сделать классификацию doc в Spark. Я не уверен, что делает хэширование в HashingTF; жертвует ли оно какой-либо точностью? Сомневаюсь, но не знаю. Spark doc говорит, что использует "трюк хэширования"... просто еще один пример действительно плохого / запутанного именования, используемого инженерами (я тоже виноват). CountVectorizer также требует установки размера словаря, но у него есть другой параметр, пороговый параметр, который можно использовать для исключения слов или токенов, которые появляются ниже некоторого порога в корпус текста. Я не понимаю разницы между этими двумя трансформаторами. Что делает это важным, так это последующие шаги в алгоритме. Например, если бы я хотел выполнить SVD на результирующей матрице tfidf, то размер словаря определит размер матрицы для SVD, который влияет на время работы кода и производительность модели и т. д. У меня возникли трудности с поиском любого источника о Spark Mllib за пределами документации API и действительно тривиальных примеров без глубина.

3 ответов


несколько важных отличий:

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

согласно документации Spark 2.1.0,

для генерации частотных векторов термина можно использовать как HashingTF, так и CountVectorizer.

HashingTF

HashingTF-это трансформатор, который принимает наборы терминов и преобразует эти наборы в векторы объектов фиксированной длины. В процессе обработки текста, "набор терминов" может быть мешком слов. HashingTF использует трюк хэширования. Ля необработанный объект сопоставляется с индексом (термином) путем применения хэша функция. Здесь используется хэш-функция MurmurHash 3. Затем термин частоты рассчитываются на основе сопоставленных индексов. Этот подход избегает необходимости вычислять глобальную карту термина к индексу, которая может быть дорогой для большого корпуса, но он страдает от потенциального хэша коллизии, где различные необработанные объекты могут стать одним и тем же термином после хеширования.

уменьшить шанс столкновения, мы можем увеличить размер целевого объекта, т. е. количество ведер хэша таблица. Поскольку для преобразования хэш-функции используется простое по модулю индекс столбца, рекомендуется использовать мощность двух объектов размер, в противном случае объекты не будут равномерно сопоставлены с столбцы. Размер объекта по умолчанию-2^18=262,144. - необязательный параметр binary toggle управляет подсчетами частоты терминов. Когда значение true все ненулевые значения частоты равны 1. Это особенно полезно для дискретных вероятностных моделей, моделирующих двоичные, вместо integer, подсчитывает.

CountVectorizer

CountVectorizer и CountVectorizerModel стремятся помочь преобразовать коллекция текстовых документов векторам счетчиков токенов. Когда а-приори словарь не доступен, CountVectorizer может быть использован в качестве оценка для извлечения словарь, и создает CountVectorizerModel. Модель создает разреженные представления для документы над лексикой, которые затем могут быть переданы другим алгоритмы, такие как LDA.

в процессе подгонки, CountVectorizer выберут лучших vocabSize слова заказанных термин частоты через корпус. - опционный параметр minDF также влияет на приспосабливая процесс мимо указание минимального числа (или доли, если

пример кода

from pyspark.ml.feature import HashingTF, IDF, Tokenizer
from pyspark.ml.feature import CountVectorizer

sentenceData = spark.createDataFrame([
    (0.0, "Hi I heard about Spark"),
    (0.0, "I wish Java could use case classes"),
    (1.0, "Logistic regression models are neat")],
 ["label", "sentence"])

tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
wordsData = tokenizer.transform(sentenceData)

hashingTF = HashingTF(inputCol="words", outputCol="Features", numFeatures=100)
hashingTF_model = hashingTF.transform(wordsData)
print "Out of hashingTF function"
hashingTF_model.select('words',col('Features').alias('Features(vocab_size,[index],[tf])')).show(truncate=False)


# fit a CountVectorizerModel from the corpus.
cv = CountVectorizer(inputCol="words", outputCol="Features", vocabSize=20)

cv_model = cv.fit(wordsData)

cv_result = model.transform(wordsData)
print "Out of CountVectorizer function"
cv_result.select('words',col('Features').alias('Features(vocab_size,[index],[tf])')).show(truncate=False)
print "Vocabulary from CountVectorizerModel is \n" + str(cv_model.vocabulary)

выход, как показано ниже

enter image description here

хэширование TF пропускает словарь, который необходим для таких методов, как LDA. Для этого нужно использовать функцию CountVectorizer. Независимо от размера vocab, функция CountVectorizer оценивает частоту термина без какого-либо приближения, в отличие от HashingTF.

ссылки:

https://spark.apache.org/docs/latest/ml-features.html#tf-idf

https://spark.apache.org/docs/latest/ml-features.html#countvectorizer


трюк хэширования на самом деле является другим именем функции хэширования.

я цитирую определение Википедии :

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

вы можете прочитать больше об этом в этой статье.

так на самом деле на самом деле для векторизации пространства эффективных функций.

, тогда как CountVectorizer выполняет только извлечение словаря, и он преобразуется в векторы.