#python #nlp #word2vec #doc2vec
#python #nlp #word2vec #doc2vec
Вопрос:
Я собрал несколько обзоров продуктов на веб-сайте от разных пользователей и пытаюсь найти сходства между продуктами с помощью встраивания слов, используемых пользователями. Я сгруппировал каждый обзор для каждого продукта, так что у меня могут быть разные обзоры, следующие один за другим в моем фрейме данных (т.Е. Разные авторы для одного продукта).). Кроме того, я также уже маркировал обзоры (и все другие методы предварительной обработки). Ниже приведен макет фрейма данных того, что у меня есть (список токенов для каждого продукта на самом деле очень большой, как и количество продуктов):
Продукт | reviews_tokenized |
---|---|
XGame3000 | абсолютно потрясающий симулятор кажется недоступным… |
Poliamo | эффект производственной ценности имеет тенденцию скорее покрывать… |
Артемис | абсолютно фантастическое, возможно, хорошее масло… |
Ratoiin | возможность имитировать аварийный оператор города… |
Однако я не уверен, что было бы наиболее эффективным между Doc2Vec и Word2Vec. Сначала я бы выбрал Doc2Vec, поскольку у него есть возможность находить сходства, принимая во внимание абзац / предложение, и находить его тему (что я хотел бы иметь, поскольку я пытаюсь группировать продукты по темам), но меня немного беспокоит тот факт, чтообзоры от разных авторов и, следовательно, могут искажать вложения? Обратите внимание, что я новичок в NLP и встраиваниях, поэтому некоторые понятия могут ускользнуть от меня. Ниже приведен мой код для Doc2Vec, который дает мне довольно хорошую оценку силуэта (~ 0,7).
product_doc = [TaggedDocument(doc.split(' '), [i]) for i, doc in enumerate(df.tokens)]
model3 = Doc2Vec(min_count=1, seed = SEED, ns_exponent = 0.5)
model3.build_vocab(product_doc)
model3.train(product_doc, total_examples=model3.corpus_count, epochs=model3.epochs)
product2vec = [model3.infer_vector((df['tokens'][i].split(' '))) for i in range(0,len(df['tokens']))]
dtv = np.array(product2vec)
Как вы думаете, что было бы наиболее эффективным методом решения этой проблемы? Если что-то недостаточно ясно, или еще, пожалуйста, скажите мне.
Спасибо за вашу помощь.
Комментарии:
1. Почему вы тренируете собственное встраивание? Вы пробовали использовать предварительно подготовленную модель doc2vec или word2vec (или даже transformer ?)? Если у вас есть несколько обзоров на продукт, я предлагаю вам кодировать каждый обзор отдельно, а затем найти способ их объединения (чтобы документы не были слишком длинными и были сегментированы). Какова ваша цель при кластеризации, которую вы делаете?
2. Я не понимаю, что вы собираетесь делать. Но вы можете использовать word2vec, чтобы присвоить каждому слову вектор, а doc2vec — каждому документу вектор. Кроме того, вы можете получить среднее значение векторов word2vec, чтобы получить вектор для документа.
3. @ygorg Цель состоит в том, чтобы перегруппировать продукты вместе, используя отзывы пользователей как способ найти сходства между продуктами (пользователи могут использовать некоторые похожие слова для описания некоторых продуктов, таким образом, эти продукты могут быть объединены в группу). Я действительно использовал предварительно обученную модель (точнее, wiki-news-300d-1M), но оценка силуэта была ниже, чем при обучении ее на моей собственной модели (которая довольно велика, поэтому я подумал, что это не будет проблемой).
4. @parvanehshayegh Я описал цель в своем другом комментарии, но идея заключалась в том, что, поскольку doc2vec может учитывать абзац / предложение, чтобы запомнить, чего не хватает в текущем контексте / теме, я подумал, что это будет наиболее эффективно.
5. Я не знаком с оценкой silhouette, является ли 0.7 хорошей оценкой? Смогли ли вы оценить встраивания, которые вы обучили? Вы проверили кластеры, чтобы увидеть, хорошо ли они «выглядели». Знаете ли вы некоторые элементы, которые должны находиться в одном кластере, чтобы у вас была какая-то ссылка для оценки? Кроме того, вы имеете дело с текстом, созданным для использования, поэтому модель, обученная в социальных сетях, может быть лучше, чем модель, обученная в Википедии.
Ответ №1:
Невозможно определить, какое конкретное сочетание методов будет работать лучше всего для конкретного набора данных и конкретной конечной цели: вам действительно нужно попробовать их друг против друга в вашем собственном многоразовом конвейере, чтобы сопоставить их с желаемыми результатами.
Похоже, вы уже разделили документы до ключевых слов, а не до исходного естественного текста, что может повредить этим алгоритмам — возможно, вы захотите попробовать оба способа.
В зависимости от размера и формата ваших текстов вы также можете рассмотреть возможность сравнения «расстояния перемещения слов» (WMD) между предложениями (или другими небольшими логическими фрагментами ваших данных). В некоторых работах были продемонстрированы интересные результаты поиска «похожих проблем» (даже с разными формулировками) в домене обзора, например: https://tech.opentable.com/2015/08/11/navigating-themes-in-restaurant-reviews-with-word-movers-distance/
Обратите внимание, однако, что WMD становится довольно дорогостоящим для массового вычисления с большими текстами.