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
执行 vector
的 sum
。这也可以用 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
进行更改后的结果
我有一个 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
执行 vector
的 sum
。这也可以用 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