R:在 mgsub 之后的 DocumentTermMatrix 错误频率

R: DocumentTermMatrix Wrong Frequencies after mgsub

我有一个 DocumentTermMatrix,我想替换本文档中的特定术语并创建一个频率 table。

起点为原文档如下:

library(tm)
library(qdap)

    df1 <- data.frame(word =c("test", "test", "teste", "hey", "heyyy", "hi"))
    tdm <- as.DocumentTermMatrix(as.character(df1$word))

当我创建原始文档的频率 table 时,我得到了正确的结果:

freq0 <- as.matrix(sort(colSums(as.matrix(tdm)), decreasing=TRUE))
freq0 

到目前为止一切顺利。但是,如果替换文档中的某些术语,则新频率 table 会得到错误的结果:

    tdm$dimnames$Terms <- mgsub(c("teste", "heyyy"), c("test", "hey"), as.character(tdm$dimnames$Terms), fixed=T, trim=T)
    freq1 <- as.matrix(sort(colSums(as.matrix(tdm)), decreasing=TRUE))
    freq1

显然或者文档中的某些索引是错误的,因为在计算术语时,即使是相同的术语也不被视为相同。

这个结果应该是最理想的情况:

df2 <- data.frame(word =c("test", "test", "test", "hey", "hey", "hi"))
tdm2 <- as.DocumentTermMatrix(as.character(df2$word))
tdm2$dimnames$Terms <- mgsub(c("teste", "heyyy"), c("test", "hey"), as.character(tdm2$dimnames$Terms), fixed=T, trim=T)
freq2 <- as.matrix(sort(colSums(as.matrix(tdm2)), decreasing=TRUE))
freq2

谁能帮我解决这个问题?

提前致谢

我们可以看看as.matrix(tdm)

的结构
str(as.matrix(tdm))
#num [1, 1:5] 1 1 1 2 1
# - attr(*, "dimnames")=List of 2
#  ..$ Docs : chr "all"
# ..$ Terms: chr [1:5] "hey" "heyyy" "hi" "test" ...

这是一行5列的矩阵,所以colSums基本上什么都不做。

xtabs(as.vector(tdm)~tdm$dimnames$Terms)
#tdm$dimnames$Terms
#  hey heyyy    hi  test teste 
#   1     1     1     2     1 

并使用 mgsub

替换后
xtabs(as.vector(tdm)~tdm$dimnames$Terms)
#tdm$dimnames$Terms
# hey   hi test 
#  2    1    3 

xtabs 执行 vectorsum。这也可以用 tapply

来完成
 tapply(as.vector(tdm), tdm$dimnames$Terms, FUN = sum)

如果行数大于1,我们可以用colSums

 tapply(colSums(as.matrix(tdm)),  tdm$dimnames$Terms, FUN = sum)
 # hey   hi test 
 #  4    2    6 

注意:以上输出是我们使用 mgsub

进行更改后的结果