我正在参与 Kaggle上的Allen AI 科学挑战赛。
挑战背后的想法是使用提供的训练数据(一组八年级科学问题以及四个答案选项,其中一个是正确答案和正确答案)以及任何其他知识源(维基百科,科学教科书等),以便它可以像(平均?)八年级学生一样回答科学问题。
我正在考虑对 R 中的问题进行第一次破解(只精通 R 和 C++;我不认为 C++ 将是解决这个问题的非常有用的语言)。在浏览了 Kaggle 论坛之后,我决定使用 TopicModels (tm)、RWeka 和 Latent Dirichlet Algorithm (LDA) 包。
我目前的方法是构建某种文本预测器,它在阅读提出的问题时会输出一串文本,并计算此输出文本与测试集中给出的四个选项之间的余弦相似度,并预测正确的选项是具有最高的余弦相似度。
我将使用训练数据、维基百科语料库以及一些科学教科书来训练模型,以使模型不会过拟合。
我在这里有两个问题:
整体方法有意义吗?
构建此文本预测器的良好起点是什么?将语料库(训练数据、维基百科和教科书)转换为术语文档/文档术语矩阵有帮助吗?我认为为所有来源形成 n-gram 会有所帮助,但我不知道下一步会是什么,即模型将如何准确预测并在阅读问题时输出一串文本(例如大小为 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)
任何帮助将不胜感激!