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_unigram
和 dtm_train_bigram
的条款都输入到 dtm_test?
- 我可以在分别创建
dtm_train_unigram
和 dtm_train_bigram
之后将它们合并到一个 dtm 中吗(如目前所做的那样)?
- 我可以简化我的两步 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 克。
我正在对 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_unigram
和 dtm_train_bigram
的条款都输入到 dtm_test?
- 我可以在分别创建
dtm_train_unigram
和dtm_train_bigram
之后将它们合并到一个 dtm 中吗(如目前所做的那样)? - 我可以简化我的两步 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 克。