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

08.11.18

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

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

Скачать файлы

Наименование Файл Версия Размер
Обработка "Сравнение строк"
.epf 6,89Kb
112
.epf 6,89Kb 112 Скачать

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

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

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

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

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

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

P.S.

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4481    dsdred    53    

71

Как готовить и есть массивы

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

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

24.01.2024    5282    YA_418728146    25    

63

Планы обмена VS История данных

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

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

11.12.2023    6401    dsdred    36    

111

1С-ная магия

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

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

06.10.2023    18466    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

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

14.09.2023    12082    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

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

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

28.08.2023    8804    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6273    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

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

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15974    SeiOkami    31    

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

Боюсь, что не самый и интересный.
3. Altair777 644 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 3119 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 1144 10.08.12 08:29 Сейчас в теме
(7) CheBurator, ваша информация интересна. Я представил конкретный алгоритм с ОТКРЫТЫМ кодом (в отличие от strmatch и пр.). Ваш восторг по поводу "нечувствительность не "незвуковым" символам" вполне объясним - довольствоваться приходится тем что есть.
а во время моих длительных скитаний по стране 1С - такой алгоритм как у автора давным давно на 7.7 был написан еще на встроенном языке.
Приведите ссылки на его описание - интересно насколько он "такой" и когда был написан и где (может на заборе?).
По поводу сравнения - мне самому было бы интересно сравнить работу моего алгоритма с другими, будет время, напишу об этом отдельно. НО, еще раз (для самых одаренных) - я предоставил алгоритм, он перед вами - сравнивайте!
13. tango 506 29.08.12 16:08 Сейчас в теме
+(7) CheBurator,
strmatch == рулёз
9. sashapere 157 15.08.12 16:50 Сейчас в теме
10. ZLENKO 398 29.08.12 13:33 Сейчас в теме
С практической точки зрения больший интерес представляет применение полнотекстового поиска. Например, для поиска похожих контрагентов при вводе нового контрагента. Каждый раз вычислять похожесть двух строк при количестве контрагентов несколько тысяч будет достаточно медленно. Когда в 1С еще не было полнотекстового поиска для получения приемлемого быстродействия приходилось извращаться с монструозным запросом использующим анализ вхождения подстрок искомой строки в поле базы данных. Теперь с полнотекстовым поиском все проще.
11. TSSV 1144 29.08.12 14:11 Сейчас в теме
(10) 1с-программы.com, спасибо за интерес к моим работам. Придется вас огорчить - полнотекстовый поиск и сравнение строк это несколько разные все таки вещи, хотя издалека действительно похожи. Задачи, которые можно решить с помощью полнотекстового поиска не стоит решать с помощью сравнения строк.
12. ZLENKO 398 29.08.12 15:00 Сейчас в теме
(11) Не нужно меня огорчать :-) Конечно это разные вещи. Просто мне так сразу в голову не приходит практическое применение в рамках эксплуатации продуктов 1С алгоритма сравнения двух строк на похожесть.
Если не секрет - с какой целью Вы его писали ? Просто интересно.

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

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