在R中基于GloVe训练词嵌入并计算词余弦距离的可行性与实现
基于自有小型语料训练GloVe并计算词间余弦距离
核心问题回应
针对你的需求:基于30篇政治声明文本训练GloVe模型并计算词间余弦距离,以下是具体分析和后续步骤:
一、30篇文本训练GloVe的可行性
仅30篇文本很难训练出高质量的词嵌入,核心原因:
- 语料规模不足:词嵌入依赖大量词共现统计信息,30篇文本的共现模式过于有限,无法支撑模型学习稳定的语义表征;
- 主题单一:政治声明的词汇场景集中,词汇间语义关联的多样性不足,训练出的嵌入泛化能力极弱;
- 词频稀疏:即使总词元有40000,单篇文本的词重复率低,修剪低频词后有效词汇量进一步缩减,模型容易过拟合。
如果必须用现有语料,可尝试参数优化:
- 降低嵌入维度(如从300调整为50-100),减少模型复杂度;
- 缩小skipgram窗口(如2-3),聚焦更紧密的词共现关系;
- 适当增加迭代次数(30-50次),同时监控收敛阈值,避免过拟合。
二、已完成代码梳理(你的现有流程)
你已经完成了GloVe训练的核心步骤,代码整理如下:
1. 数据概览
summary(df)
输出:
text: Length Class Mode
30 character characteryearInGov: Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.000 3.000 3.867 5.750 11.000party: Length Class Mode
30 character characterspeaker: Length Class Mode
30 character character
2. 构建语料迭代器与词汇表
it <- itoken(df$budgetTextClean, tokenizer = word_tokenizer, ids = df$speaker, progressbar = TRUE) vocab <- create_vocabulary(it) # 使用单字词
3. 修剪低频词
vocab <- prune_vocabulary(vocab, term_count_min = 3)
4. 创建词共现矩阵(TCM)
print(vocab) vectorizer <- vocab_vectorizer(vocab) tcm <- create_tcm(it, vectorizer, skip_grams_window = 5L) # 窗口大小5的对称skipgram
5. 模型训练与嵌入合并
# 设置权重函数的最大共现次数 x_max <- length(vocab$doc_count)/100 # 初始化并拟合GloVe模型 glove_model <- GloVe$new(rank = 300, x_max = 10) glove_embedding <- glove_model$fit_transform(tcm, n_iter = 20, convergence_tol = 0.01, n_threads = 4) # 合并主嵌入与上下文嵌入 glove_embedding = glove_embedding + t(glove_model$components) # 转置上下文矩阵后求和
三、计算词间余弦距离的具体步骤
基于训练好的glove_embedding矩阵,可通过两种方式计算余弦距离:
方法1:使用proxy包(高效便捷)
library(proxy) # 计算余弦相似度矩阵,转换为距离(1 - 相似度) cos_sim <- proxy::simil(glove_embedding, method = "cosine") cos_dist <- as.dist(1 - cos_sim) # 示例:查找与"tax"最相似的5个词 tax_idx <- which(rownames(glove_embedding) == "tax") closest_words_idx <- order(cos_dist[tax_idx, ])[2:6] # 排除词自身 rownames(glove_embedding)[closest_words_idx]
方法2:手动实现余弦相似度
# 定义余弦相似度函数 cosine_similarity <- function(vec_a, vec_b) { sum(vec_a * vec_b) / (sqrt(sum(vec_a^2)) * sqrt(sum(vec_b^2))) } # 计算两个指定词的余弦距离 word1 <- "tax" word2 <- "spending" vec1 <- glove_embedding[word1, ] vec2 <- glove_embedding[word2, ] cosine_distance <- 1 - cosine_similarity(vec1, vec2)
内容的提问来源于stack exchange,提问作者Ruth
相关产品推荐
相关产品推荐

