У меня есть данные, которые выглядят примерно так:
Docs annual appendix attach begin caption contain exhibit forth head
12355_2015 0.1385056 0.0000000 0.0000000 0.3203238 0.0000000 0.3203238 0.0000000 0.0000000 0.0000000
29905_2015 0.1269635 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.3769635 0.3769635 0.0000000
51143_2015 0.1385056 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
78003_2015 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.3265111
875570_2015 0.0000000 0.5872603 0.5872603 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
885639_2015 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1166691_2015 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
12355_2016 0.1385056 0.0000000 0.0000000 0.3203238 0.0000000 0.3203238 0.0000000 0.0000000 0.0000000
51143_2016 0.1385056 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
78003_2016 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.3265111
875570_2016 0.0000000 0.5872603 0.5872603 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1166691_2016 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1341439_2016 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
51143_2017 0.1385056 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
315189_2017 0.0000000 0.0000000 0.0000000 0.0000000 0.5872603 0.0000000 0.0000000 0.0000000 0.0000000
773910_2017 0.1904452 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1166691_2017 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1341439_2017 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
51143_2018 0.1385056 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
78003_2018 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.3265111
315189_2018 0.0000000 0.0000000 0.0000000 0.0000000 0.5872603 0.0000000 0.0000000 0.0000000 0.0000000
1166691_2018 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
rownames
имеют IDs
и Years
. Я хочу рассчитать косинусное расстояние между каждым годом и предыдущим годом. Это год t
и t-1
для каждого идентификатора. Например, беря косинусное расстояние между строками 12355_2015
и 12355_2016
.
Я могу вычислить косинусное расстояние для некоторых строк, используя
proxy::dist(dtms_matrix[1:3,], dtms_matrix[4:6,], pairwise=TRUE, method="cosine")
Однако это неправильно, так как я вычисляю равное расстояние между наблюдениями 1:3
- 12355_2015, 29905_2015, 51143_2015
и наблюдениями 4:6
- 78003_2015, 875570_2015, 885639_2015
Я пытаюсь вычислить косинус-подобие между каждым IDs
годом, если он существует (не всегда он существует)
Я могу "попытаться" вычислить косинусное расстояние для всех строк, используя
proxy::dist(dtms_matrix[1:7,], dtms_matrix[8:13,],dtms_matrix[14:18,],dtms_matrix[19:23,], pairwise=TRUE, method="cosine")
Со следующей ошибкой;
Error in do.call(".Call", c(list(method), list(x), list(y), pairwise, :
invalid number of rows for pairwise mode
Что, я думаю, сводится к тому, что некоторые "документы" отсутствуют в течение нескольких лет ...
Я могу вычислить полную матрицу, используя;
dist.matrix = proxy::dist(dtms_matrix, method = "cosine")
и у меня есть способы извлечь соответствующую информацию, однако мои данные очень велики, и я не заинтересован в расчете косинусного расстояния между всеми документами / годом, поскольку документы разные - меня не интересует результат косинуса - 875570_2015
и 1166691_2016
например. (Меня интересует только вычисление расстояния между 875570_2015
и 875570_2016
или 1166691_2015
и 1166691_2016
.
Мой текущий метод создает фрейм данных для фильтрации / извлечения информации с помощью матрицы 8000 * 8000
= 64 миллионов результатов (99,99% бесполезно).
Если у вас есть идея, как эффективно рассчитать парное сходство для документов t
и t-1
и сохранить важную информацию об именах строк и столбцов, пожалуйста, сообщите мне.

Данные:
dtms_matrix <- structure(c(0.138505632368819, 0.126963496338084, 0.138505632368819,
0, 0, 0, 0, 0.138505632368819, 0.138505632368819, 0, 0, 0, 0,
0.138505632368819, 0, 0.190445244507127, 0, 0, 0.138505632368819,
0, 0, 0, 0, 0, 0, 0, 0, 0.587260326009502, 0, 0, 0, 0, 0, 0.587260326009502,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.587260326009502,
0, 0, 0, 0, 0, 0.587260326009502, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0.320323814187001, 0, 0, 0, 0, 0, 0, 0.320323814187001,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0.587260326009502, 0, 0, 0, 0, 0, 0.587260326009502,
0, 0, 0.320323814187001, 0, 0, 0, 0, 0, 0, 0.320323814187001,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.376963496338084,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0.376963496338084, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.326511050592873, 0, 0, 0,
0, 0, 0.326511050592873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.326511050592873,
0, 0, 0, 0.176236314121442, 0, 0.176236314121442, 0, 0, 0, 0,
0.176236314121442, 0.176236314121442, 0, 0, 0, 0, 0.176236314121442,
0, 0, 0, 0, 0.176236314121442, 0, 0, 0, 0, 0, 0, 0.22941472327791,
0, 0, 0, 0, 0, 0.22941472327791, 0, 0, 0, 0, 0.22941472327791,
0, 0, 0, 0, 0.22941472327791, 0, 0, 0, 0, 0.0967391215836105,
0.0886775281183096, 0.0967391215836105, 0.118236704157746, 0,
0, 0, 0.0967391215836105, 0.0967391215836105, 0.118236704157746,
0, 0, 0, 0.0967391215836105, 0, 0.133016292177464, 0, 0, 0.0967391215836105,
0.118236704157746, 0, 0, 0, 0.109239441924514, 0.100136155097471,
0, 0.133514873463294, 0.200272310194942, 0, 0, 0.109239441924514,
0, 0.133514873463294, 0.200272310194942, 0, 0, 0, 0.200272310194942,
0, 0, 0, 0, 0.133514873463294, 0.200272310194942, 0, 0, 0.320323814187001,
0, 0, 0, 0, 0, 0, 0.320323814187001, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0.210296829671418, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0.420593659342835, 0, 0, 0, 0, 0.420593659342835,
0, 0, 0, 0, 0.420593659342835, 0, 0, 0.176236314121442, 0, 0,
0, 0, 0, 0.176236314121442, 0, 0, 0, 0, 0.176236314121442, 0.323099909222643,
0, 0, 0, 0.176236314121442, 0, 0.323099909222643, 0, 0, 0.0967391215836105,
0.0886775281183096, 0.193478243167221, 0.118236704157746, 0,
0, 0, 0.0967391215836105, 0.193478243167221, 0.118236704157746,
0, 0, 0, 0.193478243167221, 0, 0.133016292177464, 0, 0, 0.193478243167221,
0.118236704157746, 0, 0, 0, 0.0967391215836105, 0.0886775281183096,
0.0967391215836105, 0.118236704157746, 0, 0, 0, 0.0967391215836105,
0.0967391215836105, 0.118236704157746, 0, 0, 0, 0.0967391215836105,
0, 0.133016292177464, 0, 0, 0.0967391215836105, 0.118236704157746,
0, 0, 0, 0, 0, 0, 0.244625984574406, 0.366938976861608, 0, 0,
0, 0, 0.244625984574406, 0.366938976861608, 0, 0, 0, 0, 0, 0,
0, 0, 0.244625984574406, 0, 0, 0, 0, 0, 0, 0.326511050592873,
0, 0, 0, 0, 0, 0.326511050592873, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0.326511050592873, 0, 0, 0, 0, 0.376963496338084, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0.4512123182049, 0, 0, 0, 0, 0.4512123182049, 0.22560615910245,
0, 0.22560615910245, 0, 0.4512123182049, 0.22560615910245, 0,
0, 0.22560615910245, 0.4512123182049, 0.22560615910245, 0, 0.376963496338084,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0.22941472327791, 0, 0, 0, 0, 0, 0.22941472327791, 0, 0,
0, 0, 0.22941472327791, 0, 0, 0, 0, 0.22941472327791, 0, 0, 0,
0), .Dim = 23:24, .Dimnames = list(Docs = c("12355_2015", "29905_2015",
"51143_2015", "78003_2015", "875570_2015", "885639_2015", "1166691_2015",
"12355_2016", "51143_2016", "78003_2016", "875570_2016", "1166691_2016",
"1341439_2016", "51143_2017", "315189_2017", "773910_2017", "1166691_2017",
"1341439_2017", "51143_2018", "78003_2018", "315189_2018", "1166691_2018",
"1341439_2018"), Terms = c("annual", "appendix", "attach", "begin",
"caption", "contain", "exhibit", "forth", "head", "herein", "ibm",
"incorpor", "inform", "mda", "page", "pages", "refer", "report",
"requir", "review", "section", "see", "set", "stockhold")))
РЕДАКТИРОВАТЬ: Пользовательская функция для измерения косинуса сходства между двумя текстами
cos_text <- function(x,y)
{
library(qdapDictionaries)
x <- unlist(str_extract_all(x, "\\w+"))
y <- unlist(str_extract_all(y, "\\w+"))
x <- x[x %in% GradyAugmented]
y <- y[y %in% GradyAugmented]
if(length(x) == 0) return(NA)
if(length(y) == 0) return(NA)
table_x <- as.data.frame(table(x))
table_y <- as.data.frame(table(y))
data_frame <- NULL
data_frame$vocab <- unique(sort(c(x,y)))
data_frame <- as.data.frame(data_frame)
match <- match(data_frame$vocab, table_x$x)
data_frame$x <- table_x$Freq[match]
data_frame$x[is.na(match)] <- 0
match <- match(data_frame$vocab, table_y$y)
data_frame$y <- table_y$Freq[match]
data_frame$y[is.na(match)] <- 0
norm <- function(v)
{
return(sqrt(sum(v^2)))
}
cos <- sum(data_frame$x*data_frame$y)/norm(data_frame$x)/norm(data_frame$y)
return(cos)
}
cos_text(string1, string2)