如何基于指定二元词组词典构建文本的DocumentTermMatrix?
嘿,我来帮你搞定用自定义二元词组词典构建DocumentTermMatrix的事儿!结合你给出的现有数据和已经完成的预处理,具体操作步骤我整理好了:
现有数据与已完成的预处理
文本数据(text)
你现有的文本数据通过dplyr::glimpse()查看是这样的:
library(dplyr) glimpse(text) # 输出结果: chr [1:11] "Welcome to Wikipedia ! [bla] Discover Ekopedia, the practical encyclopedia about alternative life techniques. \"| __truncated__ ...
二元词组词典(dict)
你的二元词组词典内容如下:
glimpse(dict) # 输出结果: chr [1:34] "and i" "and the" "as a" "at the" "do not" "for the" "from the" "has been" "i am" "i dont" ...
已完成的预处理代码
你已经完成了文本预处理的部分,大致代码应该是这样的(我帮你补全了常见的预处理步骤,你可以根据实际情况调整):
library(tm) corpus <- VCorpus(VectorSource(text)) # 常见预处理步骤(你已经完成的部分) corpus <- tm_map(corpus, content_transformer(tolower)) corpus <- tm_map(corpus, removePunctuation) corpus <- tm_map(corpus, removeNumbers) # ... 其他你已经完成的预处理操作,比如去除停用词等
基于二元词组词典构建DocumentTermMatrix
因为tm包默认是按单字词分词,所以我们需要自定义一个分词器,优先匹配词典里的二元词组,具体操作如下:
1. 编写自定义分词函数
这个函数会先尝试匹配词典中的二元词组,没匹配到的再按单字词处理(如果你只想保留二元词组,可以去掉单字词的逻辑):
custom_tokenizer <- function(x) { # 按空格拆分文本为单字词 words <- unlist(strsplit(x, "\\s+")) total_words <- length(words) tokens <- c() i <- 1 while (i <= total_words) { # 当不是最后一个词时,尝试拼接二元词组 if (i < total_words) { current_bigram <- paste(words[i], words[i+1], sep = " ") # 如果当前二元词组在词典里,就加入tokens,同时跳过下一个词 if (current_bigram %in% dict) { tokens <- c(tokens, current_bigram) i <- i + 2 next } } # 没匹配到二元词组,就加入当前单字词 tokens <- c(tokens, words[i]) i <- i + 1 } return(tokens) }
2. 构建DocumentTermMatrix
用自定义的分词器来构建矩阵:
# 指定分词器为我们写的custom_tokenizer dtm <- DocumentTermMatrix(corpus, control = list(tokenize = custom_tokenizer)) # 查看生成的DocumentTermMatrix详情 inspect(dtm)
小提示
一定要确保你的预处理后的文本和词典格式完全一致,比如都是小写、没有标点符号,这样二元词组的匹配才不会出错。如果不需要保留单字词,直接在自定义分词函数里去掉添加单字词的逻辑就行~
内容的提问来源于stack exchange,提问作者Banjo
相关产品推荐
相关产品推荐

