计算文档术语矩阵的某些行之间的距离

时间:2019-09-11 16:39:13

标签: r

滚动到底部的“解决方案”。

我提供了一个尝试的解决方案,如果有人可以检查我的理智,那就太好了!

我有一个dtm,看起来像以下内容:

110471_10-K_2006     . 1 . 1 . . . . . . . . . . . 1 1 . . 1
907687_10-K_2005     . . . . . . . . . . 1 . . . . . . . . .
907687_10-K_2006     . . . . . . . . . 1 . . . . . . . . . .
1018979_10-K_2006    . . . . 1 . 1 . . . . 1 . 1 1 . . 1 . .
936395_10-K_2006     1 . 1 . . 1 . . . . . . 1 . . . . . 1 .
930236_10-K_2005     . . . . . . . . . . . . . . . . . . . .
930236_10-K/A_2005   . . . . . . . . . . . . . . . . . . . .
930236_10-K/A_2005.1 . . . . . . . . . . . . . . . . . . . .
930236_10-K_2006     . . . . . . . . . . . . . . . . . . . .
706015_10-K_2005     . . . . . . . . . . . . . . . . . . . .
706015_10-K_2006     . . . . . . . . . . . . . . . . . . . .
1172052_10-K_2005    . . . . . . . . . . . . . . . . . . . .
1172052_10-K_2006    . . . . . . . . . . . . . . . . . . . .
928373_10-K_2006     . . . . . . . . . . . . . . . . . . . .
928373_10-K/A_2006   . . . . . . . . . . . . . . . . . . . .
1047537_10-K_2005    . . . . . . . . . . . . . . . . . . . .
1047537_10-K_2006    . . . . . . . . 1 . . . . . . . . . . .
1012271_10-K_2005    . . . . . . . . . . . . . . . . . . . .
1012271_10-K_2006    . . . . . . . 1 . . . . . . . . . . . .

我可以使用cosine计算dtm之间的dist2(dtm, dtm, method = "cosine", norm = 'none')距离,但是这在计算上是昂贵的,并且我不需要所有结果-只是某些结果。我还有以下称为ids_to_match

      cikYear_t_minus_1            cikYear_t
1      110471_10-K_2006     110471_10-K_2007
2      907687_10-K_2005     907687_10-K_2006
3      907687_10-K_2006     907687_10-K_2007
4     1018979_10-K_2006    1018979_10-K_2007
5      936395_10-K_2006     936395_10-K_2007
6      930236_10-K_2005     930236_10-K_2006
7    930236_10-K/A_2005   930236_10-K/A_2006
8  930236_10-K/A_2005.1 930236_10-K/A_2006.1
9      930236_10-K_2006     930236_10-K_2007
10     706015_10-K_2005     706015_10-K_2006
11     706015_10-K_2006     706015_10-K_2007
12    1172052_10-K_2005    1172052_10-K_2006
13    1172052_10-K_2006    1172052_10-K_2007
14     928373_10-K_2006     928373_10-K_2007
15   928373_10-K/A_2006   928373_10-K/A_2007
16    1047537_10-K_2005    1047537_10-K_2006
17    1047537_10-K_2006    1047537_10-K_2007
18    1012271_10-K_2005    1012271_10-K_2006
19    1012271_10-K_2006    1012271_10-K_2007

我想计算ids_to_matchdtm中成对存在的两列之间的余弦距离。在ids_to_match的第一行中,有以下行:110471_10-K_2006 110471_10-K_2007,其中110471_10-K_2006存在于row 1的{​​{1}}中,但是dtm不存在110471_10-K_2007,因此不会计算余弦距离。

dtm数据集中的row 2中,有一行:ids_to_match,可以在907687_10-K_2005 907687_10-K_2006的{​​{1}}和row 2中找到。因此,我想计算这两行之间的余弦距离。 row 3

