我有一个pyspark数据框,其中包含大约300k个唯一行的语料库,每个行都有一个"doc",每个文档包含几个文本句子.
在处理之后,我有每行/ doc的200维矢量化表示.我的NLP流程:
我理解这个实现如何使用skipgram模型根据使用的完整语料库为每个单词创建嵌入.我的问题是:这个实现如何从语料库中每个单词的向量转到每个文档/行的向量?
它与gensim doc2vec实现中的过程相同,它只是简单地将每个文档中的单词向量连接在一起吗?:gensim如何计算doc2vec段落向量.如果是这样,它如何将向量切割到指定大小200(它只使用前200个单词?平均值?)?
我无法从源代码中找到信息:https://spark.apache.org/docs/2.2.0/api/python/_modules/pyspark/ml/feature.html#Word2Vec
任何帮助或参考材料,超级赞赏!
上图来自Distributed Representations of Sentences and Documents,介绍 Doc2Vec 的论文。我正在使用 Gensim 的 Word2Vec 和 Doc2Vec 实现,它们很棒,但我正在寻找一些问题的清晰度。
dvm,什么是dvm.docvecs?我的印象是它是平均或连接的向量,包括所有的词嵌入和段落向量,d。这是正确的,还是d?dvm.docvecs不是d,可以自己访问 d 吗?如何?d计算?报纸上只说:在我们的段落向量框架(见图 2)中,每个段落都映射到一个唯一的向量,由矩阵 D 中的一列表示,每个词也映射到一个唯一的向量,由矩阵 W 中的一列表示。
感谢您的任何线索!
我使用Doc2Vec标记作为我的文档的唯一标识符,每个文档都有不同的标记,没有语义含义.我正在使用标签查找特定文档,以便我可以计算它们之间的相似性.
标签会影响我的模型的结果吗?
在本教程中,他们讨论了一个参数train_lbls=false,将其设置为false,没有为标签(标签)学习的表示.
该教程有点过时了,我猜参数不再存在,Doc2Vec如何处理标签?
我读了这个页面,但我不明白基于以下代码构建的模型之间有什么不同.我知道当dbow_words为0时,doc-vectors的训练更快.
第一个模型
model = doc2vec.Doc2Vec(documents1, size = 100, window = 300, min_count = 10, workers=4)
Run Code Online (Sandbox Code Playgroud)
第二个模型
model = doc2vec.Doc2Vec(documents1, size = 100, window = 300, min_count = 10, workers=4,dbow_words=1)
Run Code Online (Sandbox Code Playgroud) def cosine(vector1,vector2):
cosV12 = np.dot(vector1, vector2) / (linalg.norm(vector1) * linalg.norm(vector2))
return cosV12
model=gensim.models.doc2vec.Doc2Vec.load('Model_D2V_Game')
string='?? ?? ?? ? ? ?? ? ...'
list=string.split(' ')
vector1=model.infer_vector(doc_words=list,alpha=0.1, min_alpha=0.0001,steps=5)
vector2=model.docvecs.doctag_syn0[0]
print cosine(vector2,vector1)
Run Code Online (Sandbox Code Playgroud)
-0.0232586
我使用火车数据来训练doc2vec模型.然后,我infer_vector()用来生成一个给定文档的向量,该文档在训练数据中.但他们是不同的.余弦的值是如此之小(-0.0232586)vector2在doc2vec模型中保存的距离和由... vector1生成的距离infer_vector().但这不合理啊......
我发现我的错误在哪里.我应该使用'string = u'民生为了父亲我要坚强地...''而不是'string ='民生为了父亲我要坚强地......''.当我以这种方式校正时,余弦距离最大为0.889342.
我正在训练一个如下Word2Vec模型:
model = Word2Vec(documents, size=200, window=5, min_count=0, workers=4, iter=5, sg=1)
Run Code Online (Sandbox Code Playgroud)
和Doc2Vec模型如:
doc2vec_model = Doc2Vec(size=200, window=5, min_count=0, iter=5, workers=4, dm=1)
doc2vec_model.build_vocab(doc2vec_tagged_documents)
doc2vec_model.train(doc2vec_tagged_documents, total_examples=doc2vec_model.corpus_count, epochs=doc2vec_model.iter)
Run Code Online (Sandbox Code Playgroud)
具有相同的数据和可比较的参数.
在此之后我将这些模型用于我的分类任务.我发现简单地平均或总结word2vec文档的嵌入比使用doc2vec向量要好得多.我也尝试了更多的doc2vec迭代(25,80和150 - 没有区别).
任何提示或想法为什么以及如何改善doc2vec结果?
更新:这是如何doc2vec_tagged_documents创建的:
doc2vec_tagged_documents = list()
counter = 0
for document in documents:
doc2vec_tagged_documents.append(TaggedDocument(document, [counter]))
counter += 1
Run Code Online (Sandbox Code Playgroud)
关于我的数据的更多事实:
doc2vec模型,但结果几乎相同.我试图理解函数中的epochs参数Doc2Vec和epochs函数中的参数train。
在以下代码片段中,我手动设置了4000次迭代的循环。是否需要或在Doc2Vec中传递4000作为纪元参数足够?另外epochsin Doc2Vec与时代in有train什么不同?
documents = Documents(train_set)
model = Doc2Vec(vector_size=100, dbow_words=1, dm=0, epochs=4000, window=5,
seed=1337, min_count=5, workers=4, alpha=0.001, min_alpha=0.025)
model.build_vocab(documents)
for epoch in range(model.epochs):
print("epoch "+str(epoch))
model.train(documents, total_examples=total_length, epochs=1)
ckpnt = model_name+"_epoch_"+str(epoch)
model.save(ckpnt)
print("Saving {}".format(ckpnt))
Run Code Online (Sandbox Code Playgroud)
此外,权重如何以及何时更新?
是否可以训练单个文档具有多个标签的 doc2vec 模型?例如,在电影评论中,
doc0 = doc2vec.TaggedDocument(words=review0,tags=['UID_0','horror','action'])
doc1 = doc2vec.TaggedDocument(words=review1,tags=['UID_1','drama','action','romance'])
Run Code Online (Sandbox Code Playgroud)
在每个文档都有一个唯一标签 (UID) 和多个分类标签的情况下,如何在训练后访问向量?例如,调用最合适的语法是什么
model['UID_1']
Run Code Online (Sandbox Code Playgroud) 例如,我的想法是当我使用 doc2vec(s) 来训练模型时,它只是从数据集中构建词汇表。如果我想扩展它,我需要使用 build_vocab()
例如:
sentences = gensim.models.doc2vec.TaggedLineDocument(f_path)
dm_model = gensim.models.doc2vec.Doc2Vec(sentences, dm=1, size=300, window=8, min_count=5, workers=4)
dm_model.build_vocab()
Run Code Online (Sandbox Code Playgroud) 我有一个用 Doc2Vec 训练的语料库,如下所示:
d2vmodel = Doc2Vec(vector_size=100, min_count=5, epochs=10)
d2vmodel.build_vocab(train_corpus)
d2vmodel.train(train_corpus, total_examples=d2vmodel.corpus_count, epochs=d2vmodel.epochs)
Run Code Online (Sandbox Code Playgroud)
使用向量,文档被聚类为kmeans:
kmeans_model = KMeans(n_clusters=NUM_CLUSTERS, init='k-means++', random_state = 42)
X = kmeans_model.fit(d2vmodel.docvecs.vectors_docs)
labels=kmeans_model.labels_.tolist()
Run Code Online (Sandbox Code Playgroud)
我想使用 k-means 对新文档进行聚类并知道它属于哪个聚类。我尝试了以下操作,但我认为 predict 的输入不正确。
from numpy import array
testdocument = gensim.utils.simple_preprocess('Microsoft excel')
cluster_label = kmeans_model.predict(array(testdocument))
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!