r - 使用 R 进行 CPU 和内存高效的 NGram 提取

标签 r performance text-mining n-gram

我编写了一个算法,可以从 50000 个街道地址列表中提取 NGram(二元语法、三元语法……直到 5 元语法)。我的目标是为每个地址提供一个 bool 向量,表示该地址中是否存在 NGram。因此,每个地址都将由属性向量来表征,然后我可以对地址进行聚类。 该算法是这样工作的: 我从二元语法开始,计算(a-z 和 0-9 和/和制表)的所有组合:例如:aa,ab,ac,...,a8,a9,a/,a ,ba, BB,... 然后我对每个地址执行一个循环,并为所有二元组提取信息 0 或 1(二元组不存在或存在)。 然后,我计算出现次数最多的二元组。 等等 ... 我的问题是算法运行所需的时间。另一个问题:当超过 10000 NGram 时,R 就会达到最大容量。这是显而易见的,因为 50000*10000 的矩阵很大。 我需要你的想法来优化算法或改变它。谢谢。

最佳答案

使用此方法尝试 quanteda 包。如果您只需要标记化文本,请将 dfm( 替换为 tokenize(

非常有兴趣了解它如何在您的 50,000 个街道地址上发挥作用。我们投入了大量精力来使 dfm() 变得非常快速和强大。

myDfm <- dfm(c("1780 wemmel", "2015 schlemmel"), what = "character", 
             ngram = 1:5, concatenator = "", 
             removePunct = FALSE, removeNumbers = FALSE, 
             removeSeparators = FALSE, verbose = FALSE)
t(myDfm) # for easier viewing
#         docs
# features text1 text2
#           1     1
# s         0     1
# sc        0     1
# sch       0     1
# schl      0     1
# w         1     0
# we        1     0
# wem       1     0
# wemm      1     0
# 0         1     1
# 0         1     0
# 0 w       1     0
# 0 we      1     0
# 0 wem     1     0
# 01        0     1
# 015       0     1
# 015       0     1
# 015 s     0     1
# 1         1     1
# 15        0     1
# 15        0     1
# 15 s      0     1
# 15 sc     0     1
# 17        1     0
# 178       1     0
# 1780      1     0
# 1780      1     0
# 2         0     1
# 20        0     1
# 201       0     1
# 2015      0     1
# 2015      0     1
# 5         0     1
# 5         0     1
# 5 s       0     1
# 5 sc      0     1
# 5 sch     0     1
# 7         1     0
# 78        1     0
# 780       1     0
# 780       1     0
# 780 w     1     0
# 8         1     0
# 80        1     0
# 80        1     0
# 80 w      1     0
# 80 we     1     0
# c         0     1
# ch        0     1
# chl       0     1
# chle      0     1
# chlem     0     1
# e         2     2
# el        1     1
# em        1     1
# emm       1     1
# emme      1     1
# emmel     1     1
# h         0     1
# hl        0     1
# hle       0     1
# hlem      0     1
# hlemm     0     1
# l         1     2
# le        0     1
# lem       0     1
# lemm      0     1
# lemme     0     1
# m         2     2
# me        1     1
# mel       1     1
# mm        1     1
# mme       1     1
# mmel      1     1
# s         0     1
# sc        0     1
# sch       0     1
# schl      0     1
# schle     0     1
# w         1     0
# we        1     0
# wem       1     0
# wemm      1     0
# wemme     1     0

关于r - 使用 R 进行 CPU 和内存高效的 NGram 提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31424687/

相关文章:

r - SparkR 中的“最后一个”函数

r - 如何使用 data.table 和 lubridate 更快地按组计算(日期)排名?

具有重复项的非数字列的 R 求和值

performance - Rcpp中有没有优化功能

python - 将 scikit-learn TfIdf 与 gensim LDA 结合使用

r - Shiny :使日期和时间在选择输入中按预期显示

java - 如何从 Java 高效地将 For 循环(700,000 行)内容写入文件?

performance - 使用实例化渲染时,opengl 出现奇怪的减速

R:带有 ngram 标记器和字典的 dtm 在 Ubuntu 中损坏?

r - 在R中的Wordcloud中将所有单词大写