fastText 产生零向量

fastText producing zero vector

我在计算 fastText 生成的嵌入的余弦相似度时遇到以下错误:

/home/kgarg8/anaconda3/envs/CiteKP/lib/python3.6/site-packages/scipy/spatial/distance.py:721: RuntimeWarn
ing: invalid value encountered in float_scalars                                                          
  dist = 1.0 - uv / np.sqrt(uu * vv)    

相关代码片段:

# fastText supervised training:
model = fasttext.train_supervised('merged_data_labels_prepended.txt')
model.save_model('fasttext_supervised.bin')

# model loading
model = fasttext.load_model("fasttext_supervised.bin")
# calculating cosine similarity
from scipy import spatial
def cosine_distance_wordembedding_method(s1, s2):
    vec1   = np.mean([model[word] for word in s1],axis=0)
    vec2   = np.mean([model[word] for word in s2],axis=0)
    cosine = spatial.distance.cosine(vec1, vec2)
    return round((1-cosine)*100, 2)

cosine_distance_wordembedding_method(pred.split(), label.split()) # function call

初步分析:

fastText 正在为不在词汇表中的单词生成全零嵌入(有时 vec1 或 vec2 为零)。那么,如何处理这些 OOV 词以获得非零嵌入?

您为其接收原始向量(所有 0.0 维度)的词是否可能非常短 - 比构建模型时使用的 min_n 参数短?

如果是这样,这就是模型的设计目的。 FastText 只能为 OOV 词合成向量,当候选词的子串在早期训练中可能已经接收到 n-gram 向量时。

如果训练只为 3 个或更多字符的 character-n-gram 创建了这些词片段向量,而您要求 FastText 为 OOV 2 字符词创建向量,则它既没有完整的-词向量,也不是子词向量,合并到 OOV 向量。所以它 returns 零向量。

在这种情况下,你能做的最好的事情就是在假设向量不为零之前检测到这种情况 - 然后可能只是完全忽略那个未知的词,以及它不可猜测的向量。

显然,设置 maxn=6 解决了这个问题。默认情况下,它是 0.