【问题标题】:Why are there rows with all values ​0 in the embedding matrix?为什么嵌入矩阵中有所有值都为 ​0 的行?
【发布时间】:2021-01-25 13:23:07
【问题描述】:

我创建了用于情感分析的词嵌入向量。但我不确定我写的代码。如果您在创建 Word2vec 或嵌入矩阵时发现我的错误,请告诉我。

EMBEDDING_DIM=100 
review_lines = [sub.split() for sub in reviews]    
model = gensim.models.Word2Vec(sentences=review_lines,size=EMBEDDING_DIM,window=6,workers=6,min_count=3,sg=1) 
print('Words close to the given word:',model.wv.most_similar('film'))    
words=list(model.wv.vocab) 
print('Words:' , words)

file_name='embedding_word2vec.txt'
model.wv.save_word2vec_format(file_name,binary=False)     
embeddings_index = {}    
f=open(os.path.join('','embedding_word2vec.txt'),encoding="utf-8")    
for line in f:    
  values =line.split()    
  word=values[0]   
  coefs=np.asarray(values[1:],dtype='float32')   
  embeddings_index[word]=coefs    
f.close()  
print("Number of word vectors found:",len(embeddings_index))
  
embedding_matrix = np.zeros((len(word_index)+1,EMBEDDING_DIM))
for word , i in word_index.items():
  embedding_vector= embeddings_index.get(word)
  if embedding_vector is not None:
    embedding_matrix[i]=embedding_vector

OUTPUT:
array([[ 0.        ,  0.        ,  0.        , ...,  0.        ,
         0.        ,  0.        ],
       [ 0.1029947 ,  0.07595579, -0.06583303, ...,  0.10382118,
        -0.56950015, -0.17402627],
       [ 0.13758609,  0.05489254,  0.0969701 , ...,  0.18532865,
        -0.49845088, -0.23407038],
       ...,
       [ 0.        ,  0.        ,  0.        , ...,  0.        ,
         0.        ,  0.        ]])

【问题讨论】:

  • 什么是word_index(您的代码中使用但从未声明的变量),为什么它的单词列表必须与之前的model 中的单词列表匹配?当您可以使用 Gensim 的内置 KeyedVectors.load_word2vec_format(FILENAME) 时,您为什么要编写自己的代码来读取文件?
  • 单词索引变量是一个字典,包含我数据中最常用的 15000 个单词。在我的其余代码中有一个 word_index 实现。我试图在这里创建嵌入自己的单词,所以我阅读了文件,但我想这是不必要的。我不知道清晰的预训练词嵌入的优势。 KeyedVectors.load_word2vec_format (FILENAME) 我也不知道怎么用。

标签: nlp word2vec word-embedding python-embedding


【解决方案1】:

很可能存在零行,因为您将 embedding_matrix 初始化为全零,但随后您的循环并未替换每一行的这些零。

如果word_index 中的任何单词不在您构建的embeddings_index 字典中(或之前的model,那将是预期的结果。

请注意,虽然保存的词向量格式不是很复杂,但您仍然不需要编写自己的代码来解析它。KeyedVectors.load_word2vec_format() 方法可以解决这个问题,为您提供一个对象允许通过其词键对每个向量进行类似 dict 的访问。 (而且,向量存储在一个密集数组中,因此它比真正的 dict 具有更高的内存效率,每个值都有一个单独的 ndarray 向量。)

仍然存在您的word_index 列出未经模型训练的单词的问题。也许它们不在您的训练文本中,或者至少没有出现min_count(默认值:5)次,这是模型注意到它们的要求。 (您可以考虑降低min_count,但请注意,丢弃这些非常罕见的词通常是一个好主意——它们不会从几个例子中创建出很好的向量,甚至包括这些代表稀少的词也会使周围的词恶化向量。)

如果您在训练数据中绝对需要单词 no 的向量,word2vec 算法的 FastText 变体可以在相似词经常共享相似字符运行的语言中,为未知词提供比随机更好的合成向量/大多数下游应用程序的空向量。但是你真的应该更喜欢有足够的真实例子来说明每个有趣的词在不同的上下文中的用法。

【讨论】:

  • 非常感谢您的解释。这是非常有启发性的。我还有一个问题。我使用 IMDB 电影 cmets 作为数据集。我使用“GoogleNews-vectors-negative300.bin”作为预训练的词嵌入。这两个是完全不同的数据集。 'GoogleNews-vectors-negative300.bin' 用起来会不会不合理?或者用于电影评论的词可能不在新闻文本中。这会带来什么样的问题?
  • 是的,重用 'GoogleNews' 向量可能是一个问题,在很多方面:(1) Google 从未完全记录过他们如何预处理/组合这些标记,因此预处理其他文本以匹配令牌通常是一个临时过程; (2) 2013 年前新闻报道中的词义将不同于其他领域中使用的词义; (3) 在其他领域使用的词,尤其是较新的词,可能根本不会出现在那里。如果您有足够的数据,通常最好在自己的域数据上训练自己的词向量——至少作为测试使用旧/其他域词向量的一种选择!
  • 嗨 :) 我还有一个问题。即使我不执行作为第一步之一的数据清理,我在训练集中也得到了成功的结果。我不做数据清理的时候,我的准确性和损失不应该很糟糕吗?在我的模型中,当我不进行数据清除时,我的 acc 值为 91%,我的 loss 值为 11%。出现这种情况的原因是什么?
  • 我不知道您在这里的“数据清理”是什么意思,也不知道您在计算这些准确度数字时采取了哪些后续步骤。任何特定的数据预处理是否值得麻烦取决于您的数据的细节、目标、算法的选择等。(“更多地处理数据”并不自然会更好 - 你必须尝试一些事情和比较每个变体的结果,有时“标准”步骤可能会丢弃在您的特定情况下有用的数据。)
  • 在进行数据清理时,我按照以下步骤操作:小写、数字删除、标点符号删除、停用词删除和词形还原。我想我不需要这些步骤太多,所以我会再试一次并删除不必要的过程。如果不需要,我不会执行任何数据清理步骤。非常感谢您的信息。你很有帮助:)
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
相关资源
最近更新 更多