R语言中.[rep(token, nrow(.)), ]代码含义及widely()运行差异解析
关于Julia Silge词嵌入最近邻R代码的疑问解答
核心问题解析
你提到的y <- .[rep(token, nrow(.)), ]这行代码,单独执行会出现大量NA,但在widely()函数内正常运行,核心原因是**widely()函数内部会将输入的长格式数据转换为宽矩阵**,而你直接在tidy_pmi(长格式数据框)上执行这行代码时,数据结构不匹配导致NA。
为什么在widely()里能正常运行?
widely()是widyr包的函数,它会自动把长格式的tidy数据转换为宽矩阵:行对应item1(即词汇),列对应dimension(词嵌入维度),单元格值为value(嵌入数值)。因此在widely()的匿名函数中,.指代的是这个宽矩阵,而非原始的长数据框。
这行代码的实际作用是:
- 提取目标词
token对应的那一行嵌入向量 - 将该向量重复
nrow(.)次(与矩阵行数一致),生成一个和原矩阵维度完全相同的矩阵,这样就能和原矩阵进行逐元素相乘(对应余弦相似度计算的分子部分)
单独执行出现NA的原因
你直接在tidy_pmi(长格式,每行仅包含一个词汇、一个维度及对应值)上执行tidy_pmi %>% .[rep("πρότερος", nrow(.)), ]时,本质是用字符向量作为行索引取行,但长数据框的行索引是整数,字符索引无法匹配到对应行,因此返回大量NA。
替代写法
可以把这行代码改成更直观的形式,避免依赖重复索引的技巧,效果和原代码完全一致:
# 替代写法1:提取目标行后按行数重复生成矩阵 y <- matrix(.[token, ], nrow = nrow(.), ncol = ncol(.), byrow = TRUE) # 替代写法2:利用行索引重复实现广播 y <- .[token, ][rep(1, nrow(.)), ]
内容的提问来源于stack exchange,提问作者LocusClassicus
相关产品推荐
相关产品推荐

