TensorFlow中如何遍历张量实现嵌入查找并计算用户平均词嵌入?
生成用户平均词嵌入Tensor的解决方案
嘿,我来帮你搞定这个需求!你想要的是每个用户对应词向量的平均嵌入,最终生成的Tensor形状应该是 (N, 100) ——其中N是用户总数,100正好匹配你嵌入矩阵的列数。下面我分步骤给你讲清楚怎么做,再附上代码示例。
核心思路
- 字符串转索引:因为你的
user_words里是字符串形式的词,得先转换成嵌入矩阵对应的整数索引(你需要一个词到索引的映射字典,比如word_to_idx)。 - 提取对应嵌入:根据索引从
word_emb里取出每个词的嵌入向量。 - 计算平均嵌入:对每个用户的所有词嵌入求均值,得到该用户的代表向量。
- 堆叠成最终Tensor:把所有用户的平均向量堆叠起来,就得到了目标形状的Tensor。
PyTorch实现示例
import torch # 假设你已经有词到索引的映射字典 word_to_idx = {'20': 0, '56': 1, '58': 2, '10': 3, '105': 4} # 示例嵌入矩阵,形状为[词汇表大小, 100] word_emb = torch.randn(5, 100) # 你的用户词列表 user_words = [['20','56'],['58','10','105']] # 初始化存储用户平均嵌入的列表 user_avg_embs = [] for words in user_words: # 将当前用户的词转成索引张量 indices = torch.tensor([word_to_idx[w] for w in words]) # 从嵌入矩阵中提取对应的词向量 word_vectors = word_emb[indices] # 对词向量求平均(dim=0表示沿着词的维度计算均值) avg_vector = word_vectors.mean(dim=0) user_avg_embs.append(avg_vector) # 堆叠所有用户的平均向量,得到最终Tensor final_user_embs = torch.stack(user_avg_embs) print(final_user_embs.shape) # 输出: torch.Size([2, 100])
TensorFlow实现示例
如果你用TensorFlow,思路完全一致,代码如下:
import tensorflow as tf word_to_idx = {'20': 0, '56': 1, '58': 2, '10': 3, '105': 4} word_emb = tf.random.normal((5, 100)) user_words = [['20','56'],['58','10','105']] user_avg_embs = [] for words in user_words: indices = tf.convert_to_tensor([word_to_idx[w] for w in words], dtype=tf.int32) # 用tf.gather提取对应嵌入 word_vectors = tf.gather(word_emb, indices) avg_vector = tf.reduce_mean(word_vectors, axis=0) user_avg_embs.append(avg_vector) final_user_embs = tf.stack(user_avg_embs) print(final_user_embs.shape) # 输出: (2, 100)
额外处理:空词列表的情况
如果存在用户没有任何词(空列表),可以给这类用户分配一个默认向量(比如零向量),避免报错:
# PyTorch版本的空列表处理 for words in user_words: if not words: # 用零向量作为默认值 avg_vector = torch.zeros(100) else: indices = torch.tensor([word_to_idx[w] for w in words]) word_vectors = word_emb[indices] avg_vector = word_vectors.mean(dim=0) user_avg_embs.append(avg_vector)
内容的提问来源于stack exchange,提问作者user3490622
相关产品推荐
相关产品推荐

