ли 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,[],[])|
// +--------+---------------------------+
Спасибо @ zero323, вы всегда ответить на мои вопросы :-) Один комментарий: словарь не фиксированного размера в соответствии с 'параметра vocabSize', это 'min (различные (значения), vocabSize)'. –