【问题标题】:Normalizing Fasttext Pretrained Fasttext word embedding规范化 Fasttext 预训练的 Fasttext 词嵌入
【发布时间】:2020-09-21 17:55:21
【问题描述】:

我正在尝试将 fasttext 词向量规范化到另一个范围,以便它可以与其他数据组合。

我首先像这样访问预训练模型:

fasttext.util.download_model('en', if_exists='ignore')  # English
ft = fasttext.load_model('cc.en.300.bin')

然后我将模型缩短为更短的向量长度

fasttext.util.reduce_model(ft, 36)

为了正常化,我正在尝试执行以下操作

((值 - current_min)/(current_max - current_min)) * (desired_max - desired_min) + desired_min

我在想我只是在需要时对向量进行归一化,所以我没有尝试一次对它们进行归一化,然后保存另一个大的 fasttext 对象,但为了做到这一点,我需要找到当前的最大值fasttext 对象中的最小值和最小值?最好的方法是遍历对象中的每个数组以找到最大值和最小值吗?我对 fasttext 对象到底是什么感到困惑,而普通的 min() max() 函数对它不起作用。

编辑:忘了包括我目前寻找最大值和最小值的最佳想法

fasttext_words = ft.get_words()
max_num = 0
min_num = 0
for word in fasttext_words:
    temp_max = max(ft.get_word_vector(word))
    temp_min = min(ft.get_word_vector(word))
    if temp_max > max_num:
        max_num = temp_max
    if temp_min < min_num:
        min_num = temp_min

【问题讨论】:

  • “标准化”似乎意味着以某种方式重新缩放它们,但不清楚原因。这通常不是必需的。而且,在这种情况下,“规范化”通常意味着“将所有向量重新缩放为等效单位 (1.0) 大小”——但您的代码没有做任何类似的事情。那么,您的最终目标到底是什么? 为什么您要尝试以不典型的方式更改所有向量?为什么这种变化会使其与其他数据更容易结合?其他数据是什么?您出于什么目的尝试了什么样的组合?
  • (连接而不是加法对于机器学习来说更典型,在这种情况下,这种重新缩放和截断到更少的维度是没有必要或明智的。)跨度>
  • 我正在尝试做与本文类似的事情:artelab.dista.uninsubria.it/res/research/papers/2018/… 他们将词向量转换为像素表示,因此我尝试重新缩放到 0,255。你是说这个公式:((value - current_min)/(current_max - current_min)) * (desired_max - desired_min) + desired_min" 不能做到这一点?
  • 感谢具体的论文链接!这很有趣,但令我惊讶的是,将字向量字面意思转换为图像上的颜色是一种有效的方法……我没想到有必要将东西输入 CNN,而不是作为一种使用方式一个现成的仅图像 CNN。 (而且,与将每个维度都设为灰度像素相比,将多个维度组合成特定大小的颜色方块似乎是一种额外的间接性。)
  • 也就是说,我怀疑您希望对每个维度单独执行重新缩放 - 您现有的代码片段将在所有维度上查找最大值/最小值。首先,对所有向量进行单位归一化可能会简化一些事情,以便它们都在“单位球体”上。然后你可以假设每个维度的范围必然是 -1.0 到 1.0,这可以很容易地缩放到 0-255。但是,从论文中不清楚他们使用了什么流程 - 他们是否发布了任何代码,或者您认为作者会回应澄清请求?

标签: nlp normalize fasttext


【解决方案1】:

我用这种方法来标准化词向量:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
num_instances, num_maxlen = X_train.shape
X_train = scaler.fit_transform(X_train)
X_train = np.reshape(X_train, newshape=(num_instances, num_maxlen))

num_instances, num_maxlen = X_test.shape
X_test = scaler.transform(X_test)
X_test = np.reshape(X_test, newshape=(num_instances, num_maxlen))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2021-03-29
    相关资源
    最近更新 更多