Doc2Vec найти подобное предложение - PullRequest
1 голос
/ 02 октября 2019

Привет, я пытаюсь найти похожее предложение, используя doc2vec. То, что я не могу найти, - это реальное предложение, совпадающее с обученными предложениями.

Ниже приведен код ссылка

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
data = ["I love machine learning. Its awesome.",
        "I love coding in python",
        "I love building chatbots",
        "they chat amagingly well"]

tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(data)]
max_epochs = 100
vec_size = 20
alpha = 0.025

model = Doc2Vec(size=vec_size,
                alpha=alpha, 
                min_alpha=0.00025,
                min_count=1,
                dm =1)

model.build_vocab(tagged_data)

for epoch in range(max_epochs):
    print('iteration {0}'.format(epoch))
    model.train(tagged_data,
                total_examples=model.corpus_count,
                epochs=model.iter)
    # decrease the learning rate
    model.alpha -= 0.0002
    # fix the learning rate, no decay
    model.min_alpha = model.alpha

model.save("d2v.model")
print("Model Saved")

model= Doc2Vec.load("d2v.model")
#to find the vector of a document which is not in training data
test_data = word_tokenize("I love building chatbots".lower())
v1 = model.infer_vector(test_data)
print("V1_infer", v1)

# to find most similar doc using tags
similar_doc = model.docvecs.most_similar('1')
print(similar_doc)


# to find vector of doc in training data using tags or in other words, printing the vector of document at index 1 in training data
print(model.docvecs['1'])

Но только приведенный выше коддает мне векторы или числа. Но как я могу получить фактическое предложение совпадает с данными обучения. Например, в этом случае я ожидаю результат «Я люблю создавать чат-ботов».

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Doc2Vec не даст хороших результатов для наборов данных игрушечного размера, поэтому не стоит ожидать ничего значащего, пока не будет использовано гораздо больше данных.

Но также модель Doc2Vec не содержит в себе полных текстов, которые вы предоставляете во время обучения. Он просто запоминает изученные векторы для каждого текста tag - который обычно является уникальным идентификатором. Поэтому, когда вы получите обратно результаты из most_similar(), вы получите обратно tag значения, которые вам нужно будет найти самостоятельно, в своем собственном коде / данных, чтобы получить полные документы.

Отдельно:

Вызов train() несколько раз в цикле, как вы делаете, является плохой и подверженной ошибкам идеей, как и явное управление alpha / min_alpha. Вы не должны следовать ни одному учебнику / руководству, которое рекомендует такой подход.

Не изменяйте значения по умолчанию для параметров alpha и вызывайте train() один раз с желаемым счетом epochs - и это сделает правильное количество проходов и правильное управление скоростью обучения,

1 голос
/ 02 октября 2019

Вывод similar_doc: [('2', 0.991769552230835), ('0', 0.989276111125946), ('3', 0.9854298830032349)]

Показывает оценку сходства каждого документа в data с запрошенным документом и сортируется в порядке убывания.

Исходя из этого, '2' index в data является наиболее близким к запрашиваемым данным, т.е. test_data.

print(data[int(similar_doc[0][0])])
// prints: I love building chatbots

Примечание: этот код каждый раз дает разные результаты, может быть, вам нужна лучшая модель или больше тренировочных данных.

Надеюсь, это поможет. Удачи.

...