Відповіді:
Існує кілька різних способів вирішити це залежно від того, скільки саме семантичної інформації ви хочете зберегти та наскільки легко ваші документи токенізувати (html-документи, мабуть, досить складно токенізувати, але ви могли б зробити щось із тегами та контекстом .)
Деякі з них були згадані ffriend, а абзаци векторів користувачем1133029 - це справді солідний, але я просто подумав, що буду заглиблюватися в більшу глибину щодо плюсів і мінусів різних підходів.
edit distance
, це зазвичай просто використовується на рівні окремих токенів (слова, біграми тощо). Взагалі я б не рекомендував цю метрику, оскільки вона не тільки відкидає будь-яку смислову інформацію, але також має тенденцію дуже подібним чином трактувати різні зміни слів, але це надзвичайно поширена метрика для подібного родуtopic modeling
. LSA вийшов з моди зовсім недавно, і на мій досвід, це не зовсім сильний підхід до моделювання теми, але він порівняно простий у здійсненні та має кілька реалізацій з відкритим кодомtopic modeling
, але вона відрізняється LSA
тим, що насправді вивчає внутрішні уявлення, які, як правило, більш плавні та інтуїтивні. Взагалі результати, які ви отримуєте LDA
, краще для моделювання подібності документів LSA
, але не настільки хороші для того, щоб навчитися сильно розмежовувати теми.LDA
Єдиний мінус полягає в тому, що тренуватись потрібно трохи більше часу, а впровадження з відкритим кодом трохи складніше:Count Vectorizers
і TF-IDF
. Word2vec чудовий тим, що має ряд реалізацій з відкритим кодом. Коли у вас є вектор, будь-який інший показник подібності (наприклад, відстань косинуса) можна використовувати поверх нього зі значно більшою ефективністю.paragraph vectors
, це останній і найбільший у серії робіт Google, які розглядають щільні векторні зображення документів. gensim
Бібліотека Python має реалізація , word2vec
що є досить простим , що він може досить розумно бути використані для складання doc2vec
, але переконайтеся , щоб зберегти ліцензію на увазі , якщо ви хочете йти цим шляхомСподіваюся, що це допоможе, повідомте мені, якщо у вас є якісь питання.
Існує ряд семантичних заходів дистанції, кожен зі своїми плюсами і мінусами. Ось лише декілька з них:
Почніть з найпростішого підходу, а потім рухайтеся далі, виходячи з питань для вашого конкретного випадку.
Емпірично я виявляв, що LSA значно перевершує LDA кожного разу, і на кожному наборі даних я намагався його використовувати. Я спілкувався з іншими людьми, які сказали те саме. Він також використовувався для перемоги в ряді змагань SemEval для вимірювання смислової подібності між документами, часто в поєднанні з мірою, що базується на wordnet, тому я б не сказав, що він виходить з моди, або, безумовно, поступається LDA, що краще для моделювання теми та не семантичної подібності в моєму досвіді, всупереч тому, що заявили деякі респонденти.
Якщо ви використовуєте gensim (бібліотеку python), він має LSA, LDA та word2vec, тому ви можете легко порівняти 3. doc2vec - це класна ідея, але не дуже масштабний, і вам, швидше за все, доведеться реалізувати його як я не знаючи про будь-які реалізації з відкритим кодом. Це не так добре, як для кожного документа, нову та окрему модель потрібно побудувати за допомогою SGD, алгоритму повільного машинного навчання. Але це, мабуть, дасть найточніші результати. LSA та LDA також не мають масштабних масштабів (одначе, Word2vec робить), LDA загалом гіршає. Однак реалізація Gensim дуже швидка, оскільки вона використовує ітеративний SVD.
Ще одна примітка: якщо ви використовуєте word2vec, вам все одно доведеться визначити спосіб складання векторів з документів, оскільки це дає вам різний вектор на слово. Найпростіший спосіб зробити це - нормалізувати кожен вектор і взяти середнє значення для всіх векторів слів у документі, або взяти середнє зважене значення за значенням idf для кожного слова. Тож це не так просто, як "використовувати word2vec", вам потрібно буде зробити щось далі, щоб обчислити схожість документа.
Я особисто ходив би з LSA, оскільки бачив, що це працює емпірично, і бібліотека gensim дуже добре масштабується. Однак безкоштовного обіду немає, тому бажано спробувати кожен метод і побачити, який краще працює для ваших даних.
Найсучаснішими видаються "вектори абзацу", представлені в недавньому документі: http://cs.stanford.edu/~quocle/paragraph_vector.pdf . Косину / евклідова відстань між векторами абзацу, швидше за все, спрацює краще, ніж будь-який інший підхід. Це, мабуть, ще неможливо через відсутність реалізації відкритого коду.
Наступне найкраще - це косинусова відстань між векторами LSA або відстань косинуса між неочищеними векторами BOW. Іноді краще вибирати різні схеми зважування, наприклад TF-IDF.
Корисно мати в собі сумку з інструментами сімейства алгоритмів хешування чутливих для місцевості . Ця сім'я зовсім не семантична. Насправді розглядається текст як послідовність бітів. Мені здається корисним у брудних наборах даних, коли один і той же текст з’являється багато разів з невеликими відмінностями.
Ви можете використовувати ssdeep (який заснований на хелі Nilsimsa ) для ідентифікації таких документів. Спочатку Ssdeep планувався для домену спаму. Спамери часто роблять невеликі зміни в повідомленні (додають пробіл), щоб запобігти виявленню точним підписом (наприклад, md5 ).
Оскільки багато версій майже одного і того ж документа в одному і тому ж наборі даних спричинять загрозу статистичним методам, які застосовуватимуться до нього, то таке очищення може бути дуже корисним.