使用fasttext预训练的单词向量作为在tensorflow脚本中的嵌入

时间:2017-06-29 15:33:10

标签: python tensorflow word2vec fasttext

我可以像这里的那样使用fasttext字矢量: https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md 在tensorflow脚本中作为嵌入向量而不是word2vec或手套而不使用库fasttext

1 个答案:

答案 0 :(得分:7)

使用预先训练过的单词向量时,可以使用gensim libarary。

供您参考。 https://blog.manash.me/how-to-use-pre-trained-word-vectors-from-facebooks-fasttext-a71e6d55f27

In [1]: from gensim.models import KeyedVectors

In [2]: jp_model = KeyedVectors.load_word2vec_format('wiki.ja.vec')

In [3]: jp_model.most_similar('car')
Out[3]: 
[('cab', 0.9970724582672119),
 ('tle', 0.9969051480293274),
 ('oyc', 0.99671471118927),
 ('oyt', 0.996662974357605),
 ('車', 0.99665766954422),
 ('s', 0.9966464638710022),
 ('新車', 0.9966358542442322),
 ('hice', 0.9966053366661072),
 ('otg', 0.9965877532958984),
 ('車両', 0.9965814352035522)]

修改

我创建了一个从cnn-text-classification-tf分叉的新分支。链接在这里。 https://github.com/satojkovic/cnn-text-classification-tf/tree/use_fasttext

在这个分支中,使用fasttext有三种修改。

  1. 从fasttext中提取词汇和word_vec。 (util_fasttext.py)
  2. model = KeyedVectors.load_word2vec_format('wiki.en.vec')
    vocab = model.vocab
    embeddings = np.array([model.word_vec(k) for k in vocab.keys()])
    
    with open('fasttext_vocab_en.dat', 'wb') as fw:
        pickle.dump(vocab, fw, protocol=pickle.HIGHEST_PROTOCOL)
    np.save('fasttext_embedding_en.npy', embeddings)
    
    1. 嵌入图层

      W由零初始化,然后设置embedding_placeholder以接收word_vec,最后分配W。 (text_cnn.py)

    2. W_ = tf.Variable(
          tf.constant(0.0, shape=[vocab_size, embedding_size]),
          trainable=False,
          name='W')
      
      self.embedding_placeholder = tf.placeholder(
          tf.float32, [vocab_size, embedding_size],
          name='pre_trained')
      
      W = tf.assign(W_, self.embedding_placeholder)
      
      1. 使用词汇和word_vec

        词汇用于构建word-id地图,word_vec被输入embedding_placeholder。

      2. with open('fasttext_vocab_en.dat', 'rb') as fr:
            vocab = pickle.load(fr)
        embedding = np.load('fasttext_embedding_en.npy')
        
        pretrain = vocab_processor.fit(vocab.keys())
        x = np.array(list(vocab_processor.transform(x_text)))
        
        feed_dict = {
            cnn.input_x: x_batch,
            cnn.input_y: y_batch,
            cnn.dropout_keep_prob: FLAGS.dropout_keep_prob,
            cnn.embedding_placeholder: embedding
        }
        

        请试一试。