0

現在、Kaggle で開催されているAllen AI Science Challengeに取り組んでいます。

課題の背後にある考え方は、提供されたトレーニング データ (8 年生レベルの科学問題と 4 つの回答オプション、そのうちの 1 つが正解と正解) を追加の知識ソース (ウィキペディア、理科の教科書など) で、(平均的な?) 中学 2 年生と同じように理科の質問に答えることができます。

私は R の問題を最初に解こうと考えています (R と C++ だけに堪能です。C++ がこの問題を解決するのに非常に役立つ言語になるとは思いません)。Kaggle フォーラムを調査した後、TopicModels (tm)、RWeka、Latent Dirichlet Algorithm (LDA) パッケージを使用することにしました。

私の現在のアプローチは、提起された質問を読むとテキストの文字列を出力し、この出力テキストとテストセットで与えられた4つのオプションとの間のコサイン類似度を計算し、正しいものを予測する何らかのテキスト予測子を構築することですコサイン類似度が最も高くなります。

モデルがオーバーフィットしないように、トレーニング データ、ウィキペディアのコーパス、およびいくつかの科学の教科書を使用してモデルをトレーニングします。

ここで 2 つの質問があります。

  1. 全体的なアプローチは理にかなっていますか?

  2. このテキスト予測子を構築するための良い出発点は何ですか? コーパス (トレーニング データ、ウィキペディア、教科書) を用語ドキュメント/ドキュメント用語マトリックスに変換すると役立ちますか? すべての情報源の n グラムを形成することは役立つと思いますが、次のステップがどうなるかわかりません。つまり、モデルがどのように正確に予測し、質問を読むときにテキストの文字列 (たとえば、サイズ n) をベルトアウトするかはわかりません。 .

アプローチの一部を実装してみました。トピックの最適な数を見つけ、トレーニング セットに対して LDA を実行します。コードは次のとおりです。

library(topicmodels)
library(RTextTools)

data<-read.delim("cleanset.txt", header = TRUE)
data$question<-as.character(data$question)
data$answerA<-as.character(data$answerA)
data$answerB<-as.character(data$answerB)
data$answerC<-as.character(data$answerC)
data$answerD<-as.character(data$answerD)

matrix <- create_matrix(cbind(as.vector(data$question),as.vector(data$answerA),as.vector(data$answerB),as.vector(data$answerC),as.vector(data$answerD)), language="english", removeNumbers=FALSE, stemWords=TRUE, weighting = tm::weightTf)
best.model<-lapply(seq(2,25,by=1),function(k){LDA(matrix,k)})
best.model.logLik <- as.data.frame(as.matrix(lapply(best.model, logLik)))
best.model.logLik.df <- data.frame(topics=c(2:25), LL=as.numeric(as.matrix(best.model.logLik)))
best.model.logLik.df[which.max(best.model.logLik.df$LL),]
best.model.lda<-LDA(matrix,25)

どんな助けでも大歓迎です!

4

0 に答える 0