r - 有没有比 R 中更有效的方法来进行成对比较?
问题描述
我正在使用一个函数来比较列表中每个项目的相似性,如下所示:
sim.items <- outer(items, items, similarity.function)
该列表长约 11,000 项,自然而然,即使在 Macbook Pro、2.4 GHz 8 核、32GB RAM 上也运行了数小时。除了优化相似度函数本身之外,是否有更有效的方法来成对比较项目以生成相似度矩阵(使用我的自定义相似度函数)?我应该完全放弃我的方法吗?
library(tidyverse)
get_all_ngrams <- function(x, N = 3){
l <- length(x) - N + 1
stopifnot(l > 0)
map_df(1:l, function(i){
ngram <- x[i:(i + N - 1)]
tibble(start = i, N = N, value = paste(ngram, collapse = ","))
})
}
similarity.function <- function(x, y, N = 3){
x <- get_all_ngrams(x, N = N) %>% pull(value)
y <- get_all_ngrams(y, N = N) %>% pull(value)
joint <- c(x, y) %>% table()
tx <- factor(x, levels = names(joint)) %>% table()
ty <- factor(y, levels = names(joint)) %>% table()
1 - sum(abs(tx - ty))/(length(x) + length(y))
}
解决方案
我们可以用combn
combn(items, 2, FUN = function(x) similarity.function(x[1], x[2]),
simplify = FALSE)
推荐阅读
- javascript - 我正在尝试解析地图功能中的数据
- c++ - 如何在c ++中生成范围有限的字符串的哈希码?
- python - 对两个黑白图像进行异或运算和求和
- c# - 如何获取具有长路径(> 256)的父目录的子目录列表?
- javascript - CSS中是否有最小可能的大小变化?
- bash - 使用 bash 在文本中查找前 10 个最常见的 2 个单词序列
- amazon-ecs - 具有 ec2 计数的 ECS 自动扩展集群
- excel - VBA - 如何将变量输出到excel中的特定行和列?
- hive - 使用数组查询配置单元表
> 类型 - python - OSError: [Errno 9] 使用 PIL 保存图像时文件描述符错误