如何将数据框中字符串格式的词嵌入转换为数值向量并移除列表结构
词嵌入字符串转数值向量的解决方案
问题描述
原始数据框包含单词和以字符串形式存储的词嵌入,结构如下(实际嵌入维度更高):
word embedding A [-0.0052, 0.0117, -0.0122] B [-0.0026, 0.0123, -0.0140] C [-0.0137, -0.0014, 0.0028]
可复现的数据框结构:
df <- structure(list(word = c("A", "B", "C"), embedding = c("[-0.0052, 0.0117, -0.0122]", "[-0.0026, 0.0123, -0.0140]", "[-0.0137, -0.0014, 0.0028]"), row.names = c(NA, 3L), class = "data.frame"))
目标是将embedding列转换为可用于余弦相似度计算的数值向量,但尝试以下代码后,embedding仍为字符型列表结构:
df$embedding <- gsub("\\[|\\]", "", df$embedding) df <- df %>% rowwise %>% mutate(embedding = strsplit(embedding, split = ", "))#, # embedding = list(as.numeric(embedding)))
执行后的数据框结构:
> str(test2) rowwise_df [3 x 2] (S3: rowwise_df/tbl_df/tbl/data.frame) $ word : chr [1:3] "A" "B" "C" $ embedding:List of 3 ..$ : chr [1:3] "-0.0052" "0.0117" "-0.0122" ..$ : chr [1:3] "-0.0026" "0.0123" "-0.0140" ..$ : chr [1:3] "-0.0137" "-0.0014" "0.0028" - attr(*, "groups")= tibble [3 x 1] (S3: tbl_df/tbl/data.frame) ..$ .rows: list<int> [1:3] .. ..$ : int 1 .. ..$ : int 2 .. ..$ : int 3 .. ..@ ptype: int(0)
解决方案
方法1:修正dplyr流程
你注释掉的as.numeric转换需要正确嵌套到操作中,同时可以取消单独的gsub步骤,在rowwise上下文里一次性处理:
library(dplyr) df <- df %>% rowwise() %>% mutate( embedding = list(as.numeric(strsplit(gsub("\\[|\\]", "", embedding), ", ")[[1]])) ) %>% ungroup() # 解除行分组,避免后续操作受影响
处理后查看结构,embedding已转为数值型列表:
str(df) # 'data.frame': 3 obs. of 2 variables: # $ word : chr "A" "B" "C" # $ embedding:List of 3 # ..$ : num -0.0052 0.0117 -0.0122 # ..$ : num -0.0026 0.0123 -0.014 # ..$ : num -0.0137 -0.0014 0.0028
方法2:展开为多列(适用于低维嵌入)
如果需要将嵌入的每个维度拆分为单独列,可以用tidyr的separate_wider_delim自动完成分割和类型转换:
library(tidyr) library(dplyr) df_expanded <- df %>% mutate(embedding = gsub("\\[|\\]", "", embedding)) %>% separate_wider_delim( cols = embedding, delim = ", ", names_sep = "_", convert = TRUE # 自动转数值型 )
处理后的数据框:
word embedding_1 embedding_2 embedding_3 1 A -0.0052 0.0117 -0.0122 2 B -0.0026 0.0123 -0.0140 3 C -0.0137 -0.0014 0.0028
方法3:基础R实现
无需依赖tidyverse包,用lapply即可完成转换:
df$embedding <- lapply( gsub("\\[|\\]", "", df$embedding), function(x) as.numeric(strsplit(x, ", ")[[1]]) )
后续计算说明
- 余弦相似度计算:数值型列表可直接用于计算,比如自定义函数:
cos_sim <- function(v1, v2) { sum(v1 * v2) / (sqrt(sum(v1^2)) * sqrt(sum(v2^2))) } # 计算A和B的相似度 cos_sim(df$embedding[[1]], df$embedding[[2]])
- 批量计算相似度矩阵:将列表转为矩阵后,可批量计算两两相似度:
emb_matrix <- do.call(rbind, df$embedding) # 使用lsa包的cosine函数 library(lsa) sim_matrix <- cosine(emb_matrix)
内容的提问来源于stack exchange,提问作者diggi2395
相关产品推荐
相关产品推荐

