我正在使用for
循环来创建文档字词矩阵。我的实际问题是使用一个名为RMeCab
的模糊包来标记日文文本,但这里使用strsplit
标准等效。我目前的代码:
Documents <- data.frame(Names= c("A","B"),Texts=c("A string of words","A different string"), stringsAsFactors = FALSE)
OUTPUT <- NULL
COMBINED <- NULL
i <- 1
for (i in 1:length(Documents$Texts)){
OUTPUT <- data.frame(unlist(strsplit(Documents$Texts, " ")))
OUTPUT$doc <- Documents$Names[i]
COMBINED <- rbind(COMBINED, OUTPUT)
}
Document_Term_Matrix <- as.data.frame.matrix(table(COMBINED))
它有效,但我想使用更高效的apply
功能。如果我跑
L_OUTPUT <- lapply(Documents[,2],function(x) strsplit(x, " "))
我将单独的单词作为列表的元素,但如何从Documents $ Names附加文档名称?
更具体地说,列表结构:
[[1]]
これ です は ぺん
1 1 1 1
[[2]]
です は 人 彼
1 1 1 1
如何使用这样的列获取数据
これ は ぺん です 彼 は 人 です
第二列显示文档名称
一一二一二二二
与列表元素[[1]],[[2]]等对应的那些词
答案 0 :(得分:2)
最好使用tm
等软件包进行这类操作,但这是一个使用基础R
的解决方案,
list1 <- strsplit(Documents$Texts, ' ')
v1 <- unique(unlist(list1))
Document_Term_Matrix <- as.data.frame(t(sapply(v1, function(i) lapply(list1, function(j)
sum(grepl(i, j))))))
names(Document_Term_Matrix)<- Documents$Names
Document_Term_Matrix
# A B
#A 1 1
#string 1 1
#of 1 0
#words 1 0
#different 0 1
答案 1 :(得分:0)
您可以使用tm
包中适用于大型文本数据集的函数:
library(tm)
# create corpora from your documents
corp = VCorpus(DataframeSource(Documents), readerControl = list(reader = readTabular(mapping = list(content = "Texts", id = "Names"))))
# create term document matrix
tdm = TermDocumentMatrix(corp, control = list(tokenize = function(x) unlist(strsplit(as.character(x), "[[:space:]]+"))
, stopwords = FALSE
, tolower = TRUE
, weighting = weightTf))
inspect(tdm)
# get the result as matrix
tdm.m = matrix(tdm, nrow = tdm$nrow, ncol = tdm$ncol)
rownames(tdm.m) = tdm$dimnames$Terms
colnames(tdm.m) = tdm$dimnames$Docs
我也认为你的问题有误(但我不能添加评论)。
您的for循环中缺少[i]
,因此您可以获得所有文档中的术语总数。它应该是这样的:
OUTPUT <- data.frame(unlist(strsplit(Documents$Texts[i], " ")))