Степень сходства двух наименований справочника

Публикация № 332257

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

Сходство Различие Алгоритм Реквизит Наименование Номенклатура

Статья посвящена исследованию следующего вопроса: необходимо сравнить 2 наименования справочников с целью вычисления их степени сходства. По задумке, степень сходства должна выражаться в процентах.

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

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

Существуют масса алгоритмов определения степени сходства 2-х текстов, после изучения которых, был выработан следующий алгоритм:

  1. Вычисляем длины наименований
  2. Принимаем за эталон наибольшую длину (для организации цикла)
  3. Принимаем наименование с наибольшей длиной за эталонную строку
  4. Попарно вычисляем число вхождений в обоих наименованиях каждого символа из эталонной строки
  5. Удаляем из наименований символы, для которых произведён поиск
  6. Складываем общее количество вхождений для каждого наименования
  7. После цикла вычисляем степень сходства по формуле (результат в процентах):
(Вхождение1/Вхождение2)*100
 

Здесь, "Вхождение1" - общее число вхождений каждого символа эталонной строки в первое наименование, "Вхождение2" - общее число вхождений каждого символа эталонной строки во второе наименование. 

Перед вычислением по формуле, в условном операторе, необходимо определить какое из наименований имеет наибольшее число вхождений.

Ниже представлен полученный код для платформы 1С Предприятие 7.7. Принимаются предложения по оптимизации.

//возвращает процент сходства 2-х наименований
Функция СходствоНаименований(Знач Наим1="",Знач Наим2="") 
    Наим1 = СокрЛП(Наим1);
    Наим2 = СокрЛП(Наим2);
    Наим1 = СтрЗаменить(Наим1,"  ",""); //Удаляем двойные пробелы
    Наим1 = СтрЗаменить(Наим1," ","");  //Удаляет одинарные пробелы
    Наим2 = СтрЗаменить(Наим2,"  ","");
    Наим2 = СтрЗаменить(Наим2," ","");
    //проверяем значения на схожесть  
    Длина1  = СтрДлина(Наим1);
    Длина2  = СтрДлина(Наим2);
    Если Длина1 > Длина2 Тогда
        Длина = Длина1;
	Стр   = Наим1;
    Иначе
	Длина = Длина2;
	Стр   = Наим2;
    КонецЕсли;
    Сч = 0; Вхождение1 = 0; Вхождение2 = 0;
    Пока (Стр<>"") Цикл
        Символ = Лев(Стр,1);
        Вхождение1 = Вхождение1+СтрЧислоВхождений(Наим1,Символ);
        Вхождение2 = Вхождение2+СтрЧислоВхождений(Наим2,Символ);
        Наим1 = СтрЗаменить(Наим1,Символ,"");
        Наим2 = СтрЗаменить(Наим2,Символ,"");
        Стр = Прав(Стр,СтрДлина(Стр)-1);
    КонецЦикла;
    Возврат  ?(Вхождение1>Вхождение2,Окр((Вхождение2/Вхождение1)*100,3,1),Окр((Вхождение1/Вхождение2)*100,3,1));
КонецФункции //СходствоНаименований()

Выявленные преимущества алгоритма:

  • Время исполнения кода на очень хорошем уровне (меньше 0.0001 сек.)
  • Переносимось алгоритма (не нужно подключать внешние компоненты)
  • Выходной показатель (процент степени сходства) соответствует различию входных данных

Выявленные недостатки:

  • Чувствительность алгоритма к сильному различию в количестве символов 2-х наименований (показатель степени сходства быстро снижается) 
  • При простой перестановке символов в разных наименованиях результат будет 100% сходства, что неверно.

Результаты экспериментов

Эксперимент 1:

  • Наименование1 = "A0900001N Угольник 1"х1"
  • Наименование2 = "CJ 65 V3 Лобзик"
  • Результат = 13.636%

Эксперимент 2:

  • Наименование1 = "Cъемник рулевых тяг и шаровых опор TOYA"
  • Наименование2 = "Cъемник рулевых тяг и шаровых опор  2-х позиционный, зев 20 мм"
  • Результат = 56.863%

Эксперимент 3:

  • Наименование1 = "MF 800 VE миксер Felisatti"
  • Наименование2 = "MF1200/VE2 миксер Felisatti"
  • Результат = 84.000%

Возможное решение описанных выше недостатков

