将术语 - 频率对列表放入R中的矩阵中

时间:2014-04-20 14:50:34

标签: r matrix information-retrieval tm word-frequency

我有一个大型数据集,格式如下,每行都有一个文档,编码为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 是什么,其中有一些术语:一行上的频率对,以及每一行都是一份文件?

1 个答案:

答案 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的调用次数,这将成为更大数据的主要瓶颈。