我知道在python(gensim)中已经存在PV-DBOW(段落向量)的实现.但我很想知道如何自己实现它.PV-DBOW 官方文件的解释如下:
另一种方法是忽略输入中的上下文单词,但强制模型预测从输出中的段落中随机抽样的单词.实际上,这意味着在随机梯度下降的每次迭代中,我们对文本窗口进行采样,然后从文本窗口中采样随机词,并在给定段落向量的情况下形成分类任务.
根据该论文,不存储单词向量,并且据说PV-DBOW的工作类似于word2vec中的跳过克.
在word2vec参数学习中解释了Skip-gram .在跳过克模型中,单词向量被映射到隐藏层.执行此映射的矩阵在训练期间更新.在PV-DBOW中,隐藏层的维度应该是一个段落向量的维度.当我想将采样示例的单词向量与段落向量相乘时,它们应该具有相同的大小.单词的原始表示具有大小(词汇量x 1).执行哪个映射以在隐藏层中获得正确的大小(段落尺寸x 1).当没有存储单词向量时,如何执行此映射?我假设由于2中的等式26,单词和段落表示在隐藏层中应该具有相同的大小
我有一些我希望通过Doc2Vec模型运行的示例句子.我的最终目标是一个大小矩阵(num_sentences,num_features).
我正在使用Gensim包.
from gensim.models.doc2vec import TaggedDocument
from gensim.models import Doc2Vec
# warning: long sample of data. It's just 40 sentences really though.
labeled_sents = [TaggedDocument(words=['u0644', 'u0646', 'u062f', 'u0646', 'u060c', 'u0628', 'u0631', 'u0637', 'u0627', 'u0646', 'u06cc', 'u06c1', 'u06a9', 'u0627'], tags='400'), TaggedDocument(words=['do', 'pan', 'en', '1713', 'o', 'soar', 'onde', 'se', 'sit', 'xfaa'], tags='401'), TaggedDocument(words=['u0420', 'u044c', 'u043e', 'u043d', 'u0442', 'u0433', 'u0435', 'u043d', '1901', 'xa0', 'u2022', 'u041b', 'u043e', 'u0440', 'u0435', 'u043d', 'u0446', 'xa0', 'u0417', 'u0435', 'u0435', 'u043c', 'u0430', 'u043d', '1902', 'xa0', 'u2022', 'u0411', 'u0435', 'u043a', …Run Code Online (Sandbox Code Playgroud) sense2vec的文档提到了3个主要文件 - 第一个是merge_text.py.我尝试了几种类型的input-txt,csv,bzipped文件,因为merge_text.py试图打开由bzip2压缩的文件.
该文件位于:https: //github.com/spacy-io/sense2vec/blob/master/bin/merge_text.py
这个脚本需要什么类型的输入格式?此外,如果有人可以请建议如何训练模型.
from gensim.models import word2vec
sentences = word2vec.Text8Corpus('TextFile')
model = word2vec.Word2Vec(sentences, size=200, min_count = 2, workers = 4)
print model['king']
Run Code Online (Sandbox Code Playgroud)
输出向量是“king”的上下文向量还是“king”的词嵌入向量?如何同时获得“king”的上下文向量和“king”的词嵌入向量?谢谢!
我正在seq2seq modelTensorflow 中进行训练。我想用作GLoVe序列中单词的单词嵌入。在 中,我在序列中seq2seq使用一些标签,例如EOS(End of Sequence), GO(start of sequence for decoder), , 作为单词。PAD(for padding sequence)
但GLoVe不会嵌入这些标签。那么,我应该如何表示这些标签呢?
如果我有一个要矢量化的文本字符串,我应该如何处理其中的数字?或者,如果我向神经网络提供数字和单词,我如何将数字保存为数字?
我打算制作一本关于我所有单词的字典(如此处所示).在这种情况下,所有字符串都将成为数字数组.我该如何处理数字字符?如何输出不将单词索引与数字字符混合的向量?
将数字转换为字符串会削弱我为网络提供的信息吗?
我是Keras的新手,我正在努力解决在Keras使用NN的句子类似任务.我使用word2vec作为单词嵌入,然后使用Siamese Network来预测两个句子的相似程度.Siamese网络的基础网络是LSTM,为了合并两个基础网络,我使用具有余弦相似度量的Lambda层.作为数据集,我正在使用SICK数据集,它为每对句子提供一个分数,从1(不同)到5(非常相似).
我创建了网络并运行,但我有很多疑问:首先,我不确定我用LSTM提供句子的方式是否正常.我为每个单词采用word2vec嵌入,每个句子只创建一个数组,用零填充到seq_len,以获得相同的长度数组.然后我以这种方式重塑它: data_A = embedding_A.reshape((len(embedding_A), seq_len, feature_dim))
此外我不确定我的暹罗网络是否正确,因为不同对的预测很多,并且损失没有太大变化(在10个时期内从0.3300到0.2105,并且在100个时期内变化不大)时期).
有人可以帮我找到并理解我的错误吗?非常感谢(抱歉我的英语不好)
对我的代码感兴趣
def cosine_distance(vecs):
#I'm not sure about this function too
y_true, y_pred = vecs
y_true = K.l2_normalize(y_true, axis=-1)
y_pred = K.l2_normalize(y_pred, axis=-1)
return K.mean(1 - K.sum((y_true * y_pred), axis=-1))
def cosine_dist_output_shape(shapes):
shape1, shape2 = shapes
print((shape1[0], 1))
return (shape1[0], 1)
def contrastive_loss(y_true, y_pred):
margin = 1
return K.mean(y_true * K.square(y_pred) + (1 - y_true) * K.square(K.maximum(margin - y_pred, 0)))
def create_base_network(feature_dim,seq_len):
model = Sequential()
model.add(LSTM(100, batch_input_shape=(1,seq_len,feature_dim),return_sequences=True))
model.add(Dense(50, activation='relu'))
model.add(Dense(10, activation='relu')) …Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些预先训练的向量加载到 gensimWord2Vec模型中,以便可以使用新数据重新训练它们。我的理解是我可以用 进行再培训gensim.Word2Vec.train()。然而,我能找到的加载向量的唯一方法是gensim.models.KeyedVectors.load_word2vec_format('path/to/file.bin', binary=True)创建一个通常是模型wv属性的对象gensim.Word2Vec。但是这个对象本身没有方法train(),而这正是我重新训练向量所需的方法。
那么如何将这些向量转化为实际gensim.Word2Vec模型呢?
所以我有多个文本文件(大约 40 个)。每个文件大约有 2000 篇文章(平均每篇 500 字)。每个文档都是文本文件中的一行。
因此,由于内存限制,我想使用这些文本文件的动态加载来进行训练。(也许是一个迭代器类?)
那么我该如何进行呢?
众所周知,BERT模型的词嵌入能力,它可能比word2vec和任何其他模型都要好。
我想创建一个BERT词嵌入模型来生成同义词或相似的单词。就像我们在Gensim Word2Vec. 我想将 Gensim 的方法创建model.most_similar()到 BERT 词嵌入中。
我对此进行了很多研究,似乎可以做到这一点,但问题是它仅以数字形式显示嵌入,无法从中获取实际的单词。有人可以帮我解决这个问题吗?