Метод написан на базе платформы 1С:8 пользователем DrBlack

Функция ПолучитьПроцентСходстваНаименований_2(Знач НаимСравн="", МассивСлов, ОбщДлинаСлов)
    СуммаСовпадений = 0;
    Для Каждого ТекСлово Из МассивСлов Цикл     
        Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(ТекСлово) Тогда
            СчНачало = СтрДлина(ТекСлово);
        Иначе
            СчНачало = Макс(3, СтрДлина(ТекСлово)-4);
        КонецЕсли;
        МаксСовпадений = 0;
        Для Сч = СчНачало По СтрДлина(ТекСлово) Цикл          
            ТекОтрезокЛево = Лев(ТекСлово,  Сч);
            ТекОтрезокПрав = Прав(ТекСлово, Сч);          
            МаксСовпадений = Макс(МаксСовпадений, ?(СтрЧислоВхождений(НаимСравн, ТекОтрезокЛево)>0, Сч, 0), ?(СтрЧислоВхождений(НаимСравн, ТекОтрезокПрав)>0, Сч, 0));     
        КонецЦикла;   
        СуммаСовпадений = СуммаСовпадений + МаксСовпадений;       
    КонецЦикла;   
    ПроцентСовпадения = Окр(Мин(ОбщДлинаСлов, СуммаСовпадений) / ОбщДлинаСлов * 100, 3, 1);   
    Возврат ПроцентСовпадения;
КонецФункции

Входные параметры:
НаимСравн - строка, с которой надо сравнить
МассивСлов - эталонная строка, заранее разбитая на составляющие
ОбщДлинаСлов - общая длинна слов в МассивСлов для вычисления коэф. схожести

Суть данного метода - устранить недостатки метода из топика.

Описание колонок на скрине:
Процент1 - сравнение методом из топика
Процент2 - сравнение методом пользователя  DrBlack по вхождению слов (не короче 4х символов)
Процент3 - усредненный коэф (Процент1 + Процент2 х 2) / 3

СПАСИБО ЗА ВНИМАНИЕ!

[Обновление, 15.10.19] Добавлены обработки для 1С7.7 и 1С8.х, реализующие задачу при помощи алгоритмов из публикации.

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

Наименование Файл Версия Размер
Степень сходства двух наименований справочника для 1С7.7

.ert 35,00Kb
15.10.19
0
.ert 35,00Kb Скачать
Степень сходства двух наименований справочника для 1С8.х

.epf 10,87Kb
15.10.19
2
.epf 10,87Kb 2 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. vcv 87 25.02.15 10:17 Сейчас в теме
Без толковой внешней компоненты, реализующей нечеткое сравнение, толку от подобной обработки мало.
Как будете оценивать степень сходства у "Cъемник рулевых тяг" и "Cьёмник руливых тяг" ?
Посмотрите, например, на http://infostart.ru/public/70044/
2. etmarket 541 25.02.15 11:00 Сейчас в теме
(1) vcv, для такого сравнения, алгоритм даст результат около 100% (а точнее 97%). Что, собственно, и требуется для реализации.

Не стояла задача организации нечеткого сравнения. Поскольку обработка происходит для большого объема данных, результат должен выдаваться за минимальное количество времени. Полученный процент существенно вносит ясность в различие, что достаточно для принятия решения.

Поэтому ваша критика несущественна. Но все-равно спасибо за отзыв!
7. JohnyDeath 298 25.02.15 11:52 Сейчас в теме
Посмотрите на ВК отсюда: http://infostart.ru/public/15765/
Она может найти схожесть между такими наименованиями как "Водка Посольская" и "Vodka Posolskaja"
Присоединяюсь к (1) и (4). Такое надо в ВК выносить, на 1С слишком муторно все будет
V.Nikonov; +1 Ответить
8. etmarket 541 25.02.15 12:48 Сейчас в теме
(7) JohnyDeath, к сожалению, не будут удовлетворены требования производительности.
Спасибо за ссылку на публикацию.
Приведённый алгоритм тоже имеет право на существование и успешно доказал свою применимость.
9. gaglo 25.02.15 15:05 Сейчас в теме
(8) В том-то и дело, что границы применимости данного алгоритма не сформулированы. Пытался вчитаться в начальные абзацы статьи, но... не вышло у меня. И фразы вроде " процент существенно вносит ясность в различие" - мне не помогли.
Ясно только, что это не "нечеткое сравнение", как сказано в (2).
Хотелось бы формулировок в виде "из записей с одинаковым артикулом отсеивали те, которые содержат совсем непохожие наименования, а те, что остались, предлагали для ручного выбора".
Кстати, без ВК обходились в статье про Русский Metaphone (и др.).
10. etmarket 541 25.02.15 15:12 Сейчас в теме
(9) gaglo, поиск решения такой простейшей задачи всегда остаётся актуальным, поскольку идеальных решений не существует. Меня заинтересовала разработка самого быстрого алгоритма, который удовлетворит поставленным задачам. И данный алгоритм во всём удовлетворил моему техническому заданию. Поэтому я его и представил на суд сообществу.

