创建文档术语矩阵,在R中使用N-Grams

创建文档术语矩阵,在R中使用N-Grams,r,nlp,tokenize,tm,n-gram,R,Nlp,Tokenize,Tm,N Gram,我正在使用“tm”包在R中创建DocumentTermMatrix。它对一个gram很有效,但我正在尝试使用tm包和“tokenizers”包中的tokenize_ngrams函数创建一个N个gram的DocumentTermMatrix(目前为N=3)。 但是我不能创造它 我寻找可能的解决办法,但没有得到多少帮助。 出于隐私原因,我无法共享数据。 这是我尝试过的 library(tm) library(tokenizers) 数据是一个数据框,大约有4.5k行和2列,即“doc_id”和

我正在使用“tm”包在R中创建DocumentTermMatrix。它对一个gram很有效,但我正在尝试使用tm包和“tokenizers”包中的tokenize_ngrams函数创建一个N个gram的DocumentTermMatrix(目前为N=3)。 但是我不能创造它

我寻找可能的解决办法,但没有得到多少帮助。 出于隐私原因,我无法共享数据。 这是我尝试过的

library(tm)  
library(tokenizers)
数据是一个数据框,大约有4.5k行和2列,即“doc_id”和“text”

用于n-gram标记化的自定义函数:

ngram_tokenizer = function(x){
  temp = tokenize_ngrams(x, n_min = 1, n = 3, stopwords = FALSE, ngram_delim = "_")
  return(temp)
}
DTM创建的控制列表:
1克

用于N-gram标记化

control_list_ngram = list(tokenize = ngram_tokenizer,
                    removePunctuation = FALSE,
                    removeNumbers = FALSE, 
                    stopwords = stopwords("english"), 
                    tolower = T, 
                    stemming = T, 
                    weighting = function(x)
                      weightTf(x)
                    )


dtm_unigram = DocumentTermMatrix(data_corpus, control_list_unigram)
dtm_ngram = DocumentTermMatrix(data_cropus, control_list_ngram)

dim(dtm_unigram)
dim(dtm_ngram)
两个dtm的尺寸相同。

请纠正我

不幸的是,tm有一些令人讨厌的怪癖,而且并不总是很清楚。首先,标记化在corpera创建的
语料库上似乎不起作用。为此,您需要使用
VCorpus

因此,将行
data\u corpus=corpus(DataframeSource(data))
更改为
data\u corpus=VCorpus(DataframeSource(data))

这是一个需要解决的问题。现在语料库将用于标记化,但现在您将遇到
标记化\u ngrams
的问题。您将得到以下错误:

Input must be a character vector of any length or a list of character
  vectors, each of which has a length of 1. 
当您运行这一行时:
dtm\u ngram=DocumentTermMatrix(数据、控制、列表)

为了解决这个问题,并且不依赖于标记器包,您可以使用以下函数来标记数据

NLP_tokenizer <- function(x) {
  unlist(lapply(ngrams(words(x), 1:3), paste, collapse = "_"), use.names = FALSE)
}

就我个人而言,我会使用该软件包来完成所有这些工作。但现在这应该对你有帮助。

我也在寻找类似的东西。到目前为止,我还没有使用Quanteda,但我肯定会更多地探索Quanteda。谢谢你的帮助!
Input must be a character vector of any length or a list of character
  vectors, each of which has a length of 1. 
NLP_tokenizer <- function(x) {
  unlist(lapply(ngrams(words(x), 1:3), paste, collapse = "_"), use.names = FALSE)
}
control_list_ngram = list(tokenize = NLP_tokenizer,
                          removePunctuation = FALSE,
                          removeNumbers = FALSE, 
                          stopwords = stopwords("english"), 
                          tolower = T, 
                          stemming = T, 
                          weighting = function(x)
                            weightTf(x)
                          )