最近,我训练了一个嵌入sentiment140的FastText单词,以获取英语单词的表示形式。但是,今天,为了进行试用,我在几个中文单词上运行了FastText模块,例如:
import gensim.models as gs
path = r'\data\word2vec'
w2v = gs.FastText.load(os.path.join(path, 'fasttext_model'))
w2v.wv['哈哈哈哈']
它输出:
array([ 0.00303676, 0.02088235, -0.00815559, 0.00484574, -0.03576371,
-0.02178247, -0.05090654, 0.03063928, -0.05999983, 0.04547168,
-0.01778449, -0.02716631, -0.03326027, -0.00078981, 0.0168153 ,
0.00773436, 0.01966593, -0.00756055, 0.02175765, -0.0050137 ,
0.00241255, -0.03810823, -0.03386266, 0.01231019, -0.00621936,
-0.00252419, 0.02280569, 0.00992453, 0.02770403, 0.00233192,
0.0008545 , -0.01462698, 0.00454278, 0.0381292 , -0.02945416,
-0.00305543, -0.00690968, 0.00144188, 0.00424266, 0.00391074,
0.01969502, 0.02517333, 0.00875261, 0.02937791, 0.03234404,
-0.01116276, -0.00362578, 0.00483239, -0.02257918, 0.00123061,
0.00324584, 0.00432153, 0.01332884, 0.03186348, -0.04119627,
0.01329033, 0.01382102, -0.01637722, 0.01464139, 0.02203292,
0.0312229 , 0.00636201, -0.00044287, -0.00489291, 0.0210293 ,
-0.00379244, -0.01577058, 0.02185207, 0.02576622, -0.0054543 ,
-0.03115215, -0.00337738, -0.01589811, -0.01608399, -0.0141606 ,
0.0508234 , 0.00775024, 0.00352813, 0.00573649, -0.02131752,
0.01166397, 0.00940598, 0.04075769, -0.04704212, 0.0101376 ,
0.01208556, 0.00402935, 0.0093914 , 0.00136144, 0.03284211,
0.01000613, -0.00563702, 0.00847146, 0.03236216, -0.01626745,
0.04095127, 0.02858841, 0.0248084 , 0.00455458, 0.01467448],
dtype=float32)
因此,我真的很想知道为什么从sentiment140训练来的FastText模块可以做到这一点。谢谢!
答案 0 :(得分:2)
实际上,基于Facebook原始/引用实现的行为,FastText模型的正确行为是总是返回词汇量以外的向量。
从本质上讲,如果所提供的字符串字符n-gram不存在,则仍将根据模型的固定大小的n-gram向量集合中相同查找时隙处的任意随机向量合成一个向量。
在Gensim中至少运行3.7.1,如果不存在词汇外单词的n-gram,则FastText
类将引发KeyError: 'all ngrams for word _____ absent from model'
错误-但这是越野车行为在将来的Gensim版本中,将与Facebook的FastText相匹配。 (Gensim开发分支的PR to correct this behavior has been merged,因此应该在3.7.1之后的下一个版本中生效。)
我不确定为什么您描述的特定模型和数据集没有得到这样的错误。也许您的fasttext_model
实际上接受了与您想像不同的文字训练?或者,使用非常小的非默认min_n
参数进行训练,以使出现在哈
数据内的单个sentiment140
足以构成哈哈哈哈
的合成矢量?
但是鉴于标准的FastText行为总是要报告某些合成矢量,并且Gensim将在将来的版本中匹配该行为,因此您不应该指望这里出现错误。期望获得完全随机的单词的本质随机向量,与训练数据不相似。