Я пишу искровой код Scala с использованием библиотеки CountVectorizerModel и MinHashLSH для поиска сходства Жаккарда в двух наборах строк в datafarme. Перед тем, как передать его в MinHashLSH, он должен быть преобразован в векторы. Для этого я использую CountVectorizerModel.
Проблема в том, что я произвольно устанавливаю такие значения, как setVocabSize () и setMinDF (), как показано ниже в коде. Я получаю сообщение об ошибке vocabulary size should be > 0. Lower minDF as necessary spark error.
Фрагмент кадра данных dfB выглядит, как показано ниже, и его размер изменяется в зависимости от ввода.
+------------+-----------------+
| id1| values1|
+------------+-----------------+
| USA| [Stat]|
| Germany|[Country]|
| Clever_Hans| [Horse]|
| China|[Country]|
| Japan|[Country]|
| Halidae| [Family]|
|Real_Delight| [Horse]|
|Bago_(horse)| [Horse]|
val dfB = hashtoseq1.toDF("id1", "values1")
val cvModel1: CountVectorizerModel = new CountVectorizer()
.setInputCol("values1")
.setOutputCol("features1")
.setVocabSize(100000)
.setMinDF(1)
.fit(dfB)
val kt1 = cvModel1.transform(dfB)
// kt.show
val mh1 = new MinHashLSH()
.setNumHashTables(5)
.setInputCol("features1")
.setOutputCol("hashes1")
val model1 = mh1.fit(kt1)
val dffilter1 = model1.approxSimilarityJoin(kt1, kt1, 0.4)
Приведенный выше код строки работает с размером файла менее 4 ГБ. Для файла размером 17 ГБ выдает ошибку. Я просмотрел документ Spark и переходил по ссылкам, но мне это не помогло.





В вашем корпусе менее 100000 терминов. Обычно ваш документ содержит - в зависимости от размера ваших документов - миллионы терминов. Затем алгоритм ограничивает это пространство вашим vocabSize, удаляя очень уникальные значения.
Чтобы это сработало, вам нужно уменьшить ваш vocabSize <= total number terms in your corpus = 4.