如何删除文档术语矩阵中的一列单词



我通过文档术语矩阵使用训练数据集训练了我的机器学习模型。我试图预测我的测试数据集,但不幸的是,它包含了训练数据集没有的单词。

我的问题是,我如何真正删除测试数据集中训练数据集中没有的单词。

我使用的是tm软件包,我创建了一个DocumentTermMatrix。

一种简单的方法是使用quanteda文本分析包。一旦构建了文档特征矩阵,就可以从第二个"dfm"中选择其特征。这允许您为训练集构建dfm,然后从测试集中轻松地选择与训练集中的特性相同的特性。

以下是来自?selectFeatures帮助页面的插图:

require(quanteda)
textVec1 <- c("This is text one.", "This, the second text.", "Here: the third text.")
textVec2 <- c("Here are new words.", "New words in this text.")
features(dfm1 <- dfm(textVec1))
#
#   ... lowercasing
#   ... tokenizing
#   ... indexing documents: 3 documents
#   ... indexing features: 8 feature types
#   ... created a 3 x 8 sparse dfm
#   ... complete. 
# Elapsed time: 0.077 seconds.
# [1] "this"   "is"     "text"   "one"    "the"    "second" "here"   "third" 
features(dfm2a <- dfm(textVec2))
#
#   ... lowercasing
#   ... tokenizing
#   ... indexing documents: 2 documents
#   ... indexing features: 7 feature types
#   ... created a 2 x 7 sparse dfm
#   ... complete. 
# Elapsed time: 0.006 seconds.
# [1] "here"  "are"   "new"   "words" "in"    "this"  "text" 
(dfm2b <- selectFeatures(dfm2a, dfm1))
# found 3 features from 8 supplied types in a dfm, padding 0s for another 5 
# Document-feature matrix of: 2 documents, 8 features.
# 2 x 8 sparse Matrix of class "dfmSparse"
#       this is text one the second here third
# text1    0  0    0   0   0      0    1     0
# text2    1  0    1   0   0      0    0     0
identical(features(dfm1), features(dfm2b))
# [1] TRUE

有几种方法可以做到这一点。一个是,当你使用训练数据创建DTM时,你有一个项目列表,然后你可以编写一个小函数来为你加入这些列表做工作,这里是一个例子,可能效率不高,但应该有效:

dtm是您使用训练数据构建的语料库。文档是您想要评估模型的新文档:

    DocumentVectortfidf<-function (dtm, Document) #
        {
          corpus <- Corpus(DataframeSource(Document))
          dtm1 <- DocumentTermMatrix(corpus) #this is from your Document
    #I created 2 dataframes and then merge them.
          Data<-data.frame(dtm1$dimnames$Terms,dtm1$v)
          colnames(Data)[1:2]<-c("Words","Frequency")
          Matrixwords<-data.frame(dtm$dimnames$Terms,0)
          colnames(Matrixwords)[1]<-"Words"
          Joint<-merge(Matrixwords,Data, by="Words", all.x = T, sort=T)
          Joint$Frequency<-ifelse(is.na(Joint$Frequency),0,Joint$Frequency)
         # This is optional if you want tf or tfidf, just change this, important!!
 tf uses only values from the Document, but tfidf uses numbers along the entire
 list of documents, so you use dtm for this. 
         # cs <- col_sums(dtm > 0)
         # lnrs <- log2(nDocs(dtm)/cs)
      DocumentVector<-data.frame(t(Joint$Frequency*lnrs))
      DocumentVector 
    }

现在有几种不同的方法可以做到这一点,也可以作为字典来完成,所以我们从dtm(具有训练数据的dtm)中提取单词列表,然后在为新文档创建dtm1时将该列表用作字典。我希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新