R - 如何将训练文档术语矩阵 (dtm) 中的术语应用于测试 dtm(一元字符和二元字符)?

R - How to apply terms from training document-term-matrix (dtm) to test dtm (both unigrams and bigrams)?

我正在对 1,000 个训练示例训练一个简单的文本分类方法,并希望对未见过的测试数据(大约 500,000 个观察值)进行预测。

当我只使用 unigrams 时,脚本运行良好。但是,我不确定在处理一元字母和二元字母时如何使用 control = list(dictionary=Terms(dtm_train_unigram)),因为我有两个单独的文档术语矩阵(一个用于一元字母,一个用于二元字母,见下文):

  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. 我可以简化我的两步 Tokenizer 函数以便我只创建一个 dtm 与 unigrams 和 bigrams 放在首位?

谢谢!

回答您的问题:

tm 的官方文档说明了以下合并内容。:

Combine several corpora into a single one, combine multiple documents into a corpus, combine multiple term-document matrices into a single one, or combine multiple term frequency vectors into a single term-document matrix.

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

my_dtms <- c(dtm_train_unigram, dtm_train_bigram)

但它确实会导致文档数量翻倍,但事实并非如此。

所以我们来到第 2 点,您可以从 NLP 包创建一个分词器,它可以处理不止 1 个 n-gram 实例:

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

注意向量 1:2 ngram 函数。将此更改为 1:3 表示 1、2、3 克或 2:3 表示仅 2 克和 3 克。