我已经训练了大约 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可以帮助完成此任务?
在此先感谢您的时间。
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!"\nRun Code Online (Sandbox Code Playgroud)\n\n我想使用大数据来训练 doc2vec 模型。我想使用这个预训练模型来训练新文本。
\n\n我只希望用预训练的模型来训练新模型。我该怎么做?上面的代码不起作用......
\n我只是在玩来自 gensim 的 Doc2Vec,分析堆栈交换转储以分析问题的语义相似性以识别重复项。
Doc2Vec-Tutorial上的教程似乎将输入描述为带标签的句子。
但是原始论文:Doc2Vec-Paper声称该方法可用于推断段落/文档的固定长度向量。
有人可以解释在这种情况下句子和文档之间的区别,以及我将如何推断段落向量。
由于一个问题有时可以跨越多个句子,我想,在训练期间,我会给来自同一个问题的句子使用相同的标签,但是我将如何在看不见的问题上对 infer_vector 执行此操作?
这个笔记本:Doc2Vec-Notebook
似乎是关于 TRAIN 和 TEST 文档的训练向量,有人可以解释这背后的基本原理吗,我也应该这样做吗?
我有多个包含多个句子的文档.我想使用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) 我有一个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
任何帮助或参考材料,超级赞赏!
我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)
我不知道为什么会这样。我认为这些向量将是相同的。你能解释一下吗?如果我想为相同的单词制作相同的向量,在这种情况下该怎么办?
一些关于词和文档嵌入主题的论文(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 论文中,我没有找到有关其预处理的详细信息。
我的目的是使用 HDBSCAN 对来自 doc2vec 的文档向量进行聚类。我想找到存在语义和文本重复的微小集群。
为此,我使用 gensim 生成文档向量。生成的 docvec 的元素均在 [-1,1] 范围内。
为了比较两个文档,我想比较角度相似度。我通过计算向量的余弦相似度来做到这一点,效果很好。
但是,要对 HDBSCAN 文档进行聚类,需要距离矩阵,而不是相似度矩阵。从余弦相似度到余弦距离的本机转换sklearn是1-similarity。然而,据我了解,使用这个公式可以打破三角不等式,使其无法成为真正的距离度量。当搜索和查看其他人的类似任务的代码时,似乎大多数人似乎都在使用sklearn.metrics.pairwise.pairwise_distances(data, metric='cosine')它来定义余弦距离1-similarity。看起来它提供了适当的结果。
我想知道这是否正确,或者我是否应该使用角距离,计算为np.arccos(cosine similarity)/pi。我还看到人们在 l2 标准化文档向量上使用欧几里德距离;这似乎相当于余弦相似度。
请让我知道计算聚类文档向量之间的距离最合适的方法是什么:)
我试图找出两个文档之间的相似性。我正在使用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)
我也尝试过dm和dbow。与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_similarity和docvecs.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提供标签上的相似度分数,而不是属于其标签的实际单词的相似度分数。我不确定,如果我错了,请纠正我。 …
我正在使用 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 …
doc2vec ×10
gensim ×8
python ×6
word2vec ×5
nlp ×4
apache-spark ×1
distance ×1
hdbscan ×1
pyspark ×1
python-3.x ×1
scikit-learn ×1
similarity ×1
stanford-nlp ×1
text-mining ×1