【问题标题】:fastText producing zero vectorfastText 产生零向量
【发布时间】:2021-12-20 06:47:03
【问题描述】:

我在计算 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)    

相关代码sn-ps:

# 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 词以获得非零嵌入?

【问题讨论】:

    标签: python spatial word-embedding fasttext


    【解决方案1】:

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

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

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

    在这种情况下,您可以做的最好的事情是在假设向量不为零之前检测该情况 - 并且可能会完全忽略该未知单词及其不可猜测的向量。

    【讨论】:

    • minn 参数在我的例子中是 0。所以,我相信我不会因此而得到 OOV,但可能是因为模型之前没有遇到过那个 n-gram。顺便说一句,不可猜测的向量是什么?
    • 举个例子,训练文件中有单词__label__AET_HUM,但模型仍然为单词AET_HUM产生零嵌入。
    • maxn 参数是什么? (您确定您的模型正在训练/跟踪 any 字符 n-gram,这必须能够生成 OOV 向量?)“不可猜测向量”是指FastText 无法“猜测”的单词(使用子字符串)。例如,对于 minn=3maxn=5 的典型配置,如果您要提供 OOV 单词 'zz',并且这不在训练数据中,它会 - 按照设计 - 返回一个零向量,因为没有猜测的基础(没有 3-、4- 或 5- 字符子字符串)。
    • 显然,maxn 参数解决了这个问题。默认为0。将其更改为 maxn=6 解决了问题。但我不确定为什么默认参数 0 完全可以对任何字符串进行编码。文档说“maxn-> char ngram 的最大长度”。
    • 太棒了! FWIW,我认为你可以在0 上同时拥有minnmaxn,这意味着:没有子词信息——类似于bucket=0。 (如果你增加了maxn,你可能应该增加minn,对于任何类似自然语言的东西,至少到3——因为1或2个字符子串可能是噪音。)
    【解决方案2】:

    显然,设置maxn=6 解决了这个问题。默认为0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多