我对R很陌生,对不起,如果我的问题微不足道。我尝试使用文字云。函数 comparison.cloud 应该接受一个术语文档矩阵,其单词频率矩阵是这样构建的:
head(term.matrix,1)
Docs
Terms SOTU 2010 SOTU 2011
’ll 3 8
colnames(term.matrix)
[1] "SOTU 2010" "SOTU 2011"
我尝试自己构建这样的矩阵,但我很困惑为什么"术语"不被视为列名,为什么"文档"在两个列名称"SOTU 2010"和"SOTU 2011"之上......
有人可以解释一下吗?
矩阵的dimnames
属性(如果不是NULL
)是存储矩阵的行名和列名list(rownames, colnames)
形式的列表。
x <- matrix(1:9, 3L, 3L)
x
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
dimnames(x) <- list(letters[1:3], LETTERS[1:3])
x
## A B C
## a 1 4 7
## b 2 5 8
## c 3 6 9
有时,列表本身有名称很方便。这些名称的作用有点像轴标题:
names(dimnames(x)) <- c("lo", "UP")
x
## UP
## lo A B C
## a 1 4 7
## b 2 5 8
## c 3 6 9
lo
与列名打印在同一行上,但它实际上是第一维度的标题。同样,UP
是第二个维度的标题。
TermDocumentMatrix
和DocumentTermMatrix
对象不是真正的 R 矩阵。它们以三元组格式存储非零元素以提高效率,以及一些元数据。但是,与真正的 R 矩阵一样,它们可以具有dimnames
属性。由于行和列表示术语和文档(反之亦然),因此 packagetm
将名称Terms
和Docs
分配给dimnames
。
以vignette("tm")
为例:
library("tm")
reut21578 <- system.file("texts", "crude", package = "tm")
reuters <- VCorpus(DirSource(reut21578, mode = "binary"),
readerControl = list(reader = readReut21578XMLasPlain))
tdm <- TermDocumentMatrix(reuters)
str(tdm)
## List of 6
## $ i : int [1:2255] 14 35 49 157 202 203 233 274 290 291 ...
## $ j : int [1:2255] 1 1 1 1 1 1 1 1 1 1 ...
## $ v : num [1:2255] 1 1 1 1 1 1 1 1 1 1 ...
## $ nrow : int 1266
## $ ncol : int 20
## $ dimnames:List of 2
## ..$ Terms: chr [1:1266] "..." ""(it)" ""demand" ""expansion" ...
## ..$ Docs : chr [1:20] "127" "144" "191" "194" ...
## - attr(*, "class")= chr [1:2] "TermDocumentMatrix" "simple_triplet_matrix"
## - attr(*, "weighting")= chr [1:2] "term frequency" "tf"
因此:
y <- as.matrix(tdm)[1:6, 1:6]
y
## Docs
## Terms 127 144 191 194 211 236
## ... 0 0 0 0 0 0
## "(it) 0 0 0 0 0 0
## "demand 0 1 0 0 0 0
## "expansion 0 0 0 0 0 0
## "for 0 0 0 0 0 0
## "growth 0 0 0 0 0 0
dimnames(y)
## $Terms
## [1] "..." ""(it)" ""demand" ""expansion" ""for" ""growth"
##
## $Docs
## [1] "127" "144" "191" "194" "211" "236"