Keras 对任意输入数据进行单词嵌入后得到全零的嵌入矩阵

Keras 对任意输入数据进行单词嵌入后得到全零的嵌入矩阵,keras,tokenize,word2vec,word-embedding,Keras,Tokenize,Word2vec,Word Embedding,我正在尝试在Keras中嵌入单词。我正在使用'glove.6B.50d.txt'来达到这个目的。直到从“gloft.6B.50d.txt”文件中准备嵌入索引,我才能得到正确的输出 但是每当我把输入的单词映射到嵌入索引中的单词时,我总是得到一个充满零的嵌入矩阵 代码如下: #以下是作为输入给出的示例句子 line=“敏捷的棕色狐狸跳过了懒狗” 行=行。拆分(“”) #这是我的嵌入文件 嵌入_FILE='glove.6B.50d.txt' 嵌入大小=10#每个单词向量有多大 max_features

我正在尝试在Keras中嵌入单词。我正在使用'glove.6B.50d.txt'来达到这个目的。直到从“gloft.6B.50d.txt”文件中准备嵌入索引,我才能得到正确的输出

但是每当我把输入的单词映射到嵌入索引中的单词时,我总是得到一个充满零的嵌入矩阵

代码如下:

#以下是作为输入给出的示例句子
line=“敏捷的棕色狐狸跳过了懒狗”
行=行。拆分(“”)
#这是我的嵌入文件
嵌入_FILE='glove.6B.50d.txt'
嵌入大小=10#每个单词向量有多大
max_features=10000#要使用多少唯一单词(即嵌入向量中的行数)
maxlen=10#注释中要使用的最大字数
标记器=标记器(num\u words=max\u features,split=”“,char\u level=False)
标记器.fit_on_文本(列表(行))
列表\u标记化\u序列=标记器。文本\u到\u序列(行)
序列=标记器。文本到序列(行)
word\u index=tokenizer.word\u index
打印('找到%s个唯一标记。'%len(单词索引))
X\u t=pad\u序列(列表标记化序列,maxlen=maxlen)
打印(序列)
打印(word_索引)
打印('数据张量的形状:',X_t.形状)
#这里得到了正确的输出
#找到8个唯一的标记。
#[[1], [2], [3], [4], [5], [6], [1], [7], [8]]
#{'the':1,'quick':2,'brown':3,'fox':4,'jumped':5,'over':6,'lazy':7,'dog':8}
#数据张量的形状:(9,10)
#加载嵌入文件以准备嵌入索引矩阵
嵌入_索引={}
对于打开的i(嵌入_文件,“rb”):
值=i.split()
字=值[0]
#打印(word)
coefs=np.asarray(值[1:],dtype='float32')
嵌入索引[word]=coefs
打印('找到%s个字向量。'%len(嵌入索引))
#找到了400000个单词向量。
#嵌入矩阵的生成
嵌入矩阵=np.0((len(单词索引)+1,嵌入大小))
对于word,我在word_index.items()中:
嵌入向量=嵌入索引.get(word)
如果嵌入_向量不是无:
#嵌入索引中未找到的单词将全部为零。
嵌入矩阵[i]=嵌入向量
在这里,当我打印嵌入矩阵时,我得到其中的所有零(即输入中没有一个单词被识别)

数组([[0,0,0,0,0,0,0,0,0,0,0,0.]),
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
另外,如果我为每次迭代打印
embeddings\u index.get(word)
,它将无法获取单词并返回NONE

我在代码中哪里出错了

  • 嵌入大小应该是50而不是10(它表示单词嵌入的维度)
  • 功能的数量应>>50(接近10000)。将其限制为50意味着大量向量将丢失

  • 今天问题解决了。 似乎
    embeddings\u index.get(word)
    由于某些编码问题而无法获取单词

    我将I in open的
    (嵌入文件“rb”):
    在嵌入矩阵的准备过程中出现,更改为I in open的
    (嵌入文件“r”,编码为“utf-8”):
    这就解决了问题