如何用R的text包为bert-base-uncased添加专业词并修复PCA映射缺失
解决BERT拆分专业词的PCA映射问题
问题根源
bert-base-uncased的词汇表未收录mpi、mpirun这类专业术语,会将其拆分为子token(如mp+##i、mpi+##run)。textEmbed的aggregation_from_tokens_to_word_types参数仅对原始文本中存在的完整词(未被拆分的词)进行聚合,无法自动识别并聚合拆分后的子token对应原始专业词,导致这些词在PCA分析中返回NA。
解决步骤
1. 提取子token嵌入并手动聚合专业词
从模型输出中提取所有子token的嵌入,将属于同一专业词的子token嵌入取平均值,生成该词的整体嵌入:
# 提取所有子token及其嵌入向量 token_embeds <- we$tokens$texts # 定义目标专业词对应的子token(需根据实际分词结果调整) target_terms <- list( mpirun = c("mpi", "##run"), mpi = c("mp", "##i"), openmpi = c("open", "##mpi"), pbdmpi = c("pbd", "##mpi") ) # 手动聚合子token的嵌入向量 custom_word_embeds <- lapply(target_terms, function(tokens) { # 筛选对应子token的嵌入数据 subset_embeds <- token_embeds[token_embeds$tokens %in% tokens, -1] # 计算子token嵌入的平均值作为专业词的整体嵌入 colMeans(subset_embeds) }) # 转换为数据框并添加词名列 custom_df <- do.call(rbind, custom_word_embeds) %>% as.data.frame() %>% tibble::rownames_to_column("words") # 合并原有完整词的嵌入和自定义聚合的专业词嵌入 combined_embeds <- dplyr::bind_rows(we$word_types$texts, custom_df)
2. 基于合并后的嵌入执行PCA分析
将合并后的嵌入数据传入textPCA,即可包含所有目标专业词:
pca <- textPCA(words = c("R MPI mpirun Slurm SQL Python account login"), word_types_embeddings = combined_embeds) pca
3. 验证分词结果(可选)
如果不确定专业词的拆分形式,可以用textTokenize查看具体分词结果:
tokenized <- textTokenize(tx, model = 'bert-base-uncased') print(tokenized$texts)
根据输出调整target_terms中的子token列表即可。
内容的提问来源于stack exchange,提问作者George Ostrouchov
相关产品推荐
相关产品推荐

