Как мне получить темы каждого документа в Spark LDA? - PullRequest
0 голосов
/ 16 марта 2020

Моя цель

У меня есть новостной корпус, и я хочу использовать LDA для извлечения ключевых слов для каждого новостного документа , ключевые слова также могут называться метками, что означает, что это новости все о.

Вместо использования tf-idf, я искал Inte rnet и думаю, что LDA может сделать эту работу лучше.

Давайте определим некоторые терминологии заранее:

  • "term" = "word": элемент словаря
  • "token": экземпляр термина, встречающегося в документе
  • "topi c": мультиномиальное распределение по терминам, представляющим некоторое понятие
  • «документ»: один фрагмент текста, соответствующий одной строке во входных данных

Что я думаю о САПРК LDA

Обратитесь к Spark Do c: https://spark.apache.org/docs/latest/mllib-clustering.html#latent -dirichlet-allocation-lda , и я обнаружил, что EMLDAOptimizer создает DistributedLDAModel, в котором хранятся не только предполагаемые темы, но и полный учебный корпус и topi c раздачи для каждого документа в обучении корпус.

Модель DistributedLDAM поддерживает:

  • topTopicsPerDocument: основные темы и их вес для каждого документа в корпусе обучения
  • topDocumentsPerTopi c: основные документы для каждого topi c и соответствующего веса topi c в документах.

, в то время как OnlineLDAOptimizer создает LocalLDAModel, в котором хранятся только предполагаемые темы .

(от mllib)

Тогда давайте посмотрим, что я сделал

У меня есть несколько корпусов новостей, и они представляют собой чистый текст, и размер больше или меньше на 1,2 ГБ. После токенизации, удаления стоп-слов и всех процедур очистки данных (предварительная обработка). Я использую CountVectorize с VocabSize, установленным на 200000 и LDA с K, установленным на 15, maxiter на 100, optimizer на «em», CheckpointInterval на 10, другие параметры, не упомянутые по умолчанию, являются значениями по умолчанию ценности. Эти 2 Transformer s помещаются в конвейер для обучения.

(из мл)

    val countVectorizer = new CountVectorizer()
      .setInputCol("content_clean_cut")
      .setOutputCol("count_vector")
      .setVocabSize(200000)
    val lda = new LDA()
      .setK(15)
      .setMaxIter(100)
      .setFeaturesCol("count_vector")
      .setOptimizer("em")
      .setCheckpointInterval(10)
    val pipeline = new Pipeline()
      .setStages(Array(countVectorizer, lda))
    val ldaModel = pipeline.fit(newsDF)
    ldaModel.write.overwrite().save("./news_lda.model")

Отправка задания на искробезопасность с памятью около 300 ГБ, наконец оно прошло успешно.

Затем я начал использовать эту модель конвейера Для преобразования предварительно обработанного новостного корпуса схема show():

+------------------------------+----+--------------------+--------------------+
|             content_clean_cut| cls|        count_vector|   topicDistribution|
+------------------------------+----+--------------------+--------------------+
|  [深锐, 观察, 科比, 只想, ...|体育|(200000,[4,6,9,11...|[0.02062984049807...|
| [首届, 银联, 网络, 围棋赛,...|体育|(200000,[2,4,7,9,...|[0.02003532045153...|
|[董希源, 国米, 必除, 害群之...|体育|(200000,[2,4,9,11...|[0.00729266918401...|
| [李晓霞, 破茧, 成蝶, 只差,...|体育|(200000,[2,4,7,13...|[0.01200369382233...|
|  [深锐, 观察, 对手, 永远, ...|体育|(200000,[4,9,13,1...|[0.00613485655279...|

:

root
 |-- content_clean_cut: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- cls: string (nullable = true)
 |-- count_vector: vector (nullable = true)
 |-- topicDistribution: vector (nullable = true)

Я не понимаю, что означает этот столбец topicDistribution, почему его длина равна K, это означает, что индекс наибольшего числа является индексом topi c этого документа (новостей), поэтому мы можем вывести topi c этого документа, найдя индекс наибольшего число, а индекс фактически является индексом возвращенного метода topi c в describeTopics()?

Приведите вторую стадию в конвейере к DistributedLDAModel, но не удалось найти ничего, связанного с topTopicsPerDocument и topDocumentsPerTopic. Почему это отличается от официальных документов?

И есть метод topicsMatrix в случае DistributedLDAModel, какого черта это? Я провел некоторое исследование, думаю, что topicsMatrix - это каждый topi c раз каждый вокаб в countVectorizerModel.vocabulary, я не думаю, что topicsMatrix поможет. Кроме того, некоторые числа в этой матрице в два раза больше 1, и это меня смущает. Но это не важно.

Что важнее, это , как использовать LDA для извлечения различных ключевых слов для каждого документа (новости) ?

Извлечение ключевого слова поручено автоматическое c определение терминов, которые наилучшим образом описывают предмет документа.

...