К сожалению, ни один из критикантов не предложил способов улучшения метода без существенного усложнения, кроме как взять готовый ВК. Поэтому вижу свою затею в публикации статьи пустой!

П.С. Я старался доходчиво объяснить применимость метода, но, видимо, очень по-простому не умею.
13. vcv 87 25.02.15 15:43 Сейчас в теме
(10)
Меня заинтересовала разработка самого быстрого алгоритма, который удовлетворит поставленным задачам.

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

Ну прямо "критикантов"! Вы взялись за задачу, которая нормального решения без ВК не имеет. Без ВК получается или хреново, или тормозно. Тормозно, конечно, относительно возможных объёмов. Вот у меня порядка 20 тысяч номенклатурных позиций. Средняя длина наименований порядка 40-50 символов. Слабо представляю, что бы по такому объёму искать схожие наименования посимвольным перебором.
...не предложил способов улучшения метода без существенного усложнения, кроме как взять готовый ВК.

Если никак нельзя ВК...
Попробуйте заменять в наименовании буквы на фонетически сходные. Например, в наименовании "Водка Посольская" заменять В на Ф, О на А, З на С и так далее. Символы вроде Ь Ъ совсем убирать. Все знаки препинания заменять на пробелы. Заменять сходно написанные латинские буквы на русские. Строки, естественно, привести к единому регистру. Получившуюся строку поделить по словам.
Два списка слов из двух строк уже сравнивать.
15. etmarket 541 25.02.15 15:53 Сейчас в теме
(13) vcv,
Сильно подозреваю, что использование ВК будет работать быстрее, чем посимвольное перебирание строк на языке 1С.

Работа с ВК по производительности в РАЗЫ дольше, чем простым перебором символов. Откройте отладчик и проверьте 2 куска кода, выполняющих аналогичную задачу, но один из которых использует ВК.
Вы взялись за задачу, которая нормального решения без ВК не имеет.

Вы это утверждаете, потому что сами представления не имеете как это сделать.
Получившуюся строку поделить по словам. Два списка слов из двух строк уже сравнивать.

Наконец хоть какой то совет. Благодарю.
17. vasiliy_b 281 25.02.15 16:20 Сейчас в теме
(10) хотите способ улучшения алгоритма, их есть у меня.
Вам необходимо учитывать не только наличие символа со сравниваемой строкой но и позицию символа в строке, т.е чем ближе стоят друг к другу, тем больше добавляем вес данного совпадения, чем они дальше тем меньше. Так-же не помешает сравнивать не только посимвольно но и анализируя совпадение цепочки символов, чем больше цепочка символов с одинаковыми значениями тем коэфицент выше..
А вообще вы взялись за не простую задачу... если бы все было так просто, то я бы уже давно себе свой яндексогугл сделал =)

С уважением Ваш критикан =)

хм... не успел дочитать в (14) все уже описали подробней.
etmarket; +1 Ответить
18. etmarket 541 25.02.15 16:31 Сейчас в теме
(17) vasiliy_b, такая идея давно в голове была. Тут могут возникнуть проблемы, если не удалить все мешающие символы (пробелы, запятые, точки, скобки, проценты и т.д.), а также если в каком то наименовании при опечатке поставили 2 одинаковых символа вместо одного. И тогда, так называемый весовой коэффициент, только ухудшит положение дел.

Спасибо за дельный совет! :-)

