ドキュメントトピック生成モデル(LDA)アルゴリズムの原理とSpark MLlib呼び出しインスタンス(Scala/Java/python)


ドキュメントトピック生成モデル(LDA)
アルゴリズムの説明:
LDA(Latent Dirichlet Allocation)は、単語、トピック、ドキュメントの3層構造を含む3層ベイズ確率モデルとも呼ばれるドキュメントトピック生成モデルである.生成モデルとは,1つの文章の各語が「あるテーマを一定の確率で選択し,そのテーマからある単語を一定の確率で選択する」という過程で得られると考えられる.ドキュメントからトピックへは多項式分布、トピックから語へは多項式分布に従います.
LDAは、大規模なドキュメントセットまたはコーパスに潜むトピック情報を識別する非監視マシン学習技術である.各ドキュメントを1つの語周波数ベクトルと見なし,テキスト情報をモデリングしやすいデジタル情報に変換する語袋(bag of words)法を採用した.しかし,語袋法は語と語の順序を考慮せず,問題の複雑さを簡略化し,モデルの改善にきっかけを提供した.各ドキュメントは、いくつかのトピックからなる確率分布を表し、各トピックは多くの単語からなる確率分布を表します.
パラメータ:
checkpointInterval:
タイプ:整数.
意味:チェックポイント間隔(>=1)を設定するか、チェックポイント(-1)を設定しない.
docConcentration:
タイプ:二重精度配列型.
意味:ドキュメントのトピック(「theta」)に関する事前分布セットパラメータ(通常は「alpha」)です.
featuresCol:
タイプ:文字列タイプ.
意味:フィーチャー列名.
k:
タイプ:整数.
意味:推定するトピック(クラスタ)の数.
maxIter:
タイプ:整数.
意味:反復回数(>=0)
optimizer:
タイプ:文字列タイプ.
意味:LDAモデルを推定する際に使用するオプティマイザ.
意味:カテゴリ条件確率予測結果列名.
seed:
タイプ:ロング整数.
意味:ランダムシード.
subsamplingRate:
タイプ:二重精度タイプ.
意味:オンラインオプティマイザ(optimizer="online")のみです.
topicConcentration:
タイプ:二重精度タイプ.
意味:トピックのテキストに関する事前分布セットパラメータ(通常は「beta」または「eta」)です.
topicDistributionCol:
タイプ:文字列タイプ.
意味:各ドキュメントのブレンドトピックは、推定された出力列を分布します(文献では通常「theta」と呼ばれています).
呼び出し例:
Scala:
import org.apache.spark.ml.clustering.LDA

// Loads data.
val dataset = spark.read.format("libsvm")
  .load("data/mllib/sample_lda_libsvm_data.txt")

// Trains a LDA model.
val lda = new LDA().setK(10).setMaxIter(10)
val model = lda.fit(dataset)

val ll = model.logLikelihood(dataset)
val lp = model.logPerplexity(dataset)
println(s"The lower bound on the log likelihood of the entire corpus: $ll")
println(s"The upper bound bound on perplexity: $lp")

// Describe topics.
val topics = model.describeTopics(3)
println("The topics described by their top-weighted terms:")
topics.show(false)

// Shows the result.
val transformed = model.transform(dataset)
transformed.show(false)
Java:
import org.apache.spark.ml.clustering.LDA;
import org.apache.spark.ml.clustering.LDAModel;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

// Loads data.
Dataset dataset = spark.read().format("libsvm")
  .load("data/mllib/sample_lda_libsvm_data.txt");

// Trains a LDA model.
LDA lda = new LDA().setK(10).setMaxIter(10);
LDAModel model = lda.fit(dataset);

double ll = model.logLikelihood(dataset);
double lp = model.logPerplexity(dataset);
System.out.println("The lower bound on the log likelihood of the entire corpus: " + ll);
System.out.println("The upper bound bound on perplexity: " + lp);

// Describe topics.
Dataset topics = model.describeTopics(3);
System.out.println("The topics described by their top-weighted terms:");
topics.show(false);

// Shows the result.
Dataset transformed = model.transform(dataset);
transformed.show(false);
Python:
from pyspark.ml.clustering import LDA

# Loads data.
dataset = spark.read.format("libsvm").load("data/mllib/sample_lda_libsvm_data.txt")

# Trains a LDA model.
lda = LDA(k=10, maxIter=10)
model = lda.fit(dataset)

ll = model.logLikelihood(dataset)
lp = model.logPerplexity(dataset)
print("The lower bound on the log likelihood of the entire corpus: " + str(ll))
print("The upper bound bound on perplexity: " + str(lp))

# Describe topics.
topics = model.describeTopics(3)
print("The topics described by their top-weighted terms:")
topics.show(truncate=False)

# Shows the result
transformed = model.transform(dataset)
transformed.show(truncate=False)