Як обчислити структурну схожість між реченнями?


12

Я працюю над проблемою, де мені потрібно визначити, чи два речення схожі чи ні. Я реалізував рішення, використовуючи алгоритм BM25 та синсети wordnet для визначення синтаксичної та семантичної подібності. Рішення працює адекватно, і навіть якщо порядок слів у реченнях змішується, це вимірює, що два речення схожі. Наприклад

  1. Python - це гарна мова.
  2. Мова хороший пітон.

Моя проблема - визначити, що ці два речення схожі.

  • Що може бути можливим рішенням структурної подібності?
  • Як я буду підтримувати структуру речень?

Можливо, ви зможете використовувати вектори речень та порівняти їх.
Ейден Гроссман

Я настійно пропоную використовувати для цього завдання Gensim ( radimrehurek.com/gensim ). Особливо моделі LSI та / або word2vec та швидкий текст
Robin

Відповіді:


2

Найпростіший спосіб додати якусь міру структурної подібності - використовувати n-грам; у вашому випадку біграмів може бути достатньо.

Пройдіть кожне речення і збирайте пари слів, наприклад:

  • "python є", "is a", "good", "good language".

Ваше інше речення має

  • "мова а", "хороший", "хороший пітон", "пітон є".

З восьми біграм у вас є дві однакові ("python є" і "good"), тож можна сказати, що структурна схожість становить 2/8.

Звичайно, ви також можете бути більш гнучкими, якщо вже знаєте, що два слова є семантично пов'язаними. Якщо ви хочете сказати, що Python - це добра мова , структурно схожа / ідентична Java - це чудова мова , то ви можете додати це до порівняння, щоб ви ефективно обробляли "[PROG_LANG] - мова [ПОЗИТИВНО-ADJ]", чи щось подібне.


5

По-перше, перед тим, як розпочати, рекомендую звернутися до подібних питань у мережі, таких як /datascience/25053/best-practical-algorithm-for-sentence-s similarity та https: // stackoverflow. com / questions / 62328 / є-там-алгоритм-що-розповідає-семантичне-подібність-двох фраз

Для визначення схожості речень нам потрібно врахувати, які дані ми маємо. Наприклад, якщо у вас був мічений набір даних, тобто подібні речення та різні речення, тоді прямим підходом могло б бути використання алгоритму, що контролюється, для класифікації речень.

Підхід, який міг би визначити структурну схожість речень, полягав би в середньому серед векторів слів, породжених алгоритмами вбудовування слова, тобто word2vec. Ці алгоритми створюють вектор для кожного слова, а схожість косинусів серед них являє семантичну схожість між словами. (Daniel L 2017)

За допомогою векторів слів ми можемо використовувати наступні показники для визначення схожості слів.

  • Косинусна відстань між вбудованими словами цих слів
  • Евклідова відстань між вбудованими словами цих слів

Косинусна схожість - це міра подібності двох ненульових векторів внутрішнього простору продукту, що вимірює косинус кута між ними. Косинусовий кут - це міра накладання між реченнями за їх змістом.

Евклідова відстань між двома векторами слів забезпечує ефективний метод вимірювання мовної чи семантичної подібності відповідних слів. (Frank D 2015)

Ви також можете обчислити власний вектор речень, щоб визначити подібність речень.

Власні вектори - це особливий набір векторів, пов'язаних з лінійною системою рівнянь (тобто матричним рівнянням). Тут генерується матриця подібності речень для кожного кластеру та обчислюється власний вектор для матриці. Ви можете прочитати більше про підхід, заснований на Eigenvector, до ранжування речень у цьому документі https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf

Для вихідного коду Siraj Rawal має ноутбук Python для створення набору векторів слів. Слова векторів можуть бути використані для пошуку схожості між словами. Вихідний код доступний тут https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE

Інший варіант - це підручник від Oreily, який використовує бібліотеку gensin Python для визначення схожості між документами. Цей підручник використовує NLTK для токенізації, а потім створює з корпусу модель tf-idf (термін обернена частота документа). Потім tf-idf використовується для визначення схожості документів. Підручник доступний тут https://www.oreilly.com/learning/how-do-i-compare-document-s Sličnost- using-python


Дякуємо, що надали цінні деталі проблеми. Я бачив приклад gensim, але у мене є питання, чи зможе він вирішити проблему, про яку я згадував. Хоча створене мною рішення добре працює у пошуку схожості між реченнями, але воно застрягає, коли змішується порядок слів.
Шубхем Тіварі

4

Найкращий підхід на цей час (2019):

Зараз найефективнішим підходом є використання універсального кодера речення від Google ( paper_2018 ), який обчислює семантичну схожість між реченнями, використовуючи крапковий добуток їх вбудовування (тобто вивчені вектори 215 значень) . Подібність - число з поплавком між 0 (тобто немає подібності) і 1 (тобто сильна подібність).

Тепер реалізація інтегрована в Tensorflow Hub і може бути легко використана. Ось готовий до використання код для обчислення подібності між 2 реченнями. Тут я отримаю схожість між "Python - це гарна мова" та "Мова хороший пітон", як у вашому прикладі.

Приклад коду:

#Requirements: Tensorflow>=1.7 tensorflow-hub numpy

import tensorflow as tf
import tensorflow_hub as hub
import numpy as np

module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/3" 
embed = hub.Module(module_url)
sentences = ["Python is a good language","Language a good python is"]

similarity_input_placeholder = tf.placeholder(tf.string, shape=(None))
similarity_sentences_encodings = embed(similarity_input_placeholder)

with tf.Session() as session:
  session.run(tf.global_variables_initializer())
  session.run(tf.tables_initializer())
  sentences_embeddings = session.run(similarity_sentences_encodings, feed_dict={similarity_input_placeholder: sentences})
  similarity = np.inner(sentences_embeddings[0], sentences_embeddings[1])
  print("Similarity is %s" % similarity)

Вихід:

Similarity is 0.90007496 #Strong similarity

Ще один варіант в 2019 році - вбудовування пропозицій BERT - ви можете побачити приклад коду тут - github.com/hanxiao/bert-as-service
Adnan S
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.