Имя: Пароль:
1C
 
Нечеткий поиск с помощью StrMatch.dll
0 Попытка1С
 
28.09.09
15:06
Всем привет.

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

Делаю так:

Док.ВыбратьСтроки();
   Пока Док.ПолучитьСтроку() = 1 Цикл
Ном=Ном+1;Состояние("Добавляем "+Ном+"-й элемент в кэш");
Наименование=Док.МПЗ.Наименование;
идЭлемента=Док.МПЗ.ПолныйКод();
оПоиск.ДобавитьВКэш(идКэша, Наименование, 0, идЭлемента);
КонецЦикла;

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


СчетУчета = СчетПоКоду("41.2");    
   БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
   БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклатура,,1);
   БухИт.ИспользоватьСубконто(ВидыСубконто.МестаХранения,Док.МестоХранения,2);
   БухИт.ВыполнитьЗапрос(,ТекущаяДата(),СчетУчета,,,,, "СК");
БухИт.ВыбратьСубконто(1);
   Пока БухИт.ПолучитьСубконто(1) = 1 Цикл
       Если БухИт.СКД("К") <= 0 Тогда
           Продолжить;
       КонецЕсли;
Код = 0;
           КПохожести = 0;
           оПоиск.СравнитьСКэшем(1, СокрЛП(БухИт.Субконто(1).Наименование), 5);
           Для Сч = 1 По 5 Цикл
               оПоиск.ПолучитьИзПодбора(Сч, Код, КПохожести);
Спр.НайтиПоКоду(Код,2)
Сообщить(""+КПохожести + "--- " + Спр.ТекущийЭлемент());

Вообщем возвращаются значения не соответствующие реальности, на подобие

249
247
235
130
127

Где косяк не пойму...
1 Попытка1С
 
28.09.09
15:07
Причем если взять любую строку из вернувшийся и сравнить с исходной методом:

оПоиск.Сравнить(Строка1,Строка1);

то получаются правильные значения.
2 yukon
 
28.09.09
15:21
(1) Правильные это какие?

А в целом: "Непонятно? Читай мануал!"

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

----
В ПолучитьИзПодбора() коэффициент похожести тот же, что и в Сравнить()
3 Попытка1С
 
28.09.09
15:23
(2) Это я все читал, дальше что...

Правильные это более преближенные к реальности.
А не за 200.

По (1) есть что ответить, или ограничишся копипастом?
4 yukon
 
28.09.09
15:26
(3) Что значит более приближенные?
За 200 коэффициент может запросто выходить. Это не процент(!) похожести, а просто значение для сравнения.

Строка1 с коэффициентом 249 более похожа на исходную строку, чем строка2 с коэффициентом 127. Но насколько похоже коэффициент не указывает. Другими словами Сравнить(Строка1,Строка2) это не 249/127, и не 249-127, и вообще прямой связи нет
5 Попытка1С
 
28.09.09
15:30
(4) Так стоп!

Вот пример:
Сообщить из ПолучитьИзПодбора()

Cалфетки влажные SALFETI JUNIOR для подростков п/э
195--- Салфетки влажные для очистки рук TOP GEAR LADY 24х
115--- Контейнер для косметических салфеток KOALA полирез
107--- Контейнер для косметических салфеток GALICIA полир
105--- Контейнер для косметических салфеток MARINA полире
100--- Контейнер для косметических салфеток HOSOMI полире

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

Cалфетки влажные SALFETI JUNIOR для подростков п/э
vs
Салфетки влажные для очистки рук TOP GEAR LADY 24х
= 35.58394160583941605839 %
6 yukon
 
28.09.09
15:31
(5) т.е. Сравнить("Cалфетки влажные SALFETI JUNIOR для подростков п/э","Салфетки влажные для очистки рук TOP GEAR LADY 24х") выдает  "35.58394160583941605839%"?
7 Попытка1С
 
28.09.09
15:32
(6) да, это % похожести.
8 yukon
 
28.09.09
15:35
Сообщить(AddIn.Сравнить("Cалфетки влажные SALFETI JUNIOR для подростков п/э","Салфетки влажные для очистки рук TOP GEAR LADY 24х")) у меня выдало число 195
9 Попытка1С
 
28.09.09
15:38
(8) хм....

Вот у меня:

Строка1 = "Cалфетки влажные SALFETI JUNIOR для подростков п/э"
Строка2 = "Салфетки влажные для очистки рук TOP GEAR LADY 24х"

Процедура Сравнить()
   МаксКоэф=оПоиск.Сравнить(Строка1,Строка1);
   Сообщить(Строка1+" vs "+Строка2+" = "+(оПоиск.Сравнить(Строка1,Строка2)/МаксКоэф)*100+" %");
КонецПроцедуры    // Сравнить
10 Попытка1С
 
28.09.09
15:40
Разобрался.

тут МаксКоэф выдает значение в 548 а не 100.

Спс за помощь.
11 yukon
 
28.09.09
15:47
(9) Так понятно откуда 35.58394160583941605839%, т.е. это 195/548

Но в (4) я уже сказал, что пытаться сравнивать коэффициенты можно только по больше/меньше. Соотношения к1/к2 смысла не имеют, т.к. коэффициент похожести явно нелинейный.
12 Попытка1С
 
28.09.09
15:55
(11) Да я уже допер.. спс =)
13 yukon
 
28.09.09
15:58
(0) Наверно немного не так надо сделать по задаче:

1. Заносим в кэш все товары которые есть на остатке:

БухИт = СоздатьОбъект("БухгалтерскиеИтоги");
БухИт.ИспользоватьСубконто(ВидыСубконто.Номенклатура,,1);
БухИт.ИспользоватьСубконто(ВидыСубконто.МестаХранения,Док.МестоХранения,2);
БухИт.ВыполнитьЗапрос(,ТекущаяДата(),СчетУчета,,,,, "СК");
БухИт.ВыбратьСубконто(1);

Пока БухИт.ПолучитьСубконто(1) = 1 Цикл
   Если БухИт.СКД("К") <= 0 Тогда
       Продолжить;
   КонецЕсли;
   Номенклатура = БухИт.Субконто(1);
   Наименование = Номенклатура.Наименование;
   идЭлемента   = Номенклатура.ПолныйКод();
   оПоиск.ДобавитьВКэш(идКэша, Наименование, 0, идЭлемента);
КонецЦикла;

2. Затем выбираем номенклатуру из документа, и получив самое похожее наименование из кэша, выводим остаток по этой позиции:

Спр = СоздатьОбъект("Справочник.Номенклатура");

Док.ВыбратьСтроки();
Пока Док.ПолучитьСтроку() = 1 Цикл
   Наименование=СокрЛП(Док.МПЗ.Наименование;
   оПоиск.СравнитьСКэшем(1, Наименование, 1);
   
   Для Сч = 1 По 1 Цикл
       оПоиск.ПолучитьИзПодбора(Сч, Код, КПохожести);
       Спр.НайтиПоКоду(Код,2)
       
       БухИт.ПолучитьСубконто(1,Спр.ТекущийЭлемент());
       Сообщить(Наименование + "("+ Спр.Наименование+") " + БухИт.СКД("К"));
       
   КонецЦикла;
   
КонецЦикла;
14 Попытка1С
 
28.09.09
16:19
(13) не сильно большая разница какую таблицу с какой сравнивать.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.