dtm-dist2(dtm["row2"], dtm["row3"], method = "cosine", norm = 'none')中的row 12,应与ids_to_match矩阵的1172052_10-K_2005 1172052_10-K_2006row 12匹配

感谢您的帮助!

数据:

row 13

匹配ID:

dtm

编辑:(“解决方案是错误的”)-我刚刚想通了。

我想我找到了一个解决方案,但是它看起来很乱,所以有时我很可能会出错。

我首先要在 dtm <- new("dgCMatrix", i = c(4L, 0L, 4L, 0L, 3L, 4L, 3L, 18L, 16L, 2L, 1L, 3L, 4L, 3L, 3L, 0L, 0L, 3L, 4L, 0L), p = 0:20, Dim = 19:20, Dimnames = list(c("110471_10-K_2006", "907687_10-K_2005", "907687_10-K_2006", "1018979_10-K_2006", "936395_10-K_2006", "930236_10-K_2005", "930236_10-K/A_2005", "930236_10-K/A_2005.1", "930236_10-K_2006", "706015_10-K_2005", "706015_10-K_2006", "1172052_10-K_2005", "1172052_10-K_2006", "928373_10-K_2006", "928373_10-K/A_2006", "1047537_10-K_2005", "1047537_10-K_2006", "1012271_10-K_2005", "1012271_10-K_2006"), c("spares", "warrior", "akara", "dissipating", "mechanized", "modular", "syndicate", "wind", "trades", "neural", "gao", "interfaced", "confronted", "harrington", "forwarded", "restaurant", "switzerland", "incomplete", "writes", "hushpuppies")), x = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), factors = list()) 中找到行“ ids”,在ids_to_match <- structure(list(cikYear_t_minus_1 = c("110471_10-K_2006", "907687_10-K_2005", "907687_10-K_2006", "1018979_10-K_2006", "936395_10-K_2006", "930236_10-K_2005", "930236_10-K/A_2005", "930236_10-K/A_2005.1", "930236_10-K_2006", "706015_10-K_2005", "706015_10-K_2006", "1172052_10-K_2005", "1172052_10-K_2006", "928373_10-K_2006", "928373_10-K/A_2006", "1047537_10-K_2005", "1047537_10-K_2006", "1012271_10-K_2005", "1012271_10-K_2006"), cikYear_t = c("110471_10-K_2007", "907687_10-K_2006", "907687_10-K_2007", "1018979_10-K_2007", "936395_10-K_2007", "930236_10-K_2006", "930236_10-K/A_2006", "930236_10-K/A_2006.1", "930236_10-K_2007", "706015_10-K_2006", "706015_10-K_2007", "1172052_10-K_2006", "1172052_10-K_2007", "928373_10-K_2007", "928373_10-K/A_2007", "1047537_10-K_2006", "1047537_10-K_2007", "1012271_10-K_2006", "1012271_10-K_2007")), class = "data.frame", row.names = c(NA, -19L)) dtm中有匹配的观察值,所以我写了两行ids_to_get和{ {1}}给出以下输出。

rownames(dtm)

现在我将match_1match_2作为匹配项,并将> match_1 cikYear_t_minus_1 2 907687_10-K_2005 6 930236_10-K_2005 10 706015_10-K_2005 12 1172052_10-K_2005 16 1047537_10-K_2005 18 1012271_10-K_2005 > match_2 cikYear_t_minus_1 3 907687_10-K_2006 9 930236_10-K_2006 11 706015_10-K_2006 13 1172052_10-K_2006 17 1047537_10-K_2006 19 1012271_10-K_2006 2作为另一个匹配项,等等。我创建了一个Matix,如下所示:

3

现在我可以计算出6矩阵,其输出为:

9

尝试的解决方案:

> matching
     [,1] [,2]
[1,]    2    3
[2,]    6    9
[3,]   10   11
[4,]   12   13
[5,]   16   17
[6,]   18   19

0 个答案:

没有答案