Почему Gensim наиболее похож в doc2vec дает тот же вектор, что и вывод? - PullRequest
0 голосов
/ 24 сентября 2018

Я использую следующий код для получения упорядоченного списка пользовательских сообщений.

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()

Однако я также получаю вектор "phone comments" (который я использую, чтобы найти ближайших соседей) примерно как 6-йместо в списке.Есть ли какая-то ошибка, которую я делаю в коде?или это проблема в Gensim (потому что вектор не может быть соседом самого себя)?

EDIT

Код обучения модели 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)

1 Ответ

0 голосов
/ 25 сентября 2018

Метод infer_vector() ожидает список токенов, точно так же, как свойство words текстовых примеров (обычно TaggedDocument объектов), которые использовались для обучения модели.

Вы предоставляете простую строку, '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'].)

...