Я хочу рассчитать косинус-расстояние между авторами корпуса. Давайте возьмем корпус из 20 документов.
require(tm)
data("crude")
length(crude)
# [1] 20
Я хочу узнать расстояние между косинусами (сходство) среди этих 20 документов. Я создаю матрицу term-document с
tdm <- TermDocumentMatrix(crude,
control = list(removePunctuation = TRUE,
stopwords = TRUE))
то я должен преобразовать его в матрицу, чтобы передать его в dist()
прокси-пакета
tdm <- as.matrix(tdm)
require(proxy)
cosine_dist_mat <- as.matrix(dist(t(tdm), method = "cosine"))
Наконец, я удаляю диагональ моей косинусной матрицы расстояния (поскольку меня не интересует расстояние между документом и собой) и вычисляет среднее расстояние между каждым документом и другим 19 документом корпуса
diag(cosine_dist_mat) <- NA
cosine_dist <- apply(cosine_dist_mat, 2, mean, na.rm=TRUE)
cosine_dist
# 127 144 191 194
# 0.6728505 0.6788326 0.7808791 0.8003223
# 211 236 237 242
# 0.8218699 0.6702084 0.8752164 0.7553570
# 246 248 273 349
# 0.8205872 0.6495110 0.7064158 0.7494145
# 352 353 368 489
# 0.6972964 0.7134836 0.8352642 0.7214411
# 502 543 704 708
# 0.7294907 0.7170188 0.8522494 0.8726240
До сих пор так хорошо (с небольшими корпусами). Проблема заключается в том, что этот метод недостаточно масштабируется для больших корпусов документов. На этот раз кажется неэффективным из-за двух вызовов as.matrix()
, чтобы передать tdm
из tm в прокси-сервер и, наконец, вычислить среднее значение.
Можно ли представить более разумный способ получить тот же результат?