Как найти повторное использование текста с нечетким совпадением?

#python #text #nlp #fuzzy-search #corpus

#python #текст #nlp #нечеткий поиск #corpus

Вопрос:

Я пытаюсь эффективно найти сходство между короткой фразой и большим корпусом. Например, предположим, что мой корпус — это книга «Моби Дик«. В этой книге десятки тысяч слов.

В дополнение к этому у меня есть несколько коротких фраз. например:

 phrase1 = "Call me Ishmael" # This is the first sentence in the book exactly.
phrase2 = "Call me Isabel" # This is like the previous with changes of few letters from the third word.
phrase3 =  "Call me Is mael" #It's a similar sentence but one word split in two.
 

Кроме того, у меня, конечно, есть много других предложений, которые не похожи на предложения из книги.

Интересно, каков общий и эффективный способ определения предложений, в которых есть предложение, похожее на них в книге.

Что я пытался сделать, что мне кажется менее подходящим?

  • Я разделил все входные предложения на 3/4/5/6 n-граммов.
  • Я разделил все предложения корпуса на 3/4/5/6 n-граммов.
  • Затем я попытался найти приблизительное соответствие (с FuzzySet ) между всеми возможными комбинациями n-граммов корпуса и входных n-граммов (комбинации необходимы для понимания даже случаев, когда слова разделились или слились.)

Мне совершенно ясно, что этот метод очень расточителен и, вероятно, также не самый точный для моих нужд. Я хотел бы понять, как лучше это сделать.

Комментарии:

1. Возможно, вы можете использовать алгоритм редактирования расстояния между строками. Очень неэффективным способом является вычисление расстояния редактирования строки до всех подстрок текста заданной длины (например, размера входной строки)

2. @Stefan Число всех непустых подстрок равно n *(n 1)/2, где n == длина (Моби Дик) это миллиарды подстрок…

3. Вы изучали сходство Жаккарда? en.m.wikipedia.org/wiki/Jaccard_index

4. @nablag но как использовать это с коротким и очень длинным текстом?

5. @Yanirmr Я улучшаю подход со скользящим окном. Сначала сравните подстроку 1..m, затем 2 ..m 1, затем 3 ..m 2 и т.д. Как я уже сказал, очень неэффективно, около n расстояний редактирования строк. (И не очевидно, как выбрать m. Это может быть m=len(inputstring), но это зависит от того, что вы ожидаете найти)

Ответ №1:

Вы можете использовать исправление орфографии на основе корпуса, за которым следует fuzzyset. Для исправления орфографии вы можете использовать реализацию python алгоритма symspell. Здесь вы можете найти список репозиториев, реализующих symspell. Используйте symspell с конфигурацией компаундирования.

  • Используйте орфографа, обученного корпусу, для правильного написания коротких предложений.
  • Используйте fuzzyset / fuzzywuzzy, чтобы найти показатель сходства между исправленным по орфографии предложением и каждым предложением в корпусе.
  • Определите порог экспериментально, если сходство выше порогового значения, назовите это совпадением

Комментарии:

1. Спасибо, но у меня есть 2 вопроса: (1) что будет с фразами, которые не принадлежат исходному корпусу? (2) после исправления как найти совпадения?

2. (1) Фазы, которые не принадлежат корпусу, останутся неизменными после исправления. symspell использует коррекцию на основе расстояния редактирования, поэтому, если расстояние редактирования больше заданного, НИКАКИХ изменений в словосочетании не будет. (2) После исправления орфографии вы можете сопоставить фразу с каждым предложением в корпусе.

3. о (2) — у вас есть идеи, как это сделать эффективно?