Определение похожести строк или фраз (алгоритм нахождения расстояния Дамерау Левенштейна)

22.12.17

Разработка - Математика и алгоритмы

Реализация алгоритма поиска расстояния Дамерау Левенштейна (Damerau–Levenshtein distance) для определения похожести слов или фраз.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Обработка без БСП
.epf 7,87Kb
65 2 500 руб. Купить
Обработка с БСП
.epf 11,64Kb
37 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Объясню свой интерес к алгоритму с предыстории.

Шло начало миллениума. В домашних локальных сетях популярным было общаться в IRC чатах. Чтобы как-то с интересом и пользой провести время существовали каналы с названием "BuKToPuHa", где крутился tcl бот "Знайка".

В какой-то момент викторина мне начинает надоедать, а рост интереса к нечестной игре и программированию возрастать. И решил я скачать базу ответов и написать бота, который бы играл за меня.

Бот играл за меня и делал случайные задержки между появлением вопроса и вводом ответа. Делал определенный процент ошибок, чтобы не засветиться сразу. Через какое-то время я выбился в первые позиции рейтинга. Администратор канала заподозрил неладное и начал дорабатывать алгоритм выдачи вопросов подменяя русские буквы "о,а,е,р,у,с.." на их английские аналоги, а кавычки заменяя двойными/одинарными. На простых вопросах бот работал, но на более длинных и сложных перестал находить ответы в базе. Встала задача о том как сравнить два текста вопроса на похожесть, чтобы выбрать ответ для наиболее похожего вопроса. Тогда мне эту задачу в полной мере решить не удалось, кроме того, меня перманентно забанили...

Спустя 17 лет я решил восполнить упущение и изучить тему повнимательней.

В 1С есть механизм Полнотекстового Поиска, в нем можно осуществлять "Нечеткий поиск". Тем не менее, это закрытая коробка.

Кроме того было интересно реализовать алгоритм именно на языке 1С. Надеюсь, кому-нибудь пригодится.

Тестировалось на 8.3.7.2027 и 8.3.11.2867.

UPDATE:

22.12.2017 - Добавлен вариант обработки без требования БСП

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Математика и алгоритмы Программист 1С 8.3 Абонемент ($m)

Данная внешняя обработка для платформы 1С:Предприятие реализует усовершенствованный алгоритм Левенштейна для вычисления схожести строк с учетом различных лингвистических особенностей русского языка. В отличие от классической реализации, этот алгоритм учитывает фонетические, визуальные и контекстные особенности набора текста.

1 стартмани

07.11.2025    5178    14    InFlach    17    

27

Математика и алгоритмы Запросы Программист 1С:Предприятие 8 Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    5341    ivanov660    9    

24

Математика и алгоритмы Программист 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    13404    stopa85    12    

43

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    21183    user1959478    57    

40

Математика и алгоритмы Разное 1С:Предприятие 8 1C:Бухгалтерия Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    12686    maksa2005    8    

27

Математика и алгоритмы Инструментарий разработчика Программист 1С:Предприятие 8 Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    21802    11    SpaceOfMyHead    20    

65

Математика и алгоритмы Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    14341    RustIG    9    

30

Механизмы платформы 1С Математика и алгоритмы Программист 1С:Предприятие 8 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    13399    gzharkoj    15    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Dnki 4 14.12.17 23:37 Сейчас в теме
В Вашей статье совсем не прозвучала тема о полезности задачи. А между тем, я такую решал в след. проблеме:
- импортировал товары их файла. Поиск велся по коду/ артикулу / штрих-коду и т.д.
А наименования в файле только похожи на наши в базе.
- потом нужно показать результат пользователю оба наименования этими двумя колонками.
- т.к. строк много, вот тут и нужно сравнить оба наименования и цветом/ значком показать степень различия.

Мой алгоритм был простым: по количеству совпадающих слов. Так что накоплю денег и скачаю для спортивного интереса.
2. PerlAmutor 161 15.12.17 06:09 Сейчас в теме
(1) Спасибо за комментарий. Действительно, функцию можно использовать для таких вещей как автоматическое сопоставление номенклатуры предприятия и номенклатуры поставщика в той же ERP.
4. pallid 275 22.12.17 10:59 Сейчас в теме
(2)
(3)

В данном решении используется StrMatch.dll?

я помню что StrMatch.dll не работает на 64x
5. PerlAmutor 161 22.12.17 14:05 Сейчас в теме
(4) Нет, я не использовал внешние компоненты.
3. CheBurator 3234 16.12.17 00:43 Сейчас в теме
(1) успешно решается применением StrMatch.dll (работает и в 8-ке)
https://infostart.ru/public/14255/ - работает

(1),(2) обработки с такими возможностями уже есть на ИС для 8-ки, поищите.
6. echo77 1938 22.12.17 14:41 Сейчас в теме
Данная обработка написана с учетом того, что в конфигурации есть БСП, управляемые формы.
Скачал. В УПП не открывается, т.к. БСП нет
Ziggurat; +1 Ответить
7. PerlAmutor 161 22.12.17 15:54 Сейчас в теме
(6) Спасибо за замечание. Добавил вариант обработки без использования БСП.
8. Поручик 4607 24.12.17 01:11 Сейчас в теме
Алгоритм Левенштейна на 1С давно сделан
https://forum.infostart.ru/forum9/topic27268/#message369426
9. PerlAmutor 161 24.12.17 08:14 Сейчас в теме
(8) Этот пост не видел, видимо плохо искал. Тем лучше, что теперь у нас есть 2 алгоритма и "Расстояние Левенштейна" и "Расстояние Дамерау-Левенштейна" (дополненный Дамерау операцией перестановки букв).
10. AnryMc 851 22.07.19 09:12 Сейчас в теме
11. PerlAmutor 161 22.07.19 18:42 Сейчас в теме
(10) В данном случае оформление внешней обработки для возможности встраивания в справочник "Дополнительные Отчеты и Обработки", который принадлежит Библиотеке Стандартных Подсистем.
12. ikbokov 24 30.09.19 09:40 Сейчас в теме
А есть ли алгоритмы учитывающие перестановку слов?
13. PerlAmutor 161 30.09.19 20:25 Сейчас в теме
(12) На самом деле этот алгоритм можно доработать и под перестановку слов. Его суть заключается в том, что изначально создается "словарь" (каталог), уникальных символов из двух наборов данных - строка, которую надо сравнить и строка с которой идет сравнение. Раньше коды символов были в кодировке ASCII (досовской IBM866), что наталкивало программистов на простое решение - создать массив из 256 элементов, где индекс будет равен коду символа. С появлением unicode, utf-8 и utf-16 (которую использует 1С) алгоритм потребовалось немного видоизменить, т.к. возможных символов стало несколько десятков тысяч. Соответственно один символ уже не занимает фиксированное количество байт и может иметь вариативный размер. Но весь их набор на самом деле не нужно держать в памяти. Достаточно, чтобы в словаре были перечислены все уникальные значения из двух строк. Таким образом можно сделать 2 словаря и 2 проверки. Первый словарь - набор уникальных символов, второй словарь - набор уникальных слов. Таким образом первая проверка даст процент похожести двух строк в разрезе символов и их перестановок, а вторая проверка в разрезе слов и их перестановок. Два значения результата можно привести к какому-то общему.
14. ROM_1C 692 22.09.20 22:34 Сейчас в теме
интересно. спасибо!
Для отправки сообщения требуется регистрация/авторизация