我正在针对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_unigram
和dtm_train_bigram
的条款提供给dtm_test?
dtm_train_unigram
和dtm_train_bigram
之后(如目前所做的那样),我可以将它们合并到单个dtm吗? 谢谢!
答案 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。