Сравнение строк

08.11.18

Разработка - Механизмы платформы 1С

Алгоритм сравнения строк - вычисление коэффициента "похожести" двух строк в диапазоне от 0 до 1.

Скачать файл

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

Наименование По подписке [?] Купить один файл
Обработка "Сравнение строк"
.epf 6,89Kb
112
112 Скачать (1 SM) Купить за 1 850 руб.

В свое время мне пришлось решать следующую задачу: загрузить отчет комиссионера, состоящий из порядка 10 000 строк, предоставленный в электронном виде, в базу данных комитента (УТ 10.2). Проблема была в сопоставлении номенклатуры, так как кодов не было, а наименования не совпадали - вводились различными людьми в разных местах независимо, иногда с ошибками и по разным принципам.

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

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

Результат представляю вашему вниманию - во вложении обработка с двумя полями ввода - Строка1 и Строка2 и кнопкой "Сравнить", результат - коэффициент похожести в диапазоне от 0 до 1 выводится в окно сообщений. Алгоритм чувствителен порядку следования символов в строках - 2 разных набора одних и тех же символов дадут в общем случае различные результаты сравнения.

Немного об особенностях реализации - сначала вычисляются автокорреляционные функции для каждой из строк, после чего бОльшая из вычисленных величин выбирается в качестве нормирующей. Далее вычисляется взаимная корреляция строк и  нормируется вычисленной на предыдущем этапе величиной (путем деления результата на нее), что гарантирует нахождение определенного таким образом коэффициента в диапазоне от 0 до 1.

При вычислении исходные строки преобразуются в массивы, что позволит, если будет необходимо, легко перевести этот алгоритм на другие языки программирования. Недостатком данного алгоритма является относительно низкая скорость работы - за все приходится платить. Надеюсь, кому нибудь пригодится!

P.S.

Модуль СКБ Контур говорит автору спасибо - пожалуйста.

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    7443    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5942    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    17663    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11221    dsdred    44    

130

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23756    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18828    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14729    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Altair777 645 08.08.12 16:35 Сейчас в теме
Какой из алгоритмов используется?
2. AlexO 135 08.08.12 16:37 Сейчас в теме
(1) Altair777,
Недостатком данного алгоритма является относительно низкая скорость работы

Боюсь, что не самый и интересный.
3. Altair777 645 08.08.12 16:46 Сейчас в теме
5. AlexO 135 09.08.12 14:10 Сейчас в теме
(3) Altair777,
что-то вроде "сравннеия в лоб", без применения алгоритмов сортировок и оптимизаций :)
4. petrov_al 10 09.08.12 10:13 Сейчас в теме
А как же "полнотекстовый поиск" 1с не пробовали?
7. CheBurator 2712 10.08.12 01:25 Сейчас в теме
сто лет в обед ;-) давно и с успехом данную задачу решает ВК strmatch (можно использовать в снеговике) - http://infostart.ru/public/14255/ - к достоинствам (для большого класа задач) данной ВК следует отнести: нечувствительность не "незвуковым" символам, поддержка фонетической похожести (отзыв и otzyv будут весьма близки). Так что на этой хрения в agfvfwbb у меня был накручен основной мегафункционал - разработки на основе этой ВК успешно работают н аавтозапчастях, игрушках, электробытовых приборах итд (как пример: http://infostart.ru/public/15996/). чем длиннее сравниваемая строка - тем работает лучше. В приведенном примере - по радиодеталям, где почти все зависит от цифробуквенной маркировки - где многоцифр и маркировка короткая - работало затруднительно - все на все похоже с большоим подобием ;-) пришлось ввести парочку эмпирических правил, которые существенно улучшили ситуацию. Лекарственные прайсы по 10 тыс позиций у меня автоиндентифицировались (примерно на 60-80% - как чувсвтительность выставишь) минут за 40 в далеком 2004-2006гг.
.
а во время моих длительных скитаний по стране 1С - такой алгоритм как у автора давным давно на 7.7 был написан еще на встроенном языке. Так что - как обычно - мы впереди планеты всей в изобретении велосипедов ;-)
.
так что разработка автора представляет весьма ограниченный интерес. ибо колесо - оно и есть колесо. но вот если бы автор привел сравнение своего алгоритма, strmatch. полнотекствого поиска снеговика итд - вот это было бы интересно.. сразу бы стало понятно - на что претендует автолр - на колесо для волокуши из цельного куска дерева или на высокотоехнологичное колесо гоночного велосипеда.
8. TSSV 1151 10.08.12 08:29 Сейчас в теме
(7) CheBurator, ваша информация интересна. Я представил конкретный алгоритм с ОТКРЫТЫМ кодом (в отличие от strmatch и пр.). Ваш восторг по поводу "нечувствительность не "незвуковым" символам" вполне объясним - довольствоваться приходится тем что есть.
а во время моих длительных скитаний по стране 1С - такой алгоритм как у автора давным давно на 7.7 был написан еще на встроенном языке.
Приведите ссылки на его описание - интересно насколько он "такой" и когда был написан и где (может на заборе?).
По поводу сравнения - мне самому было бы интересно сравнить работу моего алгоритма с другими, будет время, напишу об этом отдельно. НО, еще раз (для самых одаренных) - я предоставил алгоритм, он перед вами - сравнивайте!
13. tango 545 29.08.12 16:08 Сейчас в теме
+(7) CheBurator,
strmatch == рулёз
9. sashapere 159 15.08.12 16:50 Сейчас в теме
10. ZLENKO 398 29.08.12 13:33 Сейчас в теме
С практической точки зрения больший интерес представляет применение полнотекстового поиска. Например, для поиска похожих контрагентов при вводе нового контрагента. Каждый раз вычислять похожесть двух строк при количестве контрагентов несколько тысяч будет достаточно медленно. Когда в 1С еще не было полнотекстового поиска для получения приемлемого быстродействия приходилось извращаться с монструозным запросом использующим анализ вхождения подстрок искомой строки в поле базы данных. Теперь с полнотекстовым поиском все проще.
11. TSSV 1151 29.08.12 14:11 Сейчас в теме
(10) 1с-программы.com, спасибо за интерес к моим работам. Придется вас огорчить - полнотекстовый поиск и сравнение строк это несколько разные все таки вещи, хотя издалека действительно похожи. Задачи, которые можно решить с помощью полнотекстового поиска не стоит решать с помощью сравнения строк.
12. ZLENKO 398 29.08.12 15:00 Сейчас в теме
(11) Не нужно меня огорчать :-) Конечно это разные вещи. Просто мне так сразу в голову не приходит практическое применение в рамках эксплуатации продуктов 1С алгоритма сравнения двух строк на похожесть.
Если не секрет - с какой целью Вы его писали ? Просто интересно.

Инфостарт выдает список других разработок автора, поэтому я еще заинтересовался и другими вашими разработками. Не подумайте - ничего личного :-)
14. TSSV 1151 04.06.13 20:21 Сейчас в теме
Вот пример практического применения фукнции сравнения строк:
http://infostart.ru/public/173260/
15. fishca 1259 23.10.15 09:08 Сейчас в теме
Модуль обработки СКБ-Контур говорит автору спасибо, а я передаю.

16. TSSV 1151 23.10.15 09:59 Сейчас в теме
(15) fishca, Спасибо! Приятно получить такой отзыв :)
Оставьте свое сообщение