П.С. Никто и не говорит, что задача простая. Она только кажется таковой. Но и попытки решить задачу не могут быть тщетными, если приложить к этому должные усилия. Собрать по крупицам идеи и синтезировать алгоритм.
3. ManyakRus 394 25.02.15 11:09 Сейчас в теме
4. kapustinag 25.02.15 11:17 Сейчас в теме
(0) Больше того, что-то сомнительно, что ищете действительно "Сходство", а не нечто другое. Поясню на примере:
Первое наименование: "АБВГДЕЖЗИЙКЛМН"
Второе наименование: "НМЛКЙИЗЖЕДГВБА"
(одно отличается от другого просто тем, что записано наоборот).
Для каждого символа будет найдено ровно одно вхождение.
Что, 100% сходство?
okiam; ZOMI; vasiliy_b; JohnyDeath; vcv; +5 Ответить
5. vcv 87 25.02.15 11:24 Сейчас в теме
(4) kapustinag, Точно, "кран" и "нарк" близнецы-братья со 100% совпадением %)
JohnyDeath; +1 Ответить
6. etmarket 541 25.02.15 11:45 Сейчас в теме
(4) kapustinag, вы правы, есть недостаток алгоритма в этом плане. Но поскольку простая перестановка символов в строке приводит к потере смысла наименования (строка становится случайным набором символов), то этот момент тоже несущественен. Никто не будет создавать наименование с непонятным набором символов, который случайно совпадёт с другим наименованием по частоте вхождений символов.
Ваши предложения по доработке?
11. loekyn 18 25.02.15 15:31 Сейчас в теме
То, что результатом сравнения будет ерунда уже писали выше.
Также непонятно зачем нужна 1-я строчка в
Наим1 = СтрЗаменить(Наим1," ","");
Наим1 = СтрЗаменить(Наим1," ","");

Одной второй недостаточно?

ИМХО правильно было бы сравнивать не вхождение символов а целых слов. Здесь тоже куча подводных камней в виде окончаний, опечаток и пр. Вот для сравнения отдельных слов предложенный алгоритм худо бедно подошел бы, только надо добавить контроль позиции символов в проверяемых словах при сравнении.

То, что "алгоритм быстрый" малоценно, т.к. на выходе чушь. Выдаваемые проценты - цифра ни о чем. Что там автор получил подсчитав количество одинаковых буковок в 2х строчках для меня загадка.
JohnyDeath; ojiojiowka; Идальго; +3 Ответить
12. etmarket 541 25.02.15 15:42 Сейчас в теме
(11) loekyn, первая строка удаляет двойной пробел, вторая одинарный. Замена одинарного пробела на пустой символ в некоторых случаях не отрабатывает замену двойного. Если не верите, можете самолично провести эксперимент.

На выходе не чушь, а объективные данные, которые помогли решить проблемы. Смотрите раздел "Результаты экспериментов".
14. Vortigaunt 82 25.02.15 15:48 Сейчас в теме
Когда-то стояла задача найти в справочниках "одинаковые" адреса торговых точек. Код приводить не буду. Распишу простым язком алгоритм, который использовал для сравнения строк.
1. Обрезать пробелы слева и справа и привести обе строки в верхний регистр.
2. Убрать мусор (точки, запятые, скобки)
3. Найти самую длинную совпадающую последовательность символов. Запомнить её длину и вырезать из сравниваемых строк.
4. Из оставшегося опять найти самую длинную последовательность символов и ёё длину приплюсовать к результату пункта 3.
Так до тех пор пока не останутся одиночные символы.
5. Вычислить отношение полученного результата к максимуму длин двух строк.
Получаем показатель от 0 до 100% насколько адреса совпадают.
P.S. В алгоритме нужно ограничить минимальную длину последовательности получаемую в пунктах 3 и 4 (опытным путем от 2х до 4х символов), а то получим сумму из единичек по всем символам.
eeeio; JohnyDeath; ffgnebel; V.Nikonov; Mi4man; etmarket; +6 Ответить
16. etmarket 541 25.02.15 15:54 Сейчас в теме
(14) Vortigaunt, класс! Надо попробовать.
19. V.Nikonov 119 25.02.15 19:34 Сейчас в теме
В моей практике требовалось найти похожее (получить список похожих) из некоего справочника. Заполнялось некое соответствие 2х справочников...

1. Исходный образец разбивался на слова и грузился во временную таблицу.
2. Запросом считалось количество совпадений с весовым коэффициентом 1 (хотя можно использовать длину слова).
3. Максимальное число получалось при совпадении целой фразы Наименования.
4. На выходе найденные элементы сортировались по убыванию веса.

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

Но основная задача не просто сравнить, а найти безошибочно точное соответствие эталона в неком списке.
При посимвольном сравнении практически невозможно выбрать правильный вариант: Ищем "Пентиум II" среди "Пентиум II", "Пентиум III" и "Пентиум-4". Разность весового показателя будет слишком мала для принятия решения.

Использование ВК замедляет запуск поиска (требуется предварительная подготовка и передача списка в котором будет поиск), но сам поиск на несколько порядков быстрее (следствие откомпилированного процессорного кода ВК).
JohnyDeath; etmarket; +2 Ответить
20. _Konstantin_ 25.02.15 21:06 Сейчас в теме
Лет пять назад была такая же проблема в результате ВК по быстродействию лучше всего.
Забыл автора теории подобного поиска, но суть сравнения состоит в том что:кроме "Попарно вычисляем число вхождений в обоих наименованиях каждого символа из эталонной строки" надо еще сравнивать сочетание 2-х символов в каждой строке с последующим смещением на 1 символ, для улучшения та же операция но уже по 3 символа, правда тормозит страшно.
Этот алг. реализован в ВК от сюда http://infostart.ru/public/15765/
21. CheBurator 3425 26.02.15 00:31 Сейчас в теме
Посмотрите также сюда http://infostart.ru/public/14255/
Сделано на strmatch
Сама вк и ее исходники выложены на портале
Ищет весьма качественно особенно в длинных наименованиях в тч учитывает фонетические совпадения
Заявляю ответственно ибо на этой вк держится куча сравнилок и грузилок прайсов
На ее основе автоматизировано несколько контор
От фармации с мегапрайсами в пятнадцать тысяч наименований
От сетки ларьков по продаже дисков и чехлов
Магазин детских игрушек
Контора по торговле бытовой техникой
Это то что помню навскидку
Evil Beaver; etmarket; +2 Ответить
23. cool.vlad4 45 26.02.15 01:18 Сейчас в теме
(21) CheBurator, исходники ВК разве выложены? если не затруднит, то покажите где
22. CheBurator 3425 26.02.15 00:33 Сейчас в теме
Если к результатам работы данной вк подключить чуток эмпирики в соотвествии со специализацией наименований то результат считаю превосходен
Также был заказ по радиодеталям
А там осложнено это тем что наименования у них короткие и буквенноцифровые и все похоже на все
Добавление эмпирики позволило получить очень неплохие результаты
24. jobkostya1c8 26.02.15 09:33 Сейчас в теме
Погляжу как основу как алгоритм нечеткого поиска.
25. etmarket 541 26.02.15 09:41 Сейчас в теме
(24) kostyaomsk, если не затруднит, когда будет готов ваш алгоритм, выложите его здесь в комментариях. У нас тут активное обсуждение и мозговой штурм :-)
26. cool.vlad4 45 26.02.15 15:56 Сейчас в теме
добавлю свои пять копеек.все зависит от постановки задачи. если задача найти схожие по звучанию, написанию это одно, про это писали выше. есть куча алгоритмов. по написанию есть метод n-грамм. есть куча других алгоритмов. и вообще можно взять sphinx и посмотреть его (я его кстати пробовал в 1С использовать, там есть квази-MySQL база, через которую можно запросы на неком подмножестве диалекта посылать, но отказался поскольку там есть требование иметь ключ как id - int или int64 ,что довольно затратно к каждой таблице делать еще таблицы из id в guid. хотя sphinx хорош скоростью обновления индексов). но если задача стоит сложного сравнения/поиска фраз , которые ничего общего по звучанию могут не иметь , например - "клейкая лента" и "скотч", то тут имхо нужно создавать поиск по онтологиям, создавать словарные базы, базы сокращений, базы семантик, парсить каждую фразу в дерево, а потом сравнивать деревья по весам ветвей. я не стал настолько углубляться в эту тему. не было смысла. видел только какие-то иностранные коммерческие системы в гугле, которые продаются за кучу денег, как они работают, не знаю)
27. CheBurator 3425 27.02.15 00:02 Сейчас в теме
Стрматч также хорош тем что там можно задавать веса цифр что повышает процент похожести
Это хорошо канает на всяких емкостях и литражах где надо чтобы равно было 200 мл и 0.2 л
28. DrBlack 21 14.07.16 10:32 Сейчас в теме
Мало ли кому пригодится, по этому выложу свой код:
Функция ПолучитьПроцентСходстваНаименований_2(Знач НаимСравн="", МассивСлов, ОбщДлинаСлов)

	СуммаСовпадений = 0;
	
	Для Каждого ТекСлово Из МассивСлов Цикл
		
		Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(ТекСлово) Тогда
			СчНачало = СтрДлина(ТекСлово);
		Иначе
			СчНачало = Макс(3, СтрДлина(ТекСлово)-4);
		КонецЕсли;
		МаксСовпадений = 0;
		
		Для Сч = СчНачало По СтрДлина(ТекСлово) Цикл
			
			ТекОтрезокЛево = Лев(ТекСлово,  Сч);
			ТекОтрезокПрав = Прав(ТекСлово, Сч);
			
			МаксСовпадений = Макс(МаксСовпадений, ?(СтрЧислоВхождений(НаимСравн, ТекОтрезокЛево)>0, Сч, 0), ?(СтрЧислоВхождений(НаимСравн, ТекОтрезокПрав)>0, Сч, 0));
			
		КонецЦикла;
		
		СуммаСовпадений = СуммаСовпадений + МаксСовпадений;
		
	КонецЦикла;
	
	ПроцентСовпадения = Окр(Мин(ОбщДлинаСлов, СуммаСовпадений) / ОбщДлинаСлов * 100, 3, 1);
	
	Возврат ПроцентСовпадения;
КонецФункции
Показать

Входные параметры:
НаимСравн - строка, с которой надо сравнить
МассивСлов - эталонная строка, заранее разбитая на составляющие
ОбщДлинаСлов - общая длинна слов в МассивСлов для вычисления коэф. схожести

Суть данного метода - устранить недостатки метода из топика.

Описание колонок на скрине:
Процент1 - сравнение методом из топика
Процент2 - сравнение моим методом по вхождению слов (не короче 4х символов)
Процент3 - усредненный коэф (Процент1 + Процент2 х 2) / 3
Прикрепленные файлы:
etmarket; +1 Ответить
29. etmarket 541 14.07.16 12:28 Сейчас в теме
(28) DrBlack, спасибо за ваш комментарий.
30. DrBlack 21 14.07.16 14:19 Сейчас в теме
(29) да незашто :)

Тестировал дальше, в общем похоже победа полная, результат интересный, файл прикрепил
И обновите статью, а то те кто будут искать, могут не дочитать до конца, а проблема-то решена... ;)

Прикрепленные файлы:
CheBurator; etmarket; +2 Ответить
31. Glebis 11 09.06.18 11:28 Сейчас в теме
Уж простите за поднятие старой темы, но другого алгоритма анализа схожести не нашел.

Не понял необходимость параметра ОбщДлинаСлов, какое число туда нужно помещать? Почему этот параметр нельзя вычислить перед перебором слов из массива? Или это средняя длина слов в массиве?
32. etmarket 541 10.06.18 15:51 Сейчас в теме
(31) Ну это суммарная длина строки по всем словам из массива. Можно это значение рассчитать внутри метода, чтобы избавить от параметра.
34. DrBlack 21 18.10.19 10:00 Сейчас в теме
(32) Любые операции со строками затратны по времени, по этому лучше рассчитать заранее и передавать параметром
35. Nikifforoff96 17.01.20 14:10 Сейчас в теме
(31) Попробуйте алгоритм сравнение строк триграммами.
Вместо поиска вхождений символов или целых слов можно искать вхождения триграмм.
"Поднятие старой темы" -> под одн дня нят яти тие иес ест ста тар аро рой ойт йте тем емы
И дальше считать процент триграмм, которые присутствуют в фразе, по которйо производится сравнение.
36. etmarket 541 17.01.20 18:08 Сейчас в теме
(35) стоит попробовать. И сравнить с двумя другими способами.
37. CheBurator 3425 17.01.20 22:16 Сейчас в теме
(36) еще есть "расстояние Левенгука" и еще какоето (какое-то - то же есть на сатйе).
38. etmarket 541 18.01.20 00:25 Сейчас в теме
(37) векторный поиск можно попробовать прикрутить. По принципу распознавания образов в аудио и видеосигнале.
39. Nikifforoff96 20.01.20 09:27 Сейчас в теме
(38) Если брать вектор целой фразы, то перестановка слов очень сильно повлияет на его расположение в системе координат. А если вектор каждого слова, то по точности сравнения операция будет сопоставима с обычным процентом побуквенного вхождения.
В аудио и видеосигналах ключевое значение имеет порядок данных, а в случае с фразами ключевое значение имеет наличие определенных корней и буквенных конструкций, их порядок не так важен.
40. Nikifforoff96 20.01.20 09:27 Сейчас в теме
(37)
расстояние Левенгука
вы про Расстояние Левенштейна?
41. CheBurator 3425 20.01.20 14:58 Сейчас в теме
(40) Точно! ;-)
просто копаешься в багах, вот Левенгук и лезет в голову
42. webdimon 03.06.20 10:48 Сейчас в теме
(41) А есть реализация по этому методу?
43. CheBurator 3425 04.06.20 03:57 Сейчас в теме
(42) есть. на 7.7 я много и аквтивно это использовал. Поищи на порталде "Удар по бездуховности" в моем профиле - это простенький демо-пример
33. etmarket 541 15.10.19 16:17 Сейчас в теме
[Обновление, 15.10.19] Добавлена обработка для 1С7.7, реализующая задачу при помощи алгоритмов из публикации.
Оставьте свое сообщение

См. также

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов Промо

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    48531    DarkAn    86    

Еще раз о рабочих днях. Быстрый способ расчета в запросах

Практика программирования Математика и алгоритмы Разработка v8 Абонемент ($m)

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

1 стартмани

20.06.2019    6497    Alxby    11    

Функциональное программирование в 1С

Практика программирования Математика и алгоритмы Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

28.03.2019    8168    alexey.kutya    26    

Агрегатное суммирование строк в запросе – сложно, но не невозможно Промо

Математика и алгоритмы v8 Абонемент ($m)

Описывается метод соединения строк из одной колонки таблицы в единую результирующую строку в запросе на языке 1С. Метод сложный и по сравнению с внезапросной техникой представляет больше спортивный, чем практический интерес.

1 стартмани

09.09.2013    77204    ildarovich    53    

Иерархия библиотек. Автоматическое обновление или как отказаться от переопределяемых модулей

Практика программирования Математика и алгоритмы Разработка v8 Абонемент ($m)

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

1 стартмани

04.03.2019    5622    Alxby    4    

Жизненный цикл управляемой формы. Шпаргалка разработчика

Практика программирования Математика и алгоритмы v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

29.06.2018    29823    stas_ganiev    26    

Принципы ООП в 1С на примере реализации pattern Decorator

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

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

1 стартмани

21.06.2018    11239    lazarenko    6    

Демо связи веб сервисов 1С и php Промо

Практика программирования Математика и алгоритмы WEB v8 1cv8.cf Абонемент ($m)

Демонстрация обращения к веб сервису 1С из php. Пример простейший, уровня hello world. Дана одна страница и информационная база 1С с одним справочником и одним веб сервисом. Веб сервис выдаёт содержимое справочника по запросу странички.

1 стартмани

19.07.2013    32021    Трактор    20    

Строим "фасады" в 1С

Практика программирования Математика и алгоритмы v8 Россия Абонемент ($m)

Как реализовать функционал, чтобы не было “мучительно больно” при расширении требований.

1 стартмани

04.05.2018    17318    ktb    41    

Случайность, совпадение, закономерность. Генератор случайных чисел

Практика программирования Математика и алгоритмы Игры v8 1cv8.cf Абонемент ($m)

Объект ГенераторСлучайныхЧисел удобно выдает случайные числа в заданном интервале значений. Исследование особенностей, рассуждения на тему случайных чисел, практика применения. Увлекательно в игровой форме можно исследовать работу генератора случайных чисел.

1 стартмани

20.01.2018    23746    Ликреонский    58    

Github и 1С. Пошаговая инструкция на конкретном примере

Математика и алгоритмы v8 Абонемент ($m)

Статья для тех, у кого есть неудержимое желание программировать и хочется доработать какую-то конфигурацию (или проект на 1С), выложенный на Github, но останавливают незнакомые слова Git, Github, Fork, Commit, Pull request, Merge, Issue.

1 стартмани

26.10.2017    43116    BlizD    51    

115 полезностей от Буравова Андрея по курсу СКД Евгения Гилёва Промо

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Посмотрел 5,5 часовой курс по системе компоновки данных. Нашел невероятное количество не только необходимого, но и примеры не очевидного поведения СКД. У многих не хватает времени и терпения досмотреть курс до конца. Прочитав 115 полезностей, вы сможете понять в каком уроке освещен интересующий вас вопрос и быстро открыть его, чтобы посмотреть видео.

1 стартмани

08.04.2012    37610    Flashill    69    

Планы обмена 1С: решение проблемы блокировок при помощи средств SQL Server

Практика программирования Математика и алгоритмы v8 Абонемент ($m)

Небольшое исследование возможности улучшить работу планов обмена 1С средствами SQL Server: view + triggers (представление + триггеры). В статье описывается один из приёмов SQL программирования для решения проблем блокировок, когда основные структуры данных изменить нельзя.

1 стартмани

10.01.2017    12929    zhichkin    4    

АЦРК: Многовариантный автоматический запрет редактирования (для конфигурации УТ 10.3)

Закрытие периода Математика и алгоритмы Администрирование данных 1С Закрытие периода v8 УТ10 Абонемент ($m)

В этой статье описывается усовершенствованная технология автоматической установки даты запрета редактирования Во-первых, можно определить несколько стратегий запрета редактирования с разными параметрами. Например, запрет в днях, запрет доступа в предыдущие месяцы кварталы и т.п., с указанием отступа от текущей даты. То есть для некоторых пользователей (рядовых менеджеров) при входе в базе будет устанавливаться запрет по вчерашний день, для других (старших менеджеров) на 5 дней назад, для третьих (администраторов базы или руководителей отдела) - запрет предыдущего месяца с отступом в 10 дней.. Во-вторых, запрет будет устанавливаться для ВСЕХ без исключения пользователей базы данных. Для самых привилегированных это будет максимальная глубина, но запрет будет установлен. Управление этой системой осуществляется через механизм дополнительных прав пользователей. При необходимости пользователь с полными правами может открыть для себя закрытый период, но только на текущий сеанс работы.

1 стартмани

22.07.2013    20817    acrk    9    

Разработка многоязычной системы

Математика и алгоритмы v8 Абонемент ($m)

В статье затронуты некоторые аспекты многоязычности системы с точки зрения их технической реализации

1 стартмани

20.06.2013    20825    YOr!k    54    

Технология создания коммерческих разработок на базе Базовой конфигурации "Управление Торговлей, ред.10.3" Промо

Математика и алгоритмы Рабочее место v8 v8::ОУ УТ10 УУ Абонемент ($m)

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

1 стартмани

11.03.2012    25357    Rustig    93    

Передача аргумента, полученного по ComConnector, на сервер

Математика и алгоритмы v8 Абонемент ($m)

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

1 стартмани

20.03.2013    6372    asved.ru    3    

Объектно-ориентированный взгляд на программирование в 1С

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Рассматриваем программирование в 1С как работу с объектами и классами.

1 стартмани

18.04.2012    28276    BorisMor    241    

Использование нарастающих итогов в партионном учете и не только

Математика и алгоритмы v8 Россия Абонемент ($m)

Данный материал является иллюстрацией способов работы с запросами, использующими методику вычисления «нарастающих итогов». Также в данной статье рассматриваются вопросы практического использования запросов такого рода при партионном учете и расчете задолженностей. Фактически в данной статье рассматриваются альтернативы запросам, приведенным в статьях http://infostart.ru/public/61295/ и http://infostart.ru/public/68225/. Полный текст статьи можно также найти на http://nashe1c.ru/materials-view.jsp?id=383.

1 стартмани

25.08.2011    13776    y-str    107    

Модуль менеджера или статические методы класса?

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Зачем в платформе 8.2 добавили модуль менеджера объекта, как его использовать? Попробуем разобраться.

1 стартмани

02.07.2010    60301    zfilin    97    

Как я победил блокировки (deadlock)

Математика и алгоритмы v8 1cv8.cf Россия Абонемент ($m)

Статья о том, как сделать работу нормальной, комфортной для пользователей, в большой базе с большим количеством пользователей.

1 стартмани

28.09.2009    21629    Minotavrik    64