AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.10.2010, 00:13   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,940 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Нечеткое сравнение строк
Здравствуйте.

Кто-нибудь делал функцию нечеткого сравнения строк ?

Суть проблемы : есть ряд записей в справочнике, у которых отличаются наименования перестановкой слов, пропуском знаков препинания и кавычек, пропуском некоторых слов и т.п. Хотелось бы поиметь некую строковую функцию, которая позволила бы определить что формально разные названия суть одно и то же.
Ну то есть понимала бы что строки
"ООО "Рога и копыта""
"Рога и копыта ООО"
"Рога и копыта, inc"
"Рога и копыта"
""Рога и копыта""
""Рога и копыта, ООО""

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

Задача возникла при внедрении аксапты в филиале компании. Т.е. справочники контрагентов и номенклатур у нас похожи, но кодировка разная. При закачке справочников в аксапту появились дубликаты. Выверка по ИНН и артикулам не дает нужного результата, так как в справочниках предоставленных филиалом было много ошибок, неточностей и т.п. При любой спорной ситуации только человек по названию может определить являются ли 2 записи дублем или это разные сущности. Хотелось бы как-то облегчить людям труд по выверке справочников и сгруппировать записи которые с большой долей вероятности могут быть дублями одной и той же сущности.
Старый 14.10.2010, 08:44   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Не так давно было похожее обсуждение Унифицированный справочник цветов
Старый 14.10.2010, 09:12   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Кто-нибудь делал функцию нечеткого сравнения строк ?
ну... здесь не совсем нечеткое сравнение.
нечеткое сравнение предполагает, что строки могут чуть-чуть отличаться в любом месте
алгоритм нечеткого сравнения безумно тяжелая штука и, скорее всего, будет работать долго.

здесь же предполагается, что есть некое ядро из одинаковых СЛОВ.
плюс-минус несколько разделителей и/или других слов.

если у вас ax2009 или ax4, то воспользуйтесь агентом данных:
1. главное меню \ основное \ настройка \ агент данных
2. добавьте вашу таблицу с названиями.
3. запустите агент данных.
4. пусть он переиндексирует все записи таблицы (заодно у вас заработает глобальный поиск )

в результате работы агента:
5. все тексты будут разбиты на слова, которые будут хранится в таблице SysSearchName
6. а в таблице SysSearchPath будут ссылки на выделенные слова и ссылки на записи.

Ваша задача - найти такие записи, у которых максимальное число общих слов.
А это уже вполне подъемный запрос (в отличие от алгоритма нечеткого сравнения строк ВСЕ-СО-ВСЕМИ).
А если вы еще выделите незначимые слова (ООО, Ltd и т.п.) и не будете учитывать их при подсчете, то будет вообще хорошо.

обратите внимание, что разбивка по словам выполняется в методе SysSearch::splitIntoWords
может быть, стоит допилить этот метод, чтобы научить его новым трюкам и разделителям.
__________________
полезное на axForum, github, vk, coub.
Старый 14.10.2010, 11:35   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
нечеткий поиск
Там простенький алгоритм, который элементарно реализуется на .Net и подключается как функция в БД.
Старый 14.10.2010, 14:40   #5  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
259 / 107 (4) +++++
Регистрация: 18.06.2010
Адрес: Москва
Ниже я разместил код джобика, реализующего простой алгоритм поиска подстроки в массиве данных:

X++:
static void IllegibleSearching(Args _args)
{
    str     strArr[9]; //массив данных
    str     searchStr = "ога и коп"; //поисковая строка
    Counter i, j;
    Set     indexSet = new Set(Types::Integer);//множество индексов найденных элементов
    ;

    strArr[1] = "ООО 'Рога и копыта'";
    strArr[2] = "Рога и копыта ООО";
    strArr[3] = "Тестовая строка1";
    strArr[4] = "Рога и копыта, inc";
    strArr[5] = "Тестовая строка2";
    strArr[6] = "Рога и копыта";
    strArr[7] = "Рога и копыта";
    strArr[8] = "Тестовая строка3";
    strArr[9] = "'Рога и копыта, ООО'";

    for(i=1; i<=9; i++)
    {
        if(strscan(strArr[i],searchStr,1,100))
            indexSet.add(i);
    }

    for(i=1; i<=9; i++)
    {
        if(indexSet.in(i))
            info(strArr[i]);
    }
}
__________________
С уважением, Александр.
Старый 14.10.2010, 14:46   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Я смотрю и удвиляюсь.
Интересно вы как-то перешли от группировки различных записей по похожести (все-со-всеми) к поиску подстроки (одной!) в наборе записей.

Цитата:
Сообщение от Logger Посмотреть сообщение
Суть проблемы : есть ряд записей в справочнике, у которых
Цитата:
Сообщение от samolalex Посмотреть сообщение
Ниже я разместил код джобика, реализующего простой алгоритм поиска подстроки в массиве данных:
Дык, у него длительность будет пропорциональна O(2*n^2) для всех работы по всем записям.
__________________
полезное на axForum, github, vk, coub.
Старый 14.10.2010, 19:33   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mazzy Посмотреть сообщение
Я смотрю и удвиляюсь
Мда... Этот вариант совсем не вариант . Хотя, если его развить, то может получится что-то вроде этого http://ms.by.ru/HTML/37.htm
Цитата:
Алгоритм сравнения строк. Функция нечёткого сравнения использует в качестве аргументов две строки и параметр сравнения - максимальную длину сравниваемых подстрок. Результатом работы функции является число, лежащее в пределах от 0 до 1. 0 соответствует полному несовпадению двух строк, а 1 - полной (в определённом ниже смысле) их идентичности. Сравнение строк происходит по следующей схеме. Пусть, например, в качестве аргументов заданы две строки "test" и "text" и некоторая максимальная длина подстрок, скажем, 4. Функция сравнения составляет все возможные комбинации подстрок с длинной вплоть до указанной и подсчитывает их совпадения в двух сравниваемых строках. Количество совпадений, разделённое на число вариантов, объявляется коэффициентом схожести строк и выдаётся в качестве результата работы функции.
Но боюсь, что работать это будет не просто долго, а очень долго.

Также если кому интересно http://ru.wikipedia.org/wiki/Расстояние_Левенштейна и другие Алгоритмы приблизительного сравнения текста
Старый 14.10.2010, 20:55   #8  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Насколько помню историю вопроса, большинство алгоритмов нечеткого сравнения строк (самый известный Саундекс) разрабатывались под конкретную программу: перепись населения в США с первым применением автоматизированной обработки.
Отсюда недостаток - хорошо работаю на английских фамилиях, а для прочего нужно относится осторожно.
PS: хотя, в свое время, мы использовали тот же Саундекс для сопоставления номенклатуры в прайс-листах конкурентов и результаты были вполне удовлетворительными.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Сортировка и сравнение строк Perc DAX: Программирование 14 25.08.2010 20:06
Баг? Сравнение строк длиной более 32767 символов vallys DAX: База знаний и проекты 6 16.07.2008 12:18
Тормозит копирование строк в буфер обмена ivas DAX: Программирование 20 21.08.2007 15:05
Пользовательский генератор строк-перечислений...- 2: Доп.вкладка для SysQueryForm Gustav DAX: База знаний и проекты 1 04.05.2007 18:04
БАГ: копирование строк накладных в новый заказ Антон Солдатов DAX: Функционал 2 03.12.2004 09:02

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:29.