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

如何获取每行开头含词汇表的最终embeddings文件及为其添加词汇表?

我来帮你逐个解答这两个问题:

问题1:如何获取每行开头包含词汇表的最终embeddings文件?

这种格式是预训练词向量的标准输出形式(比如Google官方Word2Vec的输出格式),具体获取方式分两种场景:

场景1:从训练流程直接生成

如果是自己训练词向量,不管用gensim还是自定义训练逻辑,都可以直接生成带词汇的embeddings文件:

  • 用gensim的Word2Vec为例,训练完成后执行以下代码,生成的txt文件就是每行开头是词汇、后面跟着对应向量的格式:
from gensim.models import Word2Vec

# 假设model是训练好的Word2Vec模型
model.wv.save_word2vec_format('your_embeddings.txt', binary=False)
  • 如果是自定义训练流程,只要在保存时把词汇和对应向量按顺序拼接即可:
# 假设vocab是词汇列表,embeddings是形状为(词汇数, 向量维度)的numpy数组
with open('output_embeddings.txt', 'w', encoding='utf-8') as f:
    # 可选:第一行写入词汇总数+向量维度(和Google格式对齐)
    f.write(f"{len(vocab)} {embeddings.shape[1]}\n")
    for word, vec in zip(vocab, embeddings):
        # 保留6位小数,和常见预训练向量格式一致
        vec_str = ' '.join(map(lambda x: f"{x:.6f}", vec))
        f.write(f"{word} {vec_str}\n")

场景2:合并已有的词汇表和embeddings文件

如果你的词汇表(每行一个词)和纯向量文件(每行对应一个向量)是分开的,且两者顺序严格对应,可以用简单脚本合并:

# 读取词汇表和纯向量文件
with open('vocab.txt', 'r', encoding='utf-8') as f_vocab:
    vocab = [line.strip() for line in f_vocab if line.strip()]
with open('embeddings_only.txt', 'r', encoding='utf-8') as f_emb:
    emb_lines = [line.strip() for line in f_emb if line.strip()]

# 合并写入
with open('merged_embeddings.txt', 'w', encoding='utf-8') as f_out:
    # 写入头信息
    f_out.write(f"{len(vocab)} {len(emb_lines[0].split())}\n")
    for word, emb_line in zip(vocab, emb_lines):
        f_out.write(f"{word} {emb_line}\n")

问题2:如何为embeddings添加词汇表,就像word2vec的Google C代码中实现的那样?

Google Word2Vec C代码的输出格式有几个核心特点:

  1. 第一行(可选但标准)是词汇总数和向量维度;
  2. 后续每行第一个元素是词汇,后面跟着向量分量,用单个空格分隔;
  3. 词汇无特殊符号(若有空格会被替换为下划线),向量保留固定小数位。

要实现这种格式,核心是确保词汇和向量的顺序严格对应,然后按规则写入:

具体步骤&示例代码

import numpy as np

# 假设你已准备好:
# vocab: 词汇列表,比如["cat", "dog", ...]
# embeddings: numpy数组,形状为(len(vocab), 300)(300是向量维度)

output_path = "google_style_embeddings.txt"

with open(output_path, 'w', encoding='utf-8') as f:
    # 写入头信息:词汇数 + 向量维度
    f.write(f"{len(vocab)} {embeddings.shape[1]}\n")
    # 逐行写入词汇和向量
    for word, vec in zip(vocab, embeddings):
        # 预处理词汇:把空格替换为下划线(和Google C代码逻辑一致)
        cleaned_word = word.replace(' ', '_')
        # 向量保留6位小数,转为字符串
        vec_str = ' '.join([f"{num:.6f}" for num in vec])
        f.write(f"{cleaned_word} {vec_str}\n")

注意事项

  • 如果词汇中有特殊字符(比如换行、制表符),建议提前清理,避免后续读取工具解析出错;
  • 确保embeddings的 dtype 是浮点数,避免输出整数或异常格式;
  • 若不需要头信息,可以去掉第一行的写入代码,但大多数向量读取工具会默认识别带头发信息的格式。

内容的提问来源于stack exchange,提问作者Bhushan Muthiyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:16:20