标签: doc2vec

doc2vec - 如何更快地推断文档向量?

我已经训练了大约 2300 个段落(每个段落在 2000-12000 个单词之间)的段落向量,每个段落的向量大小为 300。现在,我需要推断大约 100,000 个句子的段落向量,我将这些句子视为段落(每个句子大约 10-30 个)每个单词对应于之前已训练的 2300 个段落)。

所以,我正在使用

model.infer_vector(sentence)

但是,问题是它花费的时间太长,并且它不接受任何参数,例如“ workers”。!有没有办法可以通过线程或其他方式加速该过程?我使用的是带有 8GB 内存的机器,当我使用以下命令检查可用核心时

cores = multiprocessing.cpu_count()
Run Code Online (Sandbox Code Playgroud)

结果是8。

我需要这个来回答多项选择题。另外,是否还有其他库/模型doc2vec可以帮助完成此任务?

在此先感谢您的时间。

python gensim word2vec doc2vec

5
推荐指数
1
解决办法
3012
查看次数

如何使用 gensim doc2vec 训练新文本

sentences=gensim.models.doc2vec.TaggedLineDocument("raw_docs.txt")\nmodel=gensim.models.Doc2Vec(sentences,min_count=1,iter=100)\nsentence=TaggedDocument(words=[u\'\xe4\xb8\xba\xe4\xba\x86\'],tags=[u\'T1\'])\nsentences1=[sentence]\nmodel.build_vocab(sentences1,update=True)\nmodel.train(sentences1)\nprint "successful!"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想使用大数据来训练 doc2vec 模型。我想使用这个预训练模型来训练新文本。

\n\n

我只希望用预训练的模型来训练新模型。我该怎么做?上面的代码不起作用......

\n

gensim doc2vec

5
推荐指数
0
解决办法
1830
查看次数

Doc2Vec:区分句子和文档

我只是在玩来自 gensim 的 Doc2Vec,分析堆栈交换转储以分析问题的语义相似性以识别重复项。

Doc2Vec-Tutorial的教程似乎将输入描述为带标签的句子。

但是原始论文:Doc2Vec-Paper声称该方法可用于推断段落/文档的固定长度向量。

有人可以解释在这种情况下句子和文档之间的区别,以及我将如何推断段落向量。

由于一个问题有时可以跨越多个句子,我想,在训练期间,我会给来自同一个问题的句子使用相同的标签,但是我将如何在看不见的问题上对 infer_vector 执行此操作?

这个笔记本:Doc2Vec-Notebook

似乎是关于 TRAIN 和 TEST 文档的训练向量,有人可以解释这背后的基本原理吗,我也应该这样做吗?

python gensim doc2vec

5
推荐指数
1
解决办法
2051
查看次数

Doc2Vec句子聚类

我有多个包含多个句子的文档.我想使用doc2vec通过使用集群(例如k-均值)句子矢量sklearn.

因此,这个想法是类似的句子在几个集群中组合在一起.但是,我不清楚是否必须单独训练每个文档然后对句子向量使用聚类算法.或者,如果我可以在不训练每个新句子的情况下从doc2vec推断出一个句子向量.

现在这是我的代码片段:

sentenceLabeled = []
for sentenceID, sentence in enumerate(example_sentences):
    sentenceL = TaggedDocument(words=sentence.split(), tags = ['SENT_%s' %sentenceID])
    sentenceLabeled.append(sentenceL)

model = Doc2Vec(size=300, window=10, min_count=0, workers=11, alpha=0.025, 
min_alpha=0.025)
model.build_vocab(sentenceLabeled)
for epoch in range(20):
    model.train(sentenceLabeled)
    model.alpha -= 0.002  # decrease the learning rate
    model.min_alpha = model.alpha  # fix the learning rate, no decay
textVect = model.docvecs.doctag_syn0

## K-means ##
num_clusters = 3
km = KMeans(n_clusters=num_clusters)
km.fit(textVect)
clusters = km.labels_.tolist()

## Print Sentence Clusters ##
cluster_info = {'sentence': example_sentences, …
Run Code Online (Sandbox Code Playgroud)

python text-mining gensim scikit-learn doc2vec

5
推荐指数
1
解决办法
4712
查看次数

Pyspark如何从word2vec单词嵌入中计算Doc2Vec?

我有一个pyspark数据框,其中包含大约300k个唯一行的语料库,每个行都有一个"doc",每个文档包含几个文本句子.

在处理之后,我有每行/ doc的200维矢量化表示.我的NLP流程:

  1. 用正则表达式udf删除标点符号
  2. 用nltk雪球udf词干
  3. Pyspark Tokenizer
  4. Word2Vec(ml.feature.Word2Vec,vectorSize = 200,windowSize = 5)

我理解这个实现如何使用skipgram模型根据使用的完整语料库为每个单词创建嵌入.我的问题是:这个实现如何从语料库中每个单词的向量转到每个文档/行的向量?

它与gensim doc2vec实现中的过程相同,它只是简单地将每个文档中的单词向量连接在一起吗?:gensim如何计算doc2vec段落向量.如果是这样,它如何将向量切割到指定大小200(它只使用前200个单词?平均值?)?

我无法从源代码中找到信息:https://spark.apache.org/docs/2.2.0/api/python/_modules/pyspark/ml/feature.html#Word2Vec

任何帮助或参考材料,超级赞赏!

nlp apache-spark word2vec pyspark doc2vec

5
推荐指数
1
解决办法
2456
查看次数

为什么Doc2vec为相同的文本给出两个不同的向量

Doc2vec用来从单词中获取向量。请看我下面的代码:

from gensim.models.doc2vec import TaggedDocument
f = open('test.txt','r')

trainings = [TaggedDocument(words = data.strip().split(","),tags = [i]) for i,data in enumerate(f)


model = Doc2Vec(vector_size=5,  epochs=55, seed = 1, dm_concat=1)

model.build_vocab(trainings)
model.train(trainings, total_examples=model.corpus_count, epochs=model.epochs)

model.save("doc2vec.model")

model = Doc2Vec.load('doc2vec.model')
for i in range(len(model.docvecs)):
    print(i,model.docvecs[i])
Run Code Online (Sandbox Code Playgroud)

我有一个test.txt文件,它的内容有2行,并且这2行的内容是相同的(它们是“ a”),我用doc2vec训练并得到了模型,但是问题是尽管2行的内容是相同的,doc2vec给了我两个不同的向量

0 [ 0.02730868  0.00393569 -0.08150548 -0.04009786 -0.01400406]
1 [ 0.03916578 -0.06423566 -0.05350181 -0.00726833 -0.08292392]
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样。我认为这些向量将是相同的。你能解释一下吗?如果我想为相同的单词制作相同的向量,在这种情况下该怎么办?

python nlp gensim word2vec doc2vec

5
推荐指数
2
解决办法
826
查看次数

NLP:在 doc2vec / word2vec 中进行预处理

一些关于词和文档嵌入主题的论文(word2vec、doc2vec)提到他们使用斯坦福 CoreNLP 框架来标记/词形还原/词性标记输入的词/句子:

语料库使用斯坦福 CoreNLP (Manning et al., 2014) 进行词形还原和 POS 标记,并且每个标记都被替换为其引理和词性标记

( http://www.ep.liu.se/ecp/131/039/ecp17131039.pdf )

对于预处理,我们使用斯坦福 CoreNLP 对单词进行标记和小写

( https://arxiv.org/pdf/1607.05368.pdf )

所以我的问题是:

  • 为什么第一篇论文应用 POS 标签?然后每个令牌会被替换为类似的东西{lemma}_{POS},整个东西用来训练模型吗?还是标签用于过滤令牌?例如,gensims WikiCorpus 默认应用词形还原,然后只保留几种类型的词性(动词、名词等)并去除其余部分。那么推荐的方式是什么?

  • 在我看来,第二篇论文中的引述就像他们只是将单词分开然后小写。这也是我在使用维基语料库之前第一次尝试的。在我看来,这应该为文档嵌入提供更好的结果,因为大多数 POS 类型都有助于句子的含义。我对吗?

在最初的 doc2vec 论文中,我没有找到有关其预处理的详细信息。

nlp stanford-nlp gensim word2vec doc2vec

5
推荐指数
1
解决办法
517
查看次数

对段落/doc2vec 向量进行聚类时,合适的距离度量是多少?

我的目的是使用 HDBSCAN 对来自 doc2vec 的文档向量进行聚类。我想找到存在语义和文本重复的微小集群。

为此,我使用 gensim 生成文档向量。生成的 docvec 的元素均在 [-1,1] 范围内。

为了比较两个文档,我想比较角度相似度。我通过计算向量的余弦相似度来做到这一点,效果很好。

但是,要对 HDBSCAN 文档进行聚类,需要距离矩阵,而不是相似度矩阵。从余弦相似度到余弦距离的本机转换sklearn1-similarity。然而,据我了解,使用这个公式可以打破三角不等式,使其无法成为真正的距离度量。当搜索和查看其他人的类似任务的代码时,似乎大多数人似乎都在使用sklearn.metrics.pairwise.pairwise_distances(data, metric='cosine')它来定义余弦距离1-similarity。看起来它提供了适当的结果。

我想知道这是否正确,或者我是否应该使用角距离,计算为np.arccos(cosine similarity)/pi。我还看到人们在 l2 标准化文档向量上使用欧几里德距离;这似乎相当于余弦相似度。

请让我知道计算聚类文档向量之间的距离最合适的方法是什么:)

python cluster-analysis distance doc2vec hdbscan

5
推荐指数
1
解决办法
2118
查看次数

哪种方法 dm 或 dbow 对于使用 Doc2Vec 的文档相似性效果最好?

我试图找出两个文档之间的相似性。我正在使用Doc2vec Gensim来训练大约10k 文档。大约有10个字符串类型的标签。每个标签都由一个唯一的单词组成,并包含某种文档。使用分布式记忆方法训练模型。

Doc2Vec(alpha=0.025, min_alpha=0.0001, min_count=2, window=10, dm=1, dm_mean=1, epochs=50, seed=25, vector_size=100, workers=1)
Run Code Online (Sandbox Code Playgroud)

我也尝试过dmdbow。与dbow相比, dm给出了更好的结果(相似度分数)我理解dm 与 dbow的概念。但不知道哪种方法适合两个文档之间的相似性度量。

第一个问题:哪种方法在相似性方面表现最好?

model.wv.n_similarity(<words_1>, <words_2>)使用词向量给出相似度得分。

model.docvecs.similarity_unseen_docs(model, doc1, doc2)使用文档向量给出相似性得分,其中 doc1 和 doc2 不是标签/或文档标签的索引。每个 doc1 和 doc2 包含 10-20 个单词的句子。

wv.n_similaritydocvecs.similarity_unseen_docs都对相同类型的文档提供不同的相似度分数。

与wv.n_similarity相比,docvecs.similarity_unseen_docs给出了一点好的结果,但wv.n_similarity有时也给出了很好的结果。

问题:docvecs.similarity_unseen_docs 和 wv.n_similarity 之间有什么区别?我可以使用 docvecs.similarity_unseen_docs 来查找未见过的数据之间的相似度分数(这可能是一个愚蠢的问题)?

我为什么问这个问题,因为docvecs.similarity_unseen_docs提供标签上的相似度分数,而不是属于其标签的实际单词的相似度分数。我不确定,如果我错了,请纠正我。 …

similarity python-3.x gensim doc2vec

5
推荐指数
1
解决办法
2841
查看次数

AttributeError:“Word2Vec”对象没有属性“most_similar”(Word2Vec)

我正在使用 Word2Vec 并使用 wiki 训练模型来给出最相似的单词。我之前运行过这个并且它有效,但是现在即使在重新运行整个程序后它也会给我这个错误。我尝试起飞 return_path=True,但仍然遇到同样的错误

print(api.load('glove-wiki-gigaword-50', return_path=True))
model.most_similar("glass")
Run Code Online (Sandbox Code Playgroud)

#错误:

/Users/me/gensim-data/glove-wiki-gigaword-50/glove-wiki-gigaword-50.gz
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-153-3bf32168d154> in <module>
      1 print(api.load('glove-wiki-gigaword-50', return_path=True))
----> 2 model.most_similar("glass") 

AttributeError: 'Word2Vec' object has no attribute 'most_similar'
Run Code Online (Sandbox Code Playgroud)

#MODEL这是我用的模型

    print(
        '%s (%d records): %s' % (
            model_name,
            model_data.get('num_records', -1),
            model_data['description'][:40] + '...',
        )
    )
Run Code Online (Sandbox Code Playgroud)

编辑:这是我的 gensim 下载和输出

!python -m pip install -U gensim
Run Code Online (Sandbox Code Playgroud)

输出:

已满足要求:.​​/opt/anaconda3/lib/python3.8/site-packages (4.0.1) 中的 gensim

已满足要求: ./opt/anaconda3/lib/python3.8/site-packages 中的 numpy>=1.11.3 (来自 gensim)(1.20.1)

已满足要求:smart-open>=1.8.1 in ./opt/anaconda3/lib/python3.8/site-packages (来自 gensim) (5.1.0)

已满足要求:.​​/opt/anaconda3/lib/python3.8/site-packages 中的 scipy>=0.18.1 …

python nlp gensim word2vec doc2vec

5
推荐指数
1
解决办法
2万
查看次数