我有以下格式的大数据集,其中每一行上都有一个文档,编码为word:文档中的频率,以空格分隔; 线可以是可变长度的:

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)

然后以某种方式将成对的值放入数组中,然后运行一个循环,该循环通过从word:freq对中获取合适的值来填充矩阵(预先填充零: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并开始使用本教程。 我有一种感觉,我想念的是这里很明显的东西,可能是找不到的东西,因为我不知道这些东西叫什么(我已经搜索了一天,主题是“术语文档向量/数组/对” ”,“二维数组”,“列表到矩阵”等)。

将这样的文档列表转换成术语文档频率矩阵的一种好方法是什么? 或者,如果解决方案太明显或无法使用内置函数解决:我上面描述的格式的实际术语是什么,一行上有那些term:frequency pair,而每一行都是一个文档?

===============>>#1 票数: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

注意 :已对答案进行编辑,以在创建“ out”时使用矩阵,以最大程度地减少对read.table的调用次数,这将是更大数据的主要瓶颈。

  ask by user3554004 translate from so

未解决问题?本站智能推荐:

1回复

术语频率表到tm R包中的DocumentTermMatrix

我在R中使用tm包进行一些文本挖掘。 我有一个术语频率矩阵,其中每一行都是一个文档,每一列都是一个单词,每个单元格都是该单词的频率。 我正在尝试将其转换为DocumentTermTermMatrix对象。 我似乎找不到处理该问题的函数。 看起来来源通常是文档。 我已经尝试过as.D
1回复

文本挖掘-包含列表的单个列中的单词频率

这是我的数据集: https://app.box.com/s/yotsy58ud2k9yk7vs7sj8ksc0favhevv 我正在尝试从具有以下结构的单列创建标签的频率表: 为了简单起见,我尝试使用qdap ,但结果不正确 解 只是改进(创建数据框和排序
2回复

R:tm包,汇总/加入文档

我之前找不到关于此的任何问题,因此也许您可以提供帮助。 基于元数据(例如,不同作者的文本聚合)在tm语料库中聚合数据的好方法是什么? 至少有两种明显的方法可以完成: tm中的内置函数,该函数允许DocumentTermMatrix构建在元数据功能上。 不幸的是,我无法发现
1回复

将短语列表与文档语料库匹配并返回短语频率

我有一个短语列表和一个文档语料库,语料库中有100k +短语和60k +文档。 这些短语可能/可能不在语料库中。 我期待找到语料库中每个短语的词频。 示例数据集: 我是R语言文本分析的新手,并已根据Tyler Rinker解决此R文本挖掘的方法解决了此问题:计算特定单词在语料库
1回复

从PDF文件构建术语文档矩阵

我正在尝试从一个pdf文本构建term document matrix 。 当我检查term document matrix ,我得到了。 文件数应为1而不是342,而342是pdf文件中的页数。 我试过使用R使用此代码。
2回复

文档项矩阵到矩阵列表R

我有一个文档项矩阵dtm,例如: 现在,我要将其传输到矩阵列表中,每个矩阵代表一个文档。 这是为了满足STM软件包的正式要求: 我正在考虑从dtm查找所有非零条目,并将它们生成到矩阵中,一次每行,因此: 然而, 就是行不通。 错误提示: 我想知道为什么
2回复

R中的文档术语矩阵

我有以下代码: 我正在尝试使用tm参考手册( http://cran.r-project.org/web/packages/tm/tm.pdf )中详细介绍的某些操作,但收效甚微。 例如,当我尝试使用findFreqTerms时,出现以下错误: 谁能为我提供线索,为什么它不起作
2回复

tm package:在矩阵中输出findAssocs()而不是R中的列表

请考虑以下列表: 如何设置一个数据框,其中包含与列中这3个单词相关联的所有术语,并显示: 相应的相关系数(如果存在) NA如果这个词不存在(例如,夫妻(油,他们)会显示NA)
2回复

在文档术语频率中查找常用单词及其值

因此,我必须从DTM中找到最常用的单词及其值。 这是为了清理语料库以及下面的内容,以创建DTM并查找频率。 有没有办法将常用词和频率值结合在一起?
3回复

在R中创建文档术语矩阵

我需要为自己,我的Twitter关注者及其关注者创建一个documenttermmatrix。 我们需要不使用tm包来创建它。 目前,我们有以下变量: 列表l :包含所有关注者的关注者,按关注者存储(包括本人和我自己的关注者) lunique1 :列表l的未列出和排序的版