Есть ли у CountVectorizer такое же ограничение? Как он обрабатывает строку, отсутствующую в словаре?
Его не волнуют невидимые ценности.
зависит ли размер словаря от входных данных или он фиксирован в соответствии с параметром размера словаря?
Размер вектора не может превышать размер словаря и дополнительно ограничен количеством различных значений.
не следует закодировать невидимую категорию как строку нулей, чтобы рассматривать ее как "неизвестную", чтобы получить некоторые
Именно это и происходит. Однако проблема несколько сложнее. StringIndexer
обычно сочетается с OneHotEncoder
, который по умолчанию кодирует базовую категорию как вектор нулей, чтобы избежать ловушки фиктивной переменной. Поэтому использование того же подхода с индексацией было бы неоднозначным.
Чтобы проиллюстрировать все это, рассмотрим следующий пример:
import org.apache.spark.ml.feature.CountVectorizer
val train = Seq(Seq("foo"), Seq("bar")).toDF("text")
val test = Seq(Seq("foo"), Seq("foobar")).toDF("text")
//
val vectorizer = new CountVectorizer().setInputCol("text")
vectorizer.setVocabSize(1000).fit(train).vocabulary
// Array[String] = Array(foo, bar)
/* Vocabulary size is truncated to the value
provided by VocabSize Param */
vectorizer.setVocabSize(1).fit(train).vocabulary
// Array[String] = Array(bar)
/* Unseen values are ignored and if there are no known values
we get vector of zeros ((2,[],[])) */
vectorizer.setVocabSize(1000).fit(train).transform(test).show
// +--------+---------------------------+
// | text|cntVec_0a49b1315206__output|
// +--------+---------------------------+
// | [foo]| (2,[1],[1.0])|
// |[foobar]| (2,[],[])|
// +--------+---------------------------+
person
zero323
schedule
17.09.2016