R-如何将训练文档术语矩阵(dtm)中的术语应用到测试dtm(单字组和双字组)?

时间:2018-09-06 15:00:26

标签: r text nlp tm text-classification

我正在针对1000个训练示例训练一种简单的文本分类方法,并希望对看不见的测试数据(约50万个观察结果)做出预测。

当我仅使用unigram时,脚本运行良好。但是,我不确定在处理unigram和bigram时如何使用control = list(dictionary=Terms(dtm_train_unigram)),因为我有两个单独的文档项矩阵(一个用于unigram,一个用于bigram,请参见下文):

  UnigramTokenizer <- function(x) unlist(lapply(NLP::ngrams(words(x), 1), paste, collapse = " "), use.names = FALSE)
  dtm_train_unigram <- DocumentTermMatrix(processed_dataset, control = list(tokenize = UnigramTokenizer, wordLengths=c(3,20), bounds = list(global = c(4,Inf))))

  BigramTokenizer <- function(x) unlist(lapply(NLP::ngrams(words(x), 2), paste, collapse = " "), use.names = FALSE)
  dtm_train_bigram <- DocumentTermMatrix(processed_dataset, control = list(tokenize = BigramTokenizer, wordLengths=c(6,20), bounds = list(global = c(7,Inf))))

为了确保测试集与训练集具有相同的术语,我使用以下功能:

corpus_test <- VCorpus(VectorSource(test_set))
dtm_test <- DocumentTermMatrix(corpus_test, control = list(dictionary=Terms(dtm_train_unigram), wordLengths = c(3,20)))

如何将dtm_train_unigramdtm_train_bigram的条款提供给dtm_test?

  1. 在分别创建dtm_train_unigramdtm_train_bigram之后(如目前所做的那样),我可以将它们合并到单个dtm吗?
  2. 我可以简化两步令牌生成器功能,所以只创建一个 首先是unig和bigrams的dtm?

谢谢!

1 个答案:

答案 0 :(得分:1)

回答您的问题:

tm的官方文档规定了以下用于组合的内容。

  

将多个语料库合并为一个,合并多个文档   进入语料库,将多个术语文档矩阵合并为一个   一个,或将多个项频率向量合并为一个   期限文档矩阵。

在您的情况下,这将是对1的答案:

my_dtms <- c(dtm_train_unigram, dtm_train_bigram)

但这确实导致文档数量翻倍,实际上并非如此。

因此,我们来到第2点,您可以从NLP包中创建一个令牌处理程序,该令牌处理程序可以处理多个n-gram实例:

my_tokenizer <- function(x) unlist(lapply(NLP::ngrams(words(x), 1:2), paste, collapse = " "), use.names = FALSE)

请注意向量1:2 ngram函数。将其更改为1、2、3克的1:3或仅2和3克的2:3。