You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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 character

yearInGov: Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.000 3.000 3.867 5.750 11.000

party: Length Class Mode
30 character character

speaker: 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:15:57