如何用Python/Word2Vec将词向量投影到‘男-女’与‘富-贫’双轴?
词向量投影到自定义坐标轴的正确实现
错误原因分析
你最后一行触发IndexError是因为Wp是一维数组(形状为(2,)),但你错误使用了二维索引(如Wp[0,2]),数组维度不匹配导致报错。此外,原代码里还存在拼写错误:model.wv['woma']应为model.wv['woman']。
正确实现方案
要将词向量投影到自定义的"贫-富"(X轴)和"男-女"(Y轴)尺度上,推荐先对轴向量做正交化处理,避免投影结果互相干扰。以下是步骤清晰的代码:
1. 定义坐标轴方向向量
# 加载模型后,定义两个尺度的方向向量 axis_male_female = model.wv['man'] - model.wv['woman'] # 男-女尺度(Y轴) axis_poor_rich = model.wv['rich'] - model.wv['poor'] # 贫-富尺度(X轴)
2. 正交化轴向量(Gram-Schmidt方法)
原始的两个方向向量可能不正交,正交化后能保证两个尺度的投影结果独立:
# 单位化X轴向量,保持方向 axis_x = axis_poor_rich / np.linalg.norm(axis_poor_rich) # 从Y轴向量中减去其在X轴上的投影,得到正交的Y轴向量 proj_y_on_x = np.dot(axis_male_female, axis_x) * axis_x axis_y = axis_male_female - proj_y_on_x axis_y = axis_y / np.linalg.norm(axis_y) # 单位化Y轴
3. 计算目标词的投影值
# 获取目标词向量 king_vec = model.wv['king'] # 投影值 = 词向量与单位轴向量的点积 proj_x = np.dot(king_vec, axis_x) # 贫-富尺度的投影值 proj_y = np.dot(king_vec, axis_y) # 男-女尺度的投影值 print(f"king在贫-富(X轴)的投影值: {proj_x}") print(f"king在男-女(Y轴)的投影值: {proj_y}")
原代码修正版(伪逆方法)
如果坚持使用伪逆做降维,只需修正拼写错误并移除错误的索引操作:
# 修正拼写错误 b1 = model.wv['man'] - model.wv['woman'] b2 = model.wv['rich'] - model.wv['poor'] B = np.array([b1, b2]) Bi = np.linalg.pinv(B.T) Wv = model.wv['king'] Wp = np.matmul(Bi, Wv.T) # Wp为(2,)一维数组,对应两个轴的投影坐标 print(f"投影坐标(男-女轴, 贫-富轴): {Wp}")
内容的提问来源于stack exchange,提问作者jback
相关产品推荐
相关产品推荐

