使用预训练FastText模型时,Gensim如何计算句子嵌入?
fastText句子嵌入计算的问题
根据fastText相关讨论,句子相似度计算的方式分为两种,取决于嵌入是监督还是无监督训练生成:
- 无监督训练生成的嵌入:使用归一化词向量的均值作为句子嵌入
- 监督训练生成的嵌入:使用词向量的均值作为句子嵌入
但按照这两种方式计算时,我始终无法得到与直接调用wv["til skat"]一致的结果:
from gensim.models import fasttext import numpy as np wv = fasttext.load_facebook_vectors("transtotag/cc.da.300.bin") w1 = wv["til"] norm_w1 = np.linalg.norm(wv["til"], ord=2) s1 = w1/norm_w1 w2 = wv["skat"] norm_w2 = np.linalg.norm(wv["skat"], ord=2) s2 = w2/norm_w2 w3 = wv["til skat"] # 使用"原始"嵌入 ((w1+w2)/2-w3).max() # 0.25 ((w1+w2)-w3).max() # 0.5 # 使用归一化嵌入 ((s1+s2)/2-w3).max() # 0.18 ((s1+s2)-w3).max() # 0.37
我甚至尝试加入EOS标记(如讨论中所述),结果依然不匹配:
nl = wv["</s>"] norm_nl = np.linalg.norm(wv["</s>"],2) snl = nl/norm_nl w3 = wv["til skat"] ((s1+s2+snl)/3-w3).max() # 0.12
查看gensim的fastText源码后发现,wv[]处理多词输入时,会把til skat当成单个词来处理(核心逻辑为vstack([self.get_vector(key) for key in key_or_keys])),而且官方文档中也找不到关于句子嵌入生成方式的明确说明。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

