【发布时间】:2017-01-24 13:10:22
【问题描述】:
假设文本数据如下所示:
txt <- c("peter likes red", "mary likes green", "bob likes blue")
我想将这些字符串简化为这个受控词汇表中的单词:
voc <- c("peter", "mary", "bob", "red", "green", "blue")
结果应该是一个向量:
c("peter red", "mary green", "bob blue")
可以使用tm 库,但这只会给我一个密集的文档术语矩阵:
foo <- VCorpus(VectorSource(txt))
inspect(DocumentTermMatrix(foo, list(dictionary = voc)))
Non-/sparse entries: 6/12
Sparsity : 67%
Maximal term length: 5
Weighting : term frequency (tf)
Terms
Docs blue bob green mary peter red
1 0 0 0 0 1 1
2 0 0 1 1 0 0
3 1 1 0 0 0 0
如何获得每个向量元素一个字符串的向量解?
解决方案应该很快。我也是base R的忠实粉丝。
编辑:迄今为止的解决方案比较
根据我的数据,James 的解决方案比 Sotos 的解决方案快四倍。但是当我从length(text) 1k 到 10k 时,内存不足。 Sotos 的解决方案仍然以 10k 的速度运行。
鉴于我的数据有 length(txt) ~1M 和 length(voc) ~5k 我估计 Sotos 的解决方案需要 18 小时才能完成,因为它不会耗尽内存。
没有更快的方法吗?
【问题讨论】:
-
非正则表达式方法是否足以满足您的情况?例如。类似
sapply(strsplit(txt, " ", TRUE), function(x) paste(collapse = " ", x[x %in% voc])) -
@alexis_laz 你赢了!您的解决方案在 10 分钟内完成,而不是 18 小时。您想创建一个专门的答案以便我将其标记为解决方案吗?
标签: r extraction corpus vocabulary