为什么 Gensim most similar in doc2vec 给出与输出相同的向量?
Why Gensim most similar in doc2vec gives the same vector as the output?
我正在使用以下代码获取用户帖子的有序列表。
model = doc2vec.Doc2Vec.load(doc2vec_model_name)
doc_vectors = model.docvecs.doctag_syn0
doc_tags = model.docvecs.offset2doctag
for w, sim in model.docvecs.most_similar(positive=[model.infer_vector('phone_comments')], topn=4000):
print(w, sim)
fw.write(w)
fw.write(" (")
fw.write(str(sim))
fw.write(")")
fw.write("\n")
fw.close()
但是,我还在列表的第 6 位获得了矢量 "phone comments"
(我用来查找最近的邻居)。我在代码中有什么错误吗?还是 Gensim 中的问题(因为向量不能与其自身相邻)?
编辑
Doc2vec模型训练代码
######Preprocessing
docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for key, value in my_d.items():
value = re.sub("[^1-9a-zA-Z]"," ", value)
words = value.lower().split()
tags = key.replace(' ', '_')
docs.append(analyzedDocument(words, tags.split(' ')))
sentences = [] # Initialize an empty list of sentences
######Get n-grams
#Get list of lists of tokenised words. 1 sentence = 1 list
for item in docs:
sentences.append(item.words)
#identify bigrams and trigrams (trigram_sentences_project)
trigram_sentences_project = []
bigram = Phrases(sentences, min_count=5, delimiter=b' ')
trigram = Phrases(bigram[sentences], min_count=5, delimiter=b' ')
for sent in sentences:
bigrams_ = bigram[sent]
trigrams_ = trigram[bigram[sent]]
trigram_sentences_project.append(trigrams_)
paper_count = 0
for item in trigram_sentences_project:
docs[paper_count] = docs[paper_count]._replace(words=item)
paper_count = paper_count+1
# Train model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 5, workers = 4, iter = 20)
#Save the trained model for later use to take the similarity values
model_name = user_defined_doc2vec_model_name
model.save(model_name)
infer_vector()
方法需要一个标记列表,就像使用的文本示例(通常是 TaggedDocument
对象)的 words
属性训练模型。
您正在提供一个简单的字符串 'phone_comments'
,它看起来 infer_vector()
类似于列表 ['p', 'h', 'o', 'n', 'e', '_', 'c', 'o', 'm', 'm', 'e', 'n', 't', 's']
。因此,most_similar()
的原始向量可能是垃圾。
此外,您返回的不是输入 'phone_comments'
,而是不同的字符串 'phone comments'
。如果这是模型中的标签名称,那么它一定是在模型训练期间提供的 tag
。它与 phone_comments
表面上的相似性可能没有意义——它们是不同的字符串。
(但也可能暗示你的训练也有问题,将本应words=['phone', 'comments']
的文本训练成了words=['p', 'h', 'o', 'n', 'e', ' ', 'c', 'o', 'm', 'm', 'e', 'n', 't', 's']
。)
我正在使用以下代码获取用户帖子的有序列表。
model = doc2vec.Doc2Vec.load(doc2vec_model_name)
doc_vectors = model.docvecs.doctag_syn0
doc_tags = model.docvecs.offset2doctag
for w, sim in model.docvecs.most_similar(positive=[model.infer_vector('phone_comments')], topn=4000):
print(w, sim)
fw.write(w)
fw.write(" (")
fw.write(str(sim))
fw.write(")")
fw.write("\n")
fw.close()
但是,我还在列表的第 6 位获得了矢量 "phone comments"
(我用来查找最近的邻居)。我在代码中有什么错误吗?还是 Gensim 中的问题(因为向量不能与其自身相邻)?
编辑
Doc2vec模型训练代码
######Preprocessing
docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for key, value in my_d.items():
value = re.sub("[^1-9a-zA-Z]"," ", value)
words = value.lower().split()
tags = key.replace(' ', '_')
docs.append(analyzedDocument(words, tags.split(' ')))
sentences = [] # Initialize an empty list of sentences
######Get n-grams
#Get list of lists of tokenised words. 1 sentence = 1 list
for item in docs:
sentences.append(item.words)
#identify bigrams and trigrams (trigram_sentences_project)
trigram_sentences_project = []
bigram = Phrases(sentences, min_count=5, delimiter=b' ')
trigram = Phrases(bigram[sentences], min_count=5, delimiter=b' ')
for sent in sentences:
bigrams_ = bigram[sent]
trigrams_ = trigram[bigram[sent]]
trigram_sentences_project.append(trigrams_)
paper_count = 0
for item in trigram_sentences_project:
docs[paper_count] = docs[paper_count]._replace(words=item)
paper_count = paper_count+1
# Train model
model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 5, workers = 4, iter = 20)
#Save the trained model for later use to take the similarity values
model_name = user_defined_doc2vec_model_name
model.save(model_name)
infer_vector()
方法需要一个标记列表,就像使用的文本示例(通常是 TaggedDocument
对象)的 words
属性训练模型。
您正在提供一个简单的字符串 'phone_comments'
,它看起来 infer_vector()
类似于列表 ['p', 'h', 'o', 'n', 'e', '_', 'c', 'o', 'm', 'm', 'e', 'n', 't', 's']
。因此,most_similar()
的原始向量可能是垃圾。
此外,您返回的不是输入 'phone_comments'
,而是不同的字符串 'phone comments'
。如果这是模型中的标签名称,那么它一定是在模型训练期间提供的 tag
。它与 phone_comments
表面上的相似性可能没有意义——它们是不同的字符串。
(但也可能暗示你的训练也有问题,将本应words=['phone', 'comments']
的文本训练成了words=['p', 'h', 'o', 'n', 'e', ' ', 'c', 'o', 'm', 'm', 'e', 'n', 't', 's']
。)