使用 fasttext 预训练词向量作为在 tensorflow 脚本中的嵌入
Use of fasttext Pre-trained word vector as embedding in tensorflow script
我可以像这里那样使用 fasttext 词向量吗:
https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md
在 tensorflow 脚本中作为嵌入向量而不是 word2vec 或 glove 而不使用库 fasttext
使用预训练词向量时,可以使用gensim库。
供您参考。
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 分叉出来的新分支。这里是link。
https://github.com/satojkovic/cnn-text-classification-tf/tree/use_fasttext
在这个分支中,有三个修改使用fasttext。
- 从 fasttext 中提取词汇和 word_vec。 (util_fasttext.py)
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)
嵌入层
W 由零初始化,然后设置一个embedding_placeholder 来接收word_vec,最后分配W。 (text_cnn.py)
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)
使用词汇和 word_vec
vocab 用于构建 word-id 映射,word_vec 被送入 embedding_placeholder。
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
}
请尝试一下。
我可以像这里那样使用 fasttext 词向量吗: https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md 在 tensorflow 脚本中作为嵌入向量而不是 word2vec 或 glove 而不使用库 fasttext
使用预训练词向量时,可以使用gensim库。
供您参考。 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 分叉出来的新分支。这里是link。 https://github.com/satojkovic/cnn-text-classification-tf/tree/use_fasttext
在这个分支中,有三个修改使用fasttext。
- 从 fasttext 中提取词汇和 word_vec。 (util_fasttext.py)
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)
嵌入层
W 由零初始化,然后设置一个embedding_placeholder 来接收word_vec,最后分配W。 (text_cnn.py)
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)
使用词汇和 word_vec
vocab 用于构建 word-id 映射,word_vec 被送入 embedding_placeholder。
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
}
请尝试一下。