Заказы на доработку 1С (сервис удаленной работы)

Хранилище

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

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Необходим алгоритм сравнения строк: вычисление коэффициента "похожести" двух строк в диапазоне от 0 до 1 - 1С          
cao0603 Подменю пользователя
сообщение 08.06.17, 18:38
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 75
Спасибо сказали: 0 раз
Рейтинг: 0

Сабж.

Или необходима [необходимо зарегистрироваться для просмотра ссылки] обработка.


 ! 

Правила: 5
 


Сообщение отредактировал Vofka - 12.06.17, 8:38

daveal Подменю пользователя
сообщение 09.06.17, 7:50
Сообщение #2

Говорящий
***
Группа: Пользователи
Сообщений: 70
Из: Киев
Спасибо сказали: 25 раз
Рейтинг: 0

[необходимо зарегистрироваться для просмотра ссылки]
Думаю это подойдёт. Есть реализация на разных языках.

daveal Подменю пользователя
сообщение 09.06.17, 9:15
Сообщение #3

Говорящий
***
Группа: Пользователи
Сообщений: 70
Из: Киев
Спасибо сказали: 25 раз
Рейтинг: 0

Function getCommonCharacters(string1, string2, allowedDistance)

  str1_len = StrLen(string1);
  str2_len = StrLen(string2);
  temp_string2 = string2;

  commonCharacters = "";

  For i = 1 To str1_len Do
    // compare if char does match inside given allowedDistance
    // and if it does add it to commonCharacters
    lowwerBound = Max(1, i - allowedDistance - 1);
    upperBound = Min(i + allowedDistance, str2_len);
    noMatch = True;
    j = lowwerBound;
    While j <= upperBound And noMatch Do
        If Mid(temp_string2,j,1) = Mid(string1,i,1) Then
          noMatch = False;
          commonCharacters = commonCharacters + Mid(string1,i,1);
        EndIf;
        j = j + 1;        
    EndDo;    
  EndDo;

  return commonCharacters;
EndFunction

Function Jaro( string1, string2 )

  str1_len = StrLen(string1);
  str2_len = StrLen(string2);

  // theoretical distance
  distance = Int(Max( str1_len, str2_len ) / 2.0) - 1;

  // get common characters
  commons1 = getCommonCharacters( string1, string2, distance );
  commons2 = getCommonCharacters( string2, string1, distance );

  commons1_len = StrLen(commons1);
  commons2_len = StrLen(commons2);
  
  If commons1_len = 0 Or commons2_len = 0 Then
      Return 0;
  EndIf;  
  
  // calculate transpositions
  transpositions = 0;
  upperBound = min(commons1_len, commons2_len);
  
  For i = 1 To upperBound Do
      If Mid(commons1,i,1) <> Mid(commons2,i,1) Then
          transpositions = transpositions + 1;
      EndIf;
  EndDo;
  
  transpositions = transpositions/2;

  // return the Jaro distance
  return (commons1_len/str1_len + commons2_len/str2_len + (commons1_len - transpositions)/(commons1_len)) / 3.0;

EndFunction

Function getPrefixLength( string1, string2, MINPREFIXLENGTH = 4)

  n = min(MINPREFIXLENGTH, StrLen(string1), StrLen(string2));

  For i = 1 To n Do
      If ( Mid(string1,i,1) <> Mid(string2,i,1) ) Then
          // return index of first occurrence of different characters
          Return i-1;
      EndIf;
  EndDo;
  
  Return n;
EndFunction

Function JaroWinkler(string1, string2, PREFIXSCALE = 0.1)

  JaroDistance = Jaro(string1, string2);

  prefixLength = getPrefixLength(string1, string2);

  return JaroDistance + prefixLength * PREFIXSCALE * (1.0 - JaroDistance);
    
EndFunction


Но этот алгоритм не работает с перестановками слов.
Сравнение алгоритмов по функционалу [необходимо зарегистрироваться для просмотра ссылки]

cao0603 Подменю пользователя
сообщение 09.06.17, 16:46
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 75
Спасибо сказали: 0 раз
Рейтинг: 0

XBrut @ Вчера, 20:23 * ,
у меня есть например
болт 2-8-10-кд ост 133078
болт 3-8-12-ц ост 133078
и вывести насколько они совпадают

daveal Подменю пользователя
сообщение 12.06.17, 8:02
Сообщение #5

Говорящий
***
Группа: Пользователи
Сообщений: 70
Из: Киев
Спасибо сказали: 25 раз
Рейтинг: 0

Ну так этот алгоритм вернет 0,89777 для этих строк, а, например болт 2-8-10-кд ост 133078 и болт 3-8-10-кд ост 133078 будет 0,98400.
Проблема только будет с перестановками, например, если будет в одной строке "ост 133078", а в другой "133078 ост". Тогда нужно другие алгоритмы искать.
По ссылке на сравнение выше можно посмотреть какие результаты вернет тот или иной алгоритм.
А как нормализовать строки перед применением (привести к верхнему регистру или нижнему, убрать разделители или не убирать) - это уже зависит от входных данных.


cao0603 Подменю пользователя
сообщение 12.06.17, 18:48
Сообщение #6

Говорящий
***
Группа: Пользователи
Сообщений: 75
Спасибо сказали: 0 раз
Рейтинг: 0

daveal @ Сегодня, 9:02 * ,
да все верно, а вот надо как то нормализовать обе строки, а как?это вопрос, или чтобы алгоритм распознавал чисто по цифрам , а не просто символам

daveal @ Сегодня, 9:02 * ,
это я привел такой пример где две строки один в один идут, а есть строки где Вы видишь что они похожи, но из за разного форматирования они разные по алгоритму

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 17.04.24, 0:46
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!