Doc2Vec: странные результаты с model.docvecs.most_simil - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь обучить модель, чтобы получить сходство предложений (В моем случае названия какой-либо организации)

Я использую для обучения модель

names_tok = [TaggedDocument(words=word_tokenize(name.lower()), tags=[str(i)])
                        for (i, name) in enumerate(names)]

# train model
max_epochs = 50
vec_size = 50
alpha = 0.025

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

И я получаю результаты с

name = word_tokenize(name.lower())
infer_v = model.infer_vector(name)
results = model.docvecs.most_similar([infer_v]))

И он возвращает странные результаты для всех тестов.Я уже пытался использовать пример из данных поезда, и у меня его нет схожести.Например Филип Моррис Продактс С.А. Я получаю следующие результаты

Найк Инноувейт С.В.: 0.9336682558059692

СОСЬЕТЕ ДЕ ПРОДЮИ НЕСТЛЕ С.А.: 0.9370058178901672

Юнилевер Н.В.: 0.9347286224365234

Мерк Шарп и Доум Корп.: 0.9339677095413208

И я не могу понять, Почему я получаю это.У меня есть 180 000 примеров данных поезда.Как я могу улучшить результаты моей модели?

1 Ответ

0 голосов
/ 20 февраля 2019

Не похоже, что в вашем коде сходства есть какие-либо очевидные ошибки, но учтите, что, поскольку вы не указали параметр epochs при создании модели, он будет внутренне настроен на использование только 5 проходов при выводе.(Обычная работа Doc2Vec использует 10-20 и более, и иногда вывод может принести пользу больше, особенно для небольших текстов.)

Кроме того, ваш вопрос не показывает ваш обучающий код - и многие примеры в Интернете включают вопиющие ошибкив обработке epochs и alpha.

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

Но не ясно, какое сходство вы ищете.Если это чисто поверхностное / морфологическое, вы можете анализировать имена по фрагментным фрагментам - символам в n-граммах - вместо слов, разделенных пробелами.Если это более тонкое сходство целей, отрасли или общественного восприятия, то метаданные, отличные от литеральных имен, могут быть более полезными, например:

  • использование имен на естественном языкеконтексты
  • самоописания сущностей, в произвольной форме или по категориям в контролируемые таксономии
  • описания сущностей сторонних организаций

Сохранение даже появляющихся токеновтолько один раз - min_count=1 - также может ослабить слова-векторы / документы-документы, поскольку существует мало обобщающих значений, которые можно извлечь из, вероятно, уникальных вхождений, но совокупное появление всех этих редких слов вносит шумное вмешательство в обучениедругие окружающие более распространенные слова.Для больших корпусов на естественном языке с большим количеством примеров соответствующих словарных токенов, часто увеличение min_count может улучшить качество модели.

...