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

时间:2015-12-13 02:59:59

标签: text-mining tm

我通过文档术语矩阵使用训练数据集训练我的机器学习模型。 我试图预测我的测试数据集,但遗憾的是它包含训练数据集未附带的单词。

我的问题是如何在我的测试数据集中删除训练数据集中找不到的那些单词。

我正在使用tm包,我创建了一个DocumentTermMatrix。

2 个答案:

答案 0 :(得分:0)

一种简单的方法是使用 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

答案 1 :(得分:0)

有几种方法可以做到这一点。一个是当您使用训练数据创建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(带有训练数据的那个)中提取单词列表,然后在创建dtm1时使用这个列表作为字典新文件。  我希望这会有所帮助。