Gensim's Doc2Ve c - Как использовать предварительно обученное word2ve c (сходство слов) - PullRequest
0 голосов
/ 18 февраля 2020

У меня нет большого количества данных, чтобы обучить сходству слов, например, «горячий» больше похож на «теплый», чем на «холодный». Однако мне нравится обучать doc2ve c на относительно небольшом корпусе ~ 100 документов, чтобы он мог классифицировать документы моего домена с указанием c документов.

Для уточнения позвольте мне использовать этот пример с игрушкой. Предположим, у меня есть только 4 учебных документа с 4 предложениями: «Я люблю горячий шоколад», «Я ненавижу горячий шоколад», «Я люблю горячий чай» и «Я люблю горячий пирог». Учитывая тестовый документ «Я обожаю горячий шоколад», я ожидаю, что doc2ve c неизменно выдаст «Я люблю горячий шоколад». как ближайший документ. Это ожидание будет верным, если word2ve c уже дает знание, что «обожать» очень похоже на «любовь». Тем не менее, я получаю наиболее похожий документ, как «Я ненавижу горячий шоколад» - что странно !!

Любое предложение о том, как обойти это, т.е. иметь возможность использовать предварительно обученные вложения слов, чтобы Мне не нужно рисковать в обучении «обожаю» близко к «любви», «ненависть» близка к «ненависти» и т. Д.

Код (Jupyter Nodebook. Python 3.7. Дженсим 3.8.1)

from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
data = ["I love hot chocolate.",
        "I hate hot chocolate",
       "I love hot tea.",
       "I love hot cake."]

tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(data)]
print(tagged_data)
#Train and save
max_epochs = 10
vec_size = 5
alpha = 0.025


model = Doc2Vec(vector_size=vec_size, #it was size earlier
                alpha=alpha, 
                min_alpha=0.00025,
                min_count=1,
                dm =1)

model.build_vocab(tagged_data)

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

print("Model Ready")

test_sentence="I adore hot chocolate"
test_data = word_tokenize(test_sentence.lower())
v1 = model.infer_vector(test_data)
#print("V1_infer", v1)

# to find most similar doc using tags
sims = model.docvecs.most_similar([v1])
print("\nTest: %s\n" %(test_sentence))
for indx, score in sims:
    print("\t(score: %.4f) %s" %(score, data[int(indx)]))

1 Ответ

1 голос
/ 18 февраля 2020

Всего ~ 100 документов слишком мало для осмысленного обучения модели Doc2Vec (или Word2Vec). Опубликованная Doc2Vec работа имеет тенденцию использовать от десятков тысяч до миллионов документов.

В той степени, в которой вы сможете получить слегка значимые результаты из небольших наборов данных, вам обычно нужно будет уменьшить вектор- размеры намного - намного меньше, чем количество слов / примеров - и увеличивают эпохи обучения. (У ваших игрушечных данных есть 4 текста и 6 уникальных слов. Даже для получения 5-мерных векторов вам, вероятно, понадобится что-то вроде 5 ^ 2 ограничивающих документов.)

Кроме того, Doc2Vec от gensim не предлагает никаких официальных возможность импортировать слова-слова из других мест. Внутреннее Doc2Vec обучение - это не процесс, в котором слово-векторы обучаются 1-ым, а затем вычисляются c -векторы. Скорее всего, c -векторы и словосочетания обучаются одновременно, постепенно улучшаясь вместе. (Некоторые режимы, такие как быстрый и часто очень эффективный DBOW, который можно включить с помощью dm=0, вообще не создают и не используют векторы слов.)

На самом деле в ваших 4 нет ничего странного -присутствие результатов, если смотреть на данные так, как если бы мы были алгоритмами Doc2Vec или Word2Vec, которые не имеют предварительных знаний о словах, а только то, что находится в данных обучения. В ваших тренировочных данных токен 'love' и токен 'hate' используются практически одинаково, с одинаковыми окружающими словами. Только увидев множество едва различимых альтернативных вариантов использования слов, наряду со многими контрастирующими окружающими словами, эти модели «плотного встраивания» могут переместить векторы слов на полезные относительные позиции, где они ближе к связанным словам и дальше от других слов. (И, так как вы не предоставили обучающие данные с токеном 'adore', модель ничего не знает об этом слове - и если оно предоставлено в тестовом документе, как если бы оно было в методе infer_vector() модели, оно будет проигнорировано. Таким образом, тестовый документ, который он «видит», - это только известные слова ['i', 'hot', 'chocolate'].)

Но также, даже если вам удалось тренироваться на большом наборе данных или каким-то образом внедрить знания из других векторов слов, которые 'love' и 'adore' в некоторой степени похожи, важно отметить, что антонимы, как правило, очень похожи в наборах слов-векторов, так как они используются в одних и тех же контекстах, часто синтаксически взаимозаменяемы и одной и той же общей категории. , Эти модели часто не очень хорошо хорошо распознают воспринимаемое человеком изменение значения путем замены слова на его антоним (или вставкой единственного слова «не» или других слов с изменяющимся намерением) ,

В конечном счете, если вы хотите использовать Doc2Vec от gensim, вы должны обучить его гораздо большему количеству данных. (Если вы были готовы взять некоторые другие предварительно обученные векторы слов, почему бы не получить какой-то другой источник несколько похожих предложений массовых предложений? Эффект от использования данных, который не совсем соответствует вашей реальной проблеме, будет аналогичным, если вы используете это внешние данные с помощью объемного текста или предварительно обученной модели.)

Наконец: это плохой, подверженный ошибкам шаблон, который вызывает train() более одного раза в вашем собственном l oop, с вашим собственным alpha корректировки. Вы можете просто позвонить ему один раз с нужным номером epochs, и модель выполнит несколько тренировочных проходов и будет плавно управлять внутренним alpha в течение нужного количества эпох.

...