Я пытаюсь вычислить сходство на основе матрицы терминов документа.
A <- data.frame(name = c(
"X-ray right leg arteries",
"x-ray left shoulder",
"x-ray leg arteries"
), stringsAsFactors = F)
B <- data.frame(name = c(
"X-ray left leg arteries",
"xray right leg",
"X-ray right leg arteries",
"x-ray leg with 20km distance"
), stringsAsFactors = F)
library(quanteda)
corp1 <- corpus(A, text_field = "name")
corp2 <- corpus(B, text_field = "name")
docnames(corp1) <- paste("A", seq_len(ndoc(corp1)), sep = ".")
docnames(corp2) <- paste("B", seq_len(ndoc(corp2)), sep = ".")
dtm3 <- rbind(dfm(corp1, ngrams=1), dfm(corp2, ngrams=1))
Есть ли более быстрый способ выполнить следующий расчет?Мне нужно сделать это на очень большой матрице.
# Similarity
m = matrix(nrow = length(docnames(corp1)), ncol = length(docnames(corp2)))
for (x in 1:length(docnames(corp1))) {
for (y in 1:length(docnames(corp2))) {
m[x,y] = sum(dtm3[x,] * dtm3[y+length(docnames(corp1)),]) / min(sum(dtm3[x,]) , sum(dtm3[y+length(docnames(corp1)),]))
}
}
rownames(m) = docnames(corp1)
colnames(m) = docnames(corp2)
m
Приведенный выше код выполняет эти вычисления -
sum(dtm3[1,] * dtm3[4,]) / min(sum(dtm3[1,]) , sum(dtm3[4,]))
sum(dtm3[1,] * dtm3[5,]) / min(sum(dtm3[1,]) , sum(dtm3[5,]))