我目前正在尝试在UMBC Webbase语料库上训练一组Word2Vec向量(大约30GB的文本在400个文件中).
即使在100 GB以上的机器上,我也经常遇到内存不足的情况.我在应用程序本身运行Spark.我尝试稍微调整一下,但我无法对超过10 GB的文本数据执行此操作.我实现的明显瓶颈是先前计算的RDD的并集,即内存不足异常的来源.
也许您有经验可以提出比这更有效的内存实现:
object SparkJobs {
val conf = new SparkConf()
.setAppName("TestApp")
.setMaster("local[*]")
.set("spark.executor.memory", "100g")
.set("spark.rdd.compress", "true")
val sc = new SparkContext(conf)
def trainBasedOnWebBaseFiles(path: String): Unit = {
val folder: File = new File(path)
val files: ParSeq[File] = folder.listFiles(new TxtFileFilter).toIndexedSeq.par
var i = 0;
val props = new Properties();
props.setProperty("annotators", "tokenize, ssplit");
props.setProperty("nthreads","2")
val pipeline = new StanfordCoreNLP(props);
//preprocess files parallel
val training_data_raw: ParSeq[RDD[Seq[String]]] = files.map(file => {
//preprocess line of file
println(file.getName() +"-" + file.getTotalSpace())
val …Run Code Online (Sandbox Code Playgroud) 我知道在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) 在字嵌入中,start_tokens _PAD,_UNKNOWN,_GO,_EOS应该是一个很好的矢量表示?
在创建模型时,没有更多具有扩展完成的模型
.syn1neg.npy
syn0.npy
我的代码如下:
corpus= x+y
tok_corp= [nltk.word_tokenize(sent.decode('utf-8')) for sent in corpus]
model = gensim.models.Word2Vec(tok_corp, min_count=1, size = 32)
model.save('/home/Desktop/test_model')
model = gensim.models.Word2Vec.load('/home/kafein/Desktop/chatbot/test_model')
Run Code Online (Sandbox Code Playgroud)
只有一个模型文件
test_model
Run Code Online (Sandbox Code Playgroud)
哪一部分我错了?
我完全了解单词嵌入(skip-gram,CBOW)的含义和方法.我知道,谷歌有一个word2vector API,通过获取单词可以生成向量.但我的问题是这样的:我们有一个条款,包括主题,对象,动词......每个单词以前都是由Google API嵌入的,现在是"我们如何将这些向量组合在一起创建一个等于条款?" 例子:条款:V ="狗咬人"在谷歌嵌入后,我们有V1,V2,V3,每个人都映射到狗,咬人,男人.我们知道:V = V1 + V2 + V3我们如何提供V?如果你通过一个真实载体的例子来解释它,我将不胜感激.
nlp information-retrieval google-api-python-client word2vec word-embedding
如果我有一个要矢量化的文本字符串,我应该如何处理其中的数字?或者,如果我向神经网络提供数字和单词,我如何将数字保存为数字?
我打算制作一本关于我所有单词的字典(如此处所示).在这种情况下,所有字符串都将成为数字数组.我该如何处理数字字符?如何输出不将单词索引与数字字符混合的向量?
将数字转换为字符串会削弱我为网络提供的信息吗?
我是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) 我使用gensim拟合doc2vec模型,标记文档(长度> 10)作为训练数据.目标是获取所有训练文档的doc向量,但在model.docvecs中只能找到10个向量.
训练数据的例子(长度> 10)
docs = ['This is a sentence', 'This is another sentence', ....]
Run Code Online (Sandbox Code Playgroud)
有一些预处理
doc_=[d.strip().split(" ") for d in doc]
doc_tagged = []
for i in range(len(doc_)):
tagd = TaggedDocument(doc_[i],str(i))
doc_tagged.append(tagd)
Run Code Online (Sandbox Code Playgroud)
标记的文档
TaggedDocument(words=array(['a', 'b', 'c', ..., ],
dtype='<U32'), tags='117')
Run Code Online (Sandbox Code Playgroud)
适合doc2vec模型
model = Doc2Vec(min_count=1, window=10, size=100, sample=1e-4, negative=5, workers=8)
model.build_vocab(doc_tagged)
model.train(doc_tagged, total_examples= model.corpus_count, epochs= model.iter)
Run Code Online (Sandbox Code Playgroud)
然后我得到了最终的模型
len(model.docvecs)
Run Code Online (Sandbox Code Playgroud)
结果是10 ...
我尝试了其他数据集(长度> 100,1000)并得到了相同的结果len(model.docvecs).所以,我的问题是:如何使用model.docvecs来获取完整的向量?(不使用model.infer_vector)model.docvecs旨在提供所有培训docvecs?
我在gensim训练过word2vec.在Keras,我想用它来制作句子矩阵使用那个词嵌入.由于存储所有句子的矩阵,因此空间和内存效率很低.因此,我想在Keras中实现嵌入层以实现这一点,以便可以在其他层(LSTM)中使用它.你能详细告诉我怎么做吗?
PS:它与其他问题不同,因为我使用gensim进行word2vec训练而不是keras.
word2vec ×10
nlp ×6
gensim ×4
python ×3
doc2vec ×2
keras ×2
python-3.x ×2
apache-spark ×1
bigdata ×1
lstm ×1
scala ×1
tensorflow ×1