预训练FastText日文维基模型向量与英文向量无法正常对齐问题
解决FastText日文维基词向量与英文Word2Vec对齐效果异常的问题
可能的原因
- 向量尺度不统一:Google News Word2Vec、通用爬虫FastText向量均已做L2归一化(模长<1),但日文维基FastText向量未归一化(模长>1)。正交Procrustes变换对向量尺度敏感,未归一化的向量会导致变换矩阵计算偏差,直接拉低对齐后的相似度。
- .bin向量提取错误:FastText的.bin文件包含完整模型参数(含子词信息),而.txt文件是导出的归一化词向量。若手动解析.bin文件时未处理模型内置的归一化逻辑,会拿到未经过最终调整的原始向量,导致.bin与.txt版本向量不一致。
解决方案
1. 对齐前统一归一化所有向量
先对所有向量做L2归一化,确保尺度一致后再执行Procrustes变换:
import numpy as np from numpy.linalg import norm from scipy.linalg import orthogonal_procrustes # 归一化英文向量 normalized_eng = english_vectors / norm(english_vectors, axis=1, keepdims=True) # 归一化日文维基向量 normalized_jpn_wiki = japanese_wiki_vectors / norm(japanese_wiki_vectors, axis=1, keepdims=True) # 计算变换矩阵并对齐 R, _ = orthogonal_procrustes(normalized_jpn_wiki, normalized_eng) aligned_jpn_wiki = normalized_jpn_wiki @ R
2. 用官方FastText库提取.bin向量
避免手动解析.bin文件的误差,使用官方库提取已归一化的词向量:
import fasttext # 加载日文维基FastText模型 model = fasttext.load_model('ja/wiki.ja.bin') # 获取词向量(官方方法返回的是归一化后的结果) japanese_wiki_vectors = np.array([model.get_word_vector(word) for word in japanese_words])
提取后对比.txt文件的向量,确认两者是否一致。
3. 验证双语词对质量
随机抽样检查用于对齐的英文-日文词对是否语义严格对应(比如"dog"对应"犬"而非其他歧义词)。若词对存在大量语义偏差,即使向量处理正确,相似度也会偏低。
4. 补充中心化处理(可选)
正交Procrustes变换的最优效果依赖于向量中心对齐(均值为0),可在归一化后添加中心化步骤:
# 中心化向量 centered_eng = normalized_eng - normalized_eng.mean(axis=0) centered_jpn_wiki = normalized_jpn_wiki - normalized_jpn_wiki.mean(axis=0) # 基于中心化向量计算变换矩阵 R_centered, _ = orthogonal_procrustes(centered_jpn_wiki, centered_eng) aligned_jpn_wiki_centered = centered_jpn_wiki @ R_centered
5. 重新评估对齐效果
用处理后的向量重新计算余弦相似度和皮尔逊相关系数:
from scipy.stats import pearsonr # 计算余弦相似度 cosine_sims = [np.dot(eng_vec, jpn_vec) for eng_vec, jpn_vec in zip(normalized_eng, aligned_jpn_wiki)] # 计算皮尔逊相关系数(需对应基准数据,若无则可直接用相似度分布验证) corr, p_val = pearsonr(cosine_sims, reference_scores) # reference_scores替换为你的基准标注或合理对照值
内容的提问来源于stack exchange,提问作者dcann
相关产品推荐
相关产品推荐

