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

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

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

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

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

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

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

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

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

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

обратите внимание, что разбивка по словам выполняется в методе SysSearch::splitIntoWords
может быть, стоит допилить этот метод, чтобы научить его новым трюкам и разделителям.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 14.10.2010, 11:35   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,727 / 839 (31) +++++++
Регистрация: 15.01.2002
Адрес: Москва
нечеткий поиск
Там простенький алгоритм, который элементарно реализуется на .Net и подключается как функция в БД.
Старый 14.10.2010, 14:40   #5  
samolalex is offline
samolalex
Участник
Аватар для samolalex
Самостоятельные клиенты AX
 
254 / 106 (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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,840 / 3738 (182) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Я смотрю и удвиляюсь.
Интересно вы как-то перешли от группировки различных записей по похожести (все-со-всеми) к поиску подстроки (одной!) в наборе записей.

Цитата:
Сообщение от Logger Посмотреть сообщение
Суть проблемы : есть ряд записей в справочнике, у которых
Цитата:
Сообщение от samolalex Посмотреть сообщение
Ниже я разместил код джобика, реализующего простой алгоритм поиска подстроки в массиве данных:
Дык, у него длительность будет пропорциональна O(2*n^2) для всех работы по всем записям.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 14.10.2010, 19:33   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,133 / 1534 (58) ++++++++
Регистрация: 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
 
1,713 / 885 (33) +++++++
Регистрация: 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, время: 09:28.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.