我有一个大型数据集,格式如下,每行都有一个文档,编码为word:freqency-in-the-document,用空格分隔;行可以是可变长度:
aword:3 bword:2 cword:15 dword:2
bword:4 cword:20 fword:1
etc...
例如,在第一份文件中," aword"发生3次。我最终想做的是创建一个小搜索引擎,其中匹配查询的文档(格式相同)被排名;我虽然使用TfIdf和tm包(基于本教程,它要求数据采用TermDocumentMatrix格式:http://anythingbutrbitrary.blogspot.be/2013/03/build-search-engine-in-20-minutes-or.html)。否则,我只会在文本语料库中使用tm的TermDocumentMatrix函数,但这里的问题是我已经将这些数据以这种格式编入索引(而且我更喜欢使用这些数据,除非格式确实是一种外来的东西,无法转换。)
我到目前为止尝试的是导入线并将它们分开:
docs <- scan("data.txt", what="", sep="\n")
doclist <- strsplit(docs, "[[:space:]]+")
我想我会把这样的东西放在一个循环中:
doclist2 <- strsplit(doclist, ":", fixed=TRUE)
并以某种方式将配对的值放入一个数组中,然后运行一个循环,通过从单词:freq pairs中获取appripriate值来填充矩阵(预填充零:matrix(0,x,y))这本身是构建矩阵的好主意吗?)。但是这种转换方式看起来并不是一种好方法,列表变得越来越复杂,而且我还不知道如何达到可以填充矩阵的程度。
我(我想)最终需要的是这样的矩阵:
doc1 doc2 doc3 doc4 ...
aword 3 0 0 0
bword 2 4 0 0
cword: 15 20 0 0
dword 2 0 0 0
fword: 0 1 0 0
...
然后我可以将其转换为TermDocumentMatrix并开始学习本教程。我有一种感觉,我错过了一些非常明显的东西,我可能找不到的东西,因为我不知道这些东西被称为什么(我已经谷歌搜索了一天,主题为&#34;术语文档向量/数组/对&#34;,&#34;二维数组&#34;,&#34;列入矩阵&#34;等)。
将这样的文档列表放入术语 - 文档频率矩阵中会有什么好办法?或者,如果解决方案对于内置函数来说太明显或可行:对于我上面描述的格式,实际的 term 是什么,其中有一些术语:一行上的频率对,以及每一行都是一份文件?
答案 0 :(得分:0)
这是一种可以获得您可能想要的输出的方法:
## Your sample data
x <- c("aword:3 bword:2 cword:15 dword:2", "bword:4 cword:20 fword:1")
## Split on a spaces and colons
B <- strsplit(x, "\\s+|:")
## Add names to your list to represent the source document
B <- setNames(B, paste0("document", seq_along(B)))
## Put everything together into a long matrix
out <- do.call(rbind, lapply(seq_along(B), function(x)
cbind(document = names(B)[x], matrix(B[[x]], ncol = 2, byrow = TRUE,
dimnames = list(NULL, c("word", "count"))))))
## Convert to a data.frame
out <- data.frame(out)
out
# document word count
# 1 document1 aword 3
# 2 document1 bword 2
# 3 document1 cword 15
# 4 document1 dword 2
# 5 document2 bword 4
# 6 document2 cword 20
# 7 document2 fword 1
## Make sure the counts column is a number
out$count <- as.numeric(as.character(out$count))
## Use xtabs to get the output you want
xtabs(count ~ word + document, out)
# document
# word document1 document2
# aword 3 0
# bword 2 4
# cword 15 20
# dword 2 0
# fword 0 1
注意 :编辑答案以在创建&#34; out&#34;时使用矩阵最大限度地减少对read.table
的调用次数,这将成为更大数据的主要瓶颈。