我在R中使用lsa包生成矩阵.创建矩阵后,我想计算矩阵中特定文档对(列)之间的余弦相似度.
目前,我使用嵌套的for循环执行此操作,并且速度非常慢.在下面的代码中,有150个sourceID和6413个targetID,总共961.950个比较.在我的数字碾压机上一个半小时后,它只能通过~300k.
有关详细信息,sourceID和targetID是列名称的向量,从包含这些名称的两个文件加载.我想在所有源 - >目标对之间应用余弦函数.列由文档名称索引,文档名称是字符串.
我确信使用apply有一个更快的方法,但是我无法绕过它.
library(lsa)
# tf function
real_tf <- function(m)
{
    return (sweep(m, MARGIN=2, apply(m, 2, max), "/"))
}
#idf function
real_idf <- function(m)
{
    df = rowSums(lw_bintf(m), na.rm=TRUE)
    return (log(ncol(m)/df))
}
#load corpus
lsa.documents <- textmatrix(args[1], minWordLength=1, minDocFreq=0)
# compute tf-idf
lsa.weighted_documents <- real_tf(lsa.documents) * real_idf(lsa.documents)
# compute svd
lsa.nspace <- lsa(lsa.weighted_documents, dims = as.integer(args[5]))
lsa.matrix <- diag(lsa.nspace$sk) %*% t(lsa.nspace$dk)
# compute …