Gensim Doc2Vec Most_Similar

У меня проблемы с методом most_similar в модели Gensim Doc2Vec. Когда я запускаю most_similar, я получаю сходство только с первыми 10 документами с тегами (на основе их тегов - всегда от 0 до 9). Для этого кода у меня есть topn = 5, но я использовал topn = len (документы), и я по-прежнему получаю сходство только для первых 10 документов.

Документы с тегами:

tokenizer = RegexpTokenizer(r'\w+')
taggeddoc=[]

for index,wod in enumerate(model_data):
    wordslist=[]
    tagslist=[]
    tokens = tokenizer.tokenize(wod)

    td = TaggedDocument(gensim.utils.to_unicode(str.encode(' '.join(tokens))).split(), str(index)) 
    taggeddoc.append(td)

documents=taggeddoc

Создайте экземпляр модели:

model=gensim.models.Doc2Vec(documents, dm=0, dbow_words=1, iter=1, alpha=0.025, min_alpha=0.025, min_count=10)

Обучите модель:

for epoch in range(100):
    if epoch % 10 == 0:
        print("Training epoch {}".format(epoch))
    model.train(documents, total_examples=model.corpus_count, epochs=model.iter)
    model.alpha -= 0.002
    model.min_alpha = model.alpha

Проблема здесь (я думаю):

new = model_data[100].split()
new_vector = model.infer_vector(new)
sims = model.docvecs.most_similar([new_vector], topn=5)
print(sims)

Выход:

[('3', 0.3732905089855194), ('1', 0.36121609807014465), ('7', 0.35790640115737915), ('9', 0.3569292724132538), ('2', 0.3521473705768585)]

Длина документов одинакова до и после обучения модели. Не уверен, почему он возвращает сходство только для первых 10 документов.

Дополнительный вопрос: по любому опыту, лучше ли использовать Word2Vec или Doc2Vec, если входные документы очень короткие (~ 50 слов) и имеется> 2000 документов? Спасибо за помощь!


person J. Collins    schedule 11.02.2018    source источник


Ответы (1)


Второй аргумент TaggedDocument(), tags, должен быть списком тегов, не отдельной строкой.

Предоставляя отдельные строки простых целых чисел, таких как '109', которые интерпретируются как список тегов ['1', '0', '9'] - и, таким образом, во всем вашем корпусе будут встречаться / обучаться только 10 уникальных тегов, цифры 0-9.

Сделайте его списком с одним тегом, например [str(index)], и вы получите результаты, более похожие на то, что вы ожидаете.

Что касается вашего побочного вопроса, то и Word2Vec, и Doc2Vec лучше всего работают с большими корпусами с миллионами слов в обучающих данных. Всего 2000 документов *, не более 50 слов каждый, дающие не более 100 000 обучающих слов, очень мало для этих алгоритмов. Возможно, вы сможете добиться некоторых незначительных результатов, используя гораздо меньшую size модель и намного больше тренировочных iter проходов, но это не тот тип набора данных / проблемы, на котором эти алгоритмы работают хорошо.

По отдельности, ваш обучающий код совершенно неверен.

  • Если вы предоставите documents для Doc2Vec инициализации, он сделает все необходимое для открытия словаря и iter обучение пройдет автоматически - больше не вызывайте train().

  • И если по какой-то причине вы не предоставляете documents при инициализации, вам обычно следует затем вызывать и build_vocab(), и train() каждый ровно один раз.

  • Практически никто не должен изменять min_alpha или вызывать train() более одного раза в явном цикле: вы почти наверняка сделаете это неправильно, как здесь, где вы уменьшите эффективный alpha с 0,025 на 0,002 за 100 циклов, в результате чего бессмысленная отрицательная скорость обучения -0,175. Не делайте этого, и если вы скопировали этот подход из того, что казалось надежным онлайн-источником, сообщите этому источнику, что их код запутался.

person gojomo    schedule 12.02.2018
comment
Спасибо @gojomo. Вы порекомендуете модель / библиотеку для корпуса моего размера? - person J. Collins; 18.02.2018
comment
Я думаю, что в основном код в вопросе следует примеру здесь red-technologies.com/doc2vec-tutorial что немного сбивает с толку. - person athlonshi; 10.09.2019
comment
См. IMPORTANT NOTE в верхней части этого старого сообщения в блоге - с тех пор, как это было написано, было внесено много изменений в библиотеку и улучшился опыт. Примеры записных книжек в комплекте с gensim, в том числе связанная, являются лучшими примерами рекомендуемой практики. - person gojomo; 10.09.2019