【发布时间】:2019-05-02 23:51:19
【问题描述】:
我想加快下面的代码。有人能这么好心并提出一些建议吗?
library(dplyr)
library(fuzzywuzzyR)
set.seed(42)
rm(list = ls())
options(scipen = 999)
init = FuzzMatcher$new()
data <- data.frame(string = c("hello world", "hello vorld", "hello world 1", "hello world", "hello world hello world"))
data$string <- as.character(data$string)
distance_function <- function(string_1, string_2) {
init$Token_set_ratio(string1 = string_1, string2 = string_2)
}
combinations <- combn(nrow(data), 2)
distances <- matrix(, nrow = 1, ncol = ncol(combinations))
distance_matrix <- matrix(NA, nrow = nrow(data), ncol = nrow(data), dimnames = list(data$string, data$string))
for (i in 1:ncol(combinations)) {
distance <- distance_function(data[combinations[1, i], 1], data[combinations[2, i], 1])
#print(data[combinations[1, i], 1])
#print(data[combinations[2, i], 1])
#print(distance)
distance_matrix[combinations[1, i], combinations[2, i]] <- distance
distance_matrix[combinations[2, i], combinations[1, i]] <- distance
}
distance_matrix
顺便说一句,我尝试使用 proxy::dist 和其他各种方法都没有成功。我也不认为字符串距离函数按预期工作,但这是另一回事。
最终,我想使用距离矩阵来执行一些聚类来对相似的字符串进行分组(与词序无关)。
【问题讨论】:
-
您能否介绍一下需要更多时间的地方。如果是
distance_function需要更多时间,那么当前设置会很困难 -
不确定如何执行此操作,但也许循环可以更改为应用?抱歉还是个R处女
-
您可以使用
profvis。检查here -
谢谢 - 很高兴知道 - 会试一试,但不确定这是否仅适用于我不使用的 r studio ...
-
如果
proxy::dist对您来说仍然太慢,那么您可能必须在 C 或 C++ 中实现自己的函数。我最近展示了一个使用地理距离的example with multi-threading,但您可以调整它以支持字符串并输出完整的矩阵。还要检查this example。
标签: r