|
Нечеткий поиск по ФИО в базе | ☑ | ||
---|---|---|---|---|
0
Garykom
гуру
15.11.15
✎
23:00
|
Есть база (кому интересно 115ФЗ) примерно 6к+ записей
Там есть ФИО, ДР, паспорт, адрес Есть анкеты клиентов где тоже есть эти данные ФИО, ДР, паспорт, город, телефон и т.д. Анкет клиентов на данный момент 4к+, и каждый месяц +200. Какими алгоритмами будет быстрее сверять все наши анкеты на нахождении в перечне? Перечень довольно часто обновляется (целиком замена) несколько раз в месяц. Требуется сделать проверку всех наших анкет с нечетким поиском в перечне. Типа есть у нас Иванов Иван Иванович, а в перечне есть Иванов Иван Петрович - тогда этот наш Иванович И.И. должен попасть в список на проверку оператором. Алгоритм должен работать очень шустро. Максимум на проверку 10к среди 10к 2-5 минут. |
|||
1
Garykom
гуру
15.11.15
✎
23:03
|
(0) + дополнение, все усложняется что не только по одному полю ФИО искать и сверять но и по другим (паспорт, адрес)
|
|||
2
Maniac
15.11.15
✎
23:14
|
запрос ПОДОБНО
|
|||
3
Maniac
15.11.15
✎
23:14
|
условия по другим полям
ИЛИ ИЛИ ИЛИ и тд |
|||
4
Garykom
гуру
15.11.15
✎
23:15
|
(2) что и чему подобно?
Иванов подобно Иавнов? |
|||
5
Garykom
гуру
15.11.15
✎
23:15
|
(4)+ и это не решает проблему "запросов в цикле"...
|
|||
6
Maniac
15.11.15
✎
23:17
|
ПОДОБНо единственный метод во всей 1С который может искать какие то вхождения.
|
|||
7
Maniac
15.11.15
✎
23:17
|
в запросах.
|
|||
8
Maniac
15.11.15
✎
23:18
|
Какие еще запросы в цикле.. ты чо несешь.
|
|||
9
Maniac
15.11.15
✎
23:19
|
По поводу скорости: 4к вообще ниочем.
Даже для 100 000 никаких проблем нет. |
|||
10
Garykom
гуру
15.11.15
✎
23:20
|
(6) т.е. про http://1clancer.ru/article/polnotekstovoj_poisk_i_nechetkij_poisk_720 не слышали?
(8) у нас 10 тысяч записей, каждую из наших нужно сверить с базой тоже 10 тысяч классический запрос в цикле, и пофиг что эти циклы сам sql сервер будет делать время выполнения такого запроса представляем? |
|||
11
GROOVY
15.11.15
✎
23:21
|
||||
12
Maniac
15.11.15
✎
23:21
|
(10) так зачем ты тему завел? беги покупай решение)))
Полнотекстовый поиск не панацея. Индексирование базы, разбухание. И далеко не самый лучший результат. |
|||
13
Garykom
гуру
15.11.15
✎
23:22
|
(9) может хорош путать https://helpf.pro/faq/view/852.html
обычный "like" и "нечеткий поиск" когда нужно искать если есть ошибки при вводе и у нас и в базе |
|||
14
Maniac
15.11.15
✎
23:23
|
(10) нифига не понял какие еще циклы.
Поисковую строку делаешь. Пишешь запрос. Метод ПОДОБНО. Все. |
|||
15
Garykom
гуру
15.11.15
✎
23:23
|
(12) то решение не устраивает по скорости и кроме 1С 8.X есть еще и 1С 7.7
|
|||
16
Garykom
гуру
15.11.15
✎
23:23
|
(14) eqlb ghfnbdysq
|
|||
17
Garykom
гуру
15.11.15
✎
23:25
|
(16)+ сорри
не подходит "подобно" потому что оно ищет вхождения а нам нужно искать вхождения с ошибками типа пропуска символов, замены символов и перестановки символов про расстояние Левенштайна слышали? А хеширование по сигнатуре? http://habrahabr.ru/post/114997/ |
|||
18
Maniac
15.11.15
✎
23:26
|
я не знаю что ты хочешь но в 1С всего два варианта и больше никаких.
Либо ПОДОБНО либо полнтекстовый поиск. У него минимум методов в СП |
|||
19
Maniac
15.11.15
✎
23:26
|
и другого не дано.
|
|||
20
Maniac
15.11.15
✎
23:27
|
можешь хоть головой об стену бится. искать и думать что есть еще варианты - но их нет.
|
|||
21
Garykom
гуру
15.11.15
✎
23:28
|
(18)(19) спасибо, только где в (0) хоть слово про 1С?
|
|||
22
Maniac
15.11.15
✎
23:28
|
для восьмерки без вариантов.
Для семерки походу только с ВК. и то если такие есть. |
|||
23
Garykom
гуру
15.11.15
✎
23:28
|
(20) иногда лучше не показывать свою некомпетентность в вопросе не?
|
|||
24
Garykom
гуру
15.11.15
✎
23:29
|
(22) ВК есть, причем несколько
проблему скорости они не решают |
|||
25
Maniac
15.11.15
✎
23:29
|
(21) тут сайт по 1С.
Если речь не про 1С - какого уя ты мосх тогда делаешь. надо было и пасть что не 1С а указывать конкретно СУБД, ПО и прочее. В надежде найти что тут найдутся спецы по другим СУБД. |
|||
26
Garykom
гуру
15.11.15
✎
23:30
|
(25) Ну реально ну что ты прицепился?
На раздел то глянь |
|||
27
Maniac
15.11.15
✎
23:31
|
Ну не решают. Чо те сказать. Ничего.
Я ушел. тема скучная - разбирайтесь со своими таркаканами как хотите. Шансов что тут найдутся телепаты который вам забесплатно напишут суперскоростной поиск по хз каким требованиям поиска в неизвестном ПО - стремятся к нулю. |
|||
28
Garykom
гуру
15.11.15
✎
23:32
|
(27) как и сам напишу, поднял тему потому что она многих сча касается
и скажу огромное спасибо за куда копать и что почитать |
|||
29
Maniac
15.11.15
✎
23:32
|
(26)
"по скорости и кроме 1С 8.X есть еще и 1С 7.7" "хоть слово про 1С?" без комментариев. |
|||
30
Garykom
гуру
15.11.15
✎
23:34
|
(28)+ пока наиболее перспективно это:
1. Сначала "Хеширование по сигнатуре" - т.е. все записи делим на группы Это дает сокращение для последующей проверки 2. Далее "Расстояние Дамерау-Левенштейна" |
|||
31
Garykom
гуру
15.11.15
✎
23:34
|
(29) читать то может научимся?
"спасибо, только где в (0) хоть слово про 1С?" |
|||
32
Garykom
гуру
15.11.15
✎
23:36
|
(31) тема напрямую к 1С не относится, разве что только тем что наша база в 1С хранится, но экспортнуть не проблема
когда начали твердить про "ПОДОБНО" причем очень настойчиво сделал резонно что не только 1С 8 есть так то. |
|||
33
Maniac
15.11.15
✎
23:36
|
А по моему надо так:
за ошибки в базе по рукам надавать. А за ошибки при поиске вообще на кол. |
|||
34
Garykom
гуру
15.11.15
✎
23:38
|
(33) Может начнем слово держать? "Я ушел. тема скучная"©
Не подскажешь чем тема то зацепила? |
|||
35
kyvv
15.11.15
✎
23:47
|
А по одной записи из анкет сколько штатный поиск 1с длится?
|
|||
36
Garykom
гуру
15.11.15
✎
23:49
|
(35) не проверял но явно больше 1 секунды и это без учета ошибок
|
|||
37
kyvv
15.11.15
✎
23:57
|
Кроме "ФИО, ДР, паспорт, адрес" другие данные, по которым поиск то и не нужен, в базе есть?
|
|||
38
Drac0
15.11.15
✎
23:57
|
(30)
1. Хэширование поможет, имхо, если процент ошибок заметно меньше, чем корректных данных. Смотрел в сторону регулярных выражений? |
|||
39
Garykom
гуру
16.11.15
✎
00:05
|
(37) в какой базе?
суть что эти есть, по другим вроде поиск не нужен |
|||
40
Garykom
гуру
16.11.15
✎
00:06
|
(38) % ошибок небольшой, но даже одна пропущенная может стоит слишком дорого в виде штрафов
а чем регулярки тут помогут? |
|||
41
kyvv
16.11.15
✎
00:17
|
(36) Без ошибок не получится, наверное, при нечетком поиске.
(39) Я к тому, что поиск идет по всей базе, а не только по нужному справочнику. Если в базе много "лишнего", то убрав это "лишнее", время поиска можно сократить. Вы же не будете каждый раз искать по всем анкетам? А при двух сотнях может и время будет приемлемое. |
|||
42
Красный рассвет
16.11.15
✎
00:17
|
Что, несовпадения в номерах паспортов тоже могут быть с ошибками в обоих списках?
Небольшой процент ошибок, это сколько? Т.е. в основном записи совпадают по всем полям? |
|||
43
Garykom
гуру
16.11.15
✎
00:21
|
(41) да согласен можно проверять каждый день по чуть чуть
"будем резать хвост по кусочкам из жалости" суть что вышел новый перечень, и мы тут же по нему должны в течении дня проверить всех кто был у нас за квартал (это по закону), точнее с момента последней проверки но так как мы не знаем кто был а кто нет (такие изначальные условия) приходится проверять всю базу |
|||
44
Garykom
гуру
16.11.15
✎
00:24
|
(42) Анкеты заносят ручками с бумажных или со слов покупателя = ошибки ввода
Скажем 1 из 10-20 анкет содержит разные ошибки (смотря кто заносил) "Т.е. в основном записи совпадают по всем полям?" - это не понял |
|||
45
Garykom
гуру
16.11.15
✎
00:24
|
Т.е. все решения как избавиться от это Ф уже пройдены.
Избавиться не получится, нужно решение максимально близкое к (0). |
|||
46
Drac0
16.11.15
✎
00:34
|
(45) Тогда я за алгоритм N-грамм для ошибочных строк. Можно и на 1С его реализовать, но сильно не уверен в производительности, да и точность у него не 100%. В полнотекстовом поиске я не уверен еще до конца, чудит он часто очень.
|
|||
47
Garykom
гуру
16.11.15
✎
00:43
|
(46) да полнотекстовый из 1С это эрзац решение
метод N-грамм имеет одну нехорошую для данного случая особенность "Алгоритм N-грамм находит не все возможные слова с ошибками. Если взять, например, слово ВОТКА, и разложить его на триграммы: ВОТКА ? ВОТ ОТК ТКА — то можно заметить, что они все содержат ошибку Т. Таким образом, слово «ВОДКА» найдено не будет, так как оно не содержит ни одной из этих триграмм, и не попадет в соответствующие им списки." |
|||
48
Garykom
гуру
16.11.15
✎
03:04
|
апну пока не уснул ))
Случаем сервисов в инете для подобного нечеткого сравнения и/или поиска по строкам нет еще? |
|||
49
Злопчинский
16.11.15
✎
03:18
|
используй strmatch - дает хороший результат, если к этому пристегнуть какую-нить эвристику (типа Иванов иван Иванович из Хабаровск и Иванов Иван Иванович из Орел - скорее всего не ошибка). Работает хорошо, я на нем наблатыкался. Если хочешь - могу прогнать у себя пример (даешь исходный массив и массив который надо проверить) - покажу как работает.
|
|||
50
Злопчинский
16.11.15
✎
03:20
|
(48) strmatch найдет.
|
|||
51
Злопчинский
16.11.15
✎
03:23
|
(43) "суть что вышел новый перечень, и мы тут же по нему должны в течении дня проверить всех кто был у нас за квартал (это по закону), точнее с момента последней проверки"
. результат нормальный будет - у меня хороший оператор несколько тысяч новых позиций за день "отчекрыживал" с очень высокой степенью точности. |
|||
52
Garykom
гуру
16.11.15
✎
03:53
|
(51) проблема что нет возможности на день проверку растянуть
максимум 5 минут и нужно (проверив сразу несколько наших тысяч по нескольким тысячам их) вывести список с кем оператор будет уже поштучно разбираться да можно запустить проверку - она полдня работает - выводит результат но не хочется такого, это только в крайнем случае |
|||
53
Garykom
гуру
16.11.15
✎
03:58
|
в принципе нашел подходящий метод, самое смешное что по нему на русском нет инфы совсем
заключается в совмещении метода 2-грамм и хеширования по ним полученные битовые хеши между собой сравнивать их уже проблем нет их мало |
|||
54
los_hooliganos
16.11.15
✎
05:19
|
SOUNDEX (Transact-SQL)
Функция SOUNDEX преобразует алфавитно-цифровую строку в 4-символьный код, чье значение зависит от способа звучания строки при произношении. Первый символ кода является первым символом character_expression, преобразованным в верхний регистр. Второй, третий и четвертый символы кода являются числами, которые обозначают буквы в выражении. Буквы A, E, I, O, U, H, W и Y игнорируются, если только не являются первой буквой строки. Нули добавляются в конце при необходимости производить четырехсимвольный код. Дополнительные сведения о коде SOUNDEX см. в разделе Система индексирования Soundex. Коды SOUNDEX из разных строк можно сравнивать, чтобы узнать, насколько похоже звучат строки при произношении. Функция DIFFERENCE выполняет SOUNDEX по двум строкам и возвращает целое число, представляющее сходство кодов SOUNDEX для этих строк. Функция SOUNDEX учитывает параметры сортировки. Строковые функции могут быть вложенными |
|||
55
los_hooliganos
16.11.15
✎
05:21
|
||||
56
ЧеловекДуши
16.11.15
✎
06:26
|
(10) Ну давай, используй полнотекстовый поиск, коль считаете его быстрым и удобным и динамическим ;)
...Вот только 1С сама его не использует, как бы... :) |
|||
57
ЧеловекДуши
16.11.15
✎
06:28
|
+(10) 10000 записей, это Мгновение, для прямого запроса, написанного Абы как. Если еще и оптимизируешь, то и 100 000 записей не предел :)
|
|||
58
ЧеловекДуши
16.11.15
✎
06:30
|
(17) Вам нужен осмысленный поиск того мусора что ввел оператор. Т.е. оператор вводит Бред, а ваш поиск все понимает :)
|
|||
59
ЧеловекДуши
16.11.15
✎
06:32
|
(21) Маниак прав. Какая разница, 1С не 1С. Все едино. Все сведется к команде ПОДОБНО, или LIKE.
|
|||
60
ЧеловекДуши
16.11.15
✎
06:34
|
(30) Бред... что по вашему Индекс? :)
|
|||
61
ЧеловекДуши
16.11.15
✎
06:35
|
(37) Автор не удосужился привести структуру данных, где собрался искать.
Нет описания Индексов, если они есть :) ...нет данных... |
|||
62
Mikeware
16.11.15
✎
07:27
|
(59) маня как был сварщиком с большими понтами, так и остался...
(54) штатный soundex ориентирован на английский язык. Но и русские версии существуют. В т.ч. "русификация" обсуждалась и на хабре, правда, уж давно. Я в позапрошлой конторе пытался реализовать по тем алгоритмам, но до нормальной работы не довел.... (17) Скорее, надо не левенштайновское, а Дамерау-Левенштайна. но уже по предварительно отфильтрованному саундэксом.... |
|||
63
Garykom
гуру
16.11.15
✎
08:08
|
(62) да Демерау-Левенштайн (30)
но сначала симхеш (53) саундекс не подойдет, там слишком короткий хеш, много выбирать а в симхеш можно регулировать длину хеша как хочется |
|||
64
Garykom
гуру
16.11.15
✎
08:13
|
(60) а что по вашему индекс? и чем он отличается от хеша?
|
|||
65
Mikeware
16.11.15
✎
08:15
|
(63) хозяин-барин.
хотя я б основывался на саундэксе.. |
|||
66
Garykom
гуру
16.11.15
✎
08:18
|
(65) саундекс 1137 и 2137 слишком далеко поставит для паспортов
|
|||
67
los_hooliganos
16.11.15
✎
08:27
|
(66) Круто. Оператору по телефону сказал Один, а он записал Два.
|
|||
68
Горогуля
16.11.15
✎
08:31
|
(67) хотя тянул палец к 1
|
|||
69
Mikeware
16.11.15
✎
08:34
|
(66) саундекс основывается на _произношении_... хотя, если в вашей части галактики "один" произносится почти как "два"....
|
|||
70
vde69
16.11.15
✎
08:35
|
все не осилил....
подобные задачи нужно решать используя алгоритм "разделяй и властвуй", то есть банально нужно разделить 10000 записей на группы которые не будут меняться в последствии (например пол, дата рождения) этого будет достаточно... далее в каждой группе ищем пары по любому алгоритму, хоть простым перебором... в итоге имеем цикл по 1000 групп с небольшим кодом внутри... |
|||
71
Mikeware
16.11.15
✎
08:37
|
(70) к какой группе ты отнесешь "Гадя Петрович Хреново"? :-)
|
|||
72
Garykom
гуру
16.11.15
✎
08:38
|
(69) в нашей галактике не произносится, а заносится с помощью клавиатуры...
|
|||
73
Garykom
гуру
16.11.15
✎
08:39
|
(71) тролль, лейвел не определим, скиллов распознания не хватает...
|
|||
74
Maniac
16.11.15
✎
08:43
|
Мосх не ипите.
Берем пример дофигища реальных примеров: звоните ли вы в банк, куда нить в интернет магазин или еще куда. Спрашивают ФИО и последние 4 цифры телефона. Подозреваю что поиск делают по номеру телефона, а ФИО смотрят для подтверждения. |
|||
75
Mikeware
16.11.15
✎
08:43
|
(72) ну вот "тысяча сто тридцать семь" и "две тысячи сто тридцать семь" и вправду достаточно далеко.
Еще раз намекаю, что соундекс - не универсальное сравнение, а сравнение по произношению... кстати, интересно - а чего наше государство в номер паспорта КЦ не ввело? |
|||
76
vde69
16.11.15
✎
08:43
|
(71) пол и дата рождения (или хотя-бы год рождения) это отдельные поля обязательные для заполнения...
|
|||
77
Maniac
16.11.15
✎
08:44
|
смотрю на тему - и вижу что нифига никто ничего так и не может ничего автору дать реального.
Болтология одна. |
|||
78
Mikeware
16.11.15
✎
08:44
|
маня делает новые открытия....
это ж сколько надо пить, чтоб в понедельник с утра выдавать такие сентенции.... |
|||
79
Garykom
гуру
16.11.15
✎
08:44
|
(76) так пола нигде нету ((
а в дате рождения "все лгут" |
|||
80
Maniac
16.11.15
✎
08:45
|
(78) иди проспись пенсионер.
|
|||
81
Mikeware
16.11.15
✎
08:46
|
(76) год рождения у него операторы запросто перепутают...
а пол... я уже тут упоминал, как в одной базе было три вида пола: "мужской","женский", и "по соглашению сторон"... |
|||
82
Mikeware
16.11.15
✎
08:46
|
(80) мне-то зачем? я трезвый, в отличие от....
|
|||
83
Garykom
гуру
16.11.15
✎
08:47
|
(80) не это а то того
раскроем всем сикрет что хочешь в своей "мега" из нее сделать "гига" и штатно нечеткое быстрое сопоставление номенклатуры и прочего... |
|||
84
Garykom
гуру
16.11.15
✎
08:48
|
(81) дык в той базе еще разные конторы есть... типа община адвентистов города Н
|
|||
85
Garykom
гуру
16.11.15
✎
08:49
|
(84)+ интересно какой тогда пол нужно ставить, и как его определять?
с ДР то все понятно, хотя а если перерегистрация? |
|||
86
Mikeware
16.11.15
✎
08:53
|
(85)
".... Но могут действовать они не прямиком: Шасть в купе - и притвориться мужиком,- А сама наложит тола под корсет. Проверяй, какого пола твой сосед!" Тут давай его пытать я: "Опасаюсь - маху дам! Как проверить - лезть под платье? Так схлопочешь по мордам..." Но инструктор - парень дока, Деловой - попробуй срежь! И опять пошла морока Про коварный зарубеж. ... " © |
|||
87
arccos6pi
16.11.15
✎
09:01
|
||||
88
Garykom
гуру
16.11.15
✎
09:08
|
(87) на (71) сдох ((
|
|||
89
ЧеловекДуши
16.11.15
✎
09:09
|
(85) Если пытаться Автоматизировать бардак, то получится только автоматизированный бардак :)
|
|||
90
los_hooliganos
16.11.15
✎
09:14
|
(88) Я тоже это проверил. :)))
|
|||
91
Антириус
16.11.15
✎
09:15
|
(0) про Sphinx уже было?)
|
|||
92
Garykom
гуру
16.11.15
✎
09:17
|
(91) было и прошло, у меня не гугл и даже не яндекс
|
|||
93
Антириус
16.11.15
✎
09:19
|
(92) а какая разница? Он делает то, что Вам нужно. Есть еще несколько аналогичных вариантов.
|
|||
94
Garykom
гуру
16.11.15
✎
09:23
|
(93) "нифига он не делает"
|
|||
95
Garykom
гуру
16.11.15
✎
09:25
|
||||
96
Garykom
гуру
16.11.15
✎
09:27
|
(95) сорри сказано что в викимапии юзается движок http://wikimapia.org/#lang=ru&lat=64.540029&lon=40.543327&z=12&m=b&search=архунгельск
|
|||
97
Кирпич
16.11.15
✎
09:31
|
(0) Если автору не обязательно 1с, предлагаю не ломать голову заумными теориями, а просто найти в инете алгоритм сравнения строк и действовать тупым перебором, загнав предварительно все данные в память. Писать, само собой, на чем нибудь быстром (Си,Delphi,C#). Думаю, за 5-10 минут компьютер таки найдет в массиве то, что нужно автору.
|
|||
98
Антириус
16.11.15
✎
09:34
|
||||
99
Garykom
гуру
16.11.15
✎
09:34
|
(97) если бы... пусть проверка 1 фио среди 6000 тысяч занимает секунду
тогда для проверки наших 4к фио нужно 4000 секунд... добавляем записи, добавляем проверяемые поля и ? |
|||
100
Кирпич
16.11.15
✎
09:36
|
(99) ты попробуй сначала
|
|||
101
Garykom
гуру
16.11.15
✎
09:37
|
(98) скажи чем мне поможет тупейший метод "Генерируем для каждого слова из словаря набор триграмм, те. 3 последовательно идущих символов" ?
когда (47) ? |
|||
102
Garykom
гуру
16.11.15
✎
09:38
|
(100) так попробовал уже )) зараза даже в секунду не укладывается 2-3 секунды на моем i3
|
|||
103
Кирпич
16.11.15
✎
09:42
|
(102) Ну нет так нет. Хотя не верится что то. Я бы сам попробовал, но у меня нет такого большого списка.
|
|||
104
Garykom
гуру
16.11.15
✎
09:44
|
(101)+ гы у всех поисковиков водка=вотка захардкожено ))
попробуйте вобла=вопла поискать )) |
|||
105
Garykom
гуру
16.11.15
✎
09:48
|
(103) так попробуй на нескольких записях и умножить просто мс
|
|||
106
Drac0
16.11.15
✎
09:49
|
(101) бей на диграммы :-) Тогда "вотка" найдется.
|
|||
107
Drac0
16.11.15
✎
09:50
|
Кстати, а следующая тебя от тебя будет: как прикруть GoogleNow к эске?:)
|
|||
108
Garykom
гуру
16.11.15
✎
09:52
|
(107) э?
|
|||
109
Злопчинский
16.11.15
✎
09:52
|
(52) "максимум 5 минут и нужно (проверив сразу несколько наших тысяч по нескольким тысячам их) вывести список
с кем оператор будет уже поштучно разбираться " - при размере основного массива ~20 тысяч и входных порций несколько сотен/тысяч - проблемы не представляет, сформируется даже быстрее чем за 5 минут. |
|||
110
Garykom
гуру
16.11.15
✎
09:53
|
(108) тьфу не надо я уже от яндекса прикручивал
|
|||
111
Злопчинский
16.11.15
✎
09:53
|
У меня у лавочника количество основного массива ~30 тысяч, одна позиция на проверку отрабатывалась (подбор и формирование списка похожих) ~1 сек (даже меньше)
|
|||
112
Злопчинский
16.11.15
✎
09:55
|
(62) тот же strmatch ищет с учетом фонетического сходства
|
|||
113
Drac0
16.11.15
✎
09:55
|
(108) Перепутал, думал тема про распознавание тоже твоя была :)
|
|||
114
Garykom
гуру
16.11.15
✎
09:57
|
(109) хехе
тут тонкости в умножении и количествах реквизитов для проверки сравнения т.е. у вас малый список до нескольких тысяч (не больше 3) проверятеся по большому 20 тысяч это максимум 3 000 х 20 000 а вот 10 000 х 10 000 х 3 это насколько больше? |
|||
115
Drac0
16.11.15
✎
09:57
|
(110) как я понимаю управление голосом "добавить заявку покупателя Рога и копыта" не взлетело?))
|
|||
116
Злопчинский
16.11.15
✎
09:57
|
(63) емае, strmatch примерно это все и реализует плюс с дополнительными фенечками - нахера изобретать велосипед? попробуйте сабж, не подойдет - тогда уже пилить другое средство передвижения
|
|||
117
Злопчинский
16.11.15
✎
09:58
|
(114) я думаю на ваших объемах это будет вертеться весьма приемлемо.
|
|||
118
Garykom
гуру
16.11.15
✎
09:59
|
(115) неа я для управления светом делал и открытия двери по распознанию голоса и ключевой фразы
и вполне работает, но проблема диктофона для двери а вот для света удобно но стремно с гостями )) |
|||
119
Garykom
гуру
16.11.15
✎
10:00
|
(117) зачем пять минут, когда можно 5 секунд да?
|
|||
120
program1c82
16.11.15
✎
10:04
|
||||
121
Maniac
16.11.15
✎
10:09
|
Поможет только правка мозга.
в 1С ничего кроме ПОДОБНО нет и нет! Другое дело как им воспользоваться. Так как с ним можно реально составить нужные алгоритмы. |
|||
122
Maniac
16.11.15
✎
10:14
|
В свое время я отталкивался от следующего правила.
В два прохода. Первое поисковое слово (или набор символов) являются основой запроса. Те делаем запрос с подобно по первому слову! а не всем вместе. Если есть результат - запрос выгружаем в ТЗ и уже дальше точечно перерабатываем остальные слова. На крайняк можно сделать для гарантии второй проход. Если по первому слову результат запроса ноль. Берем второе слово и делаем по нему запрос. в 90 процентах случаев по первому сработает сразу если есть чего. Далее надо посмотреть что выйдет на результате и уже точечно его обрабатывать. |
|||
123
Boris_Britva
16.11.15
✎
10:15
|
Я бы предложил плясать от дат рождения, намного проще, и выполняется в один запрос, слева присоединить таблицы с видом сравнения подобно нельзя.
|
|||
124
Boris_Britva
16.11.15
✎
10:15
|
поверьте по датам рождения будет меньше совпадений, чем по ФИО, если всеравно потом оператору перерабатывать
|
|||
125
Boris_Britva
16.11.15
✎
10:17
|
Иначе два запроса, сначала собираем список анкет и с результатом этого запроса, для каждой записи делаем запрос к таблице зарегимстрированных
|
|||
126
Maniac
16.11.15
✎
10:17
|
И я бы еще завел некий универсальный справочник ошибок. В который постепенно можно было бы вводить 100 процентные ошибки допущенные юзерами и на стадии ввода процедуру проверки.
Чтобы 1С запрещала повторять ошибки. Выдавала предупреждения с подтверждением и тому подобное. Это сильно меньшит количество ошибок в базе - а с этим надо бороться - 100 процентов. |
|||
127
Кирпич
16.11.15
✎
11:08
|
Ну не знаю чо автору надо. Я запустил 5000 раз список из 7 ФИО. Отработало за 5 сек. Функция примитивная, но работает.
Иванов Иван Иванович Сергеев Михаил Илларионович Митрофанов Иван Ивановч Бургомистров Николай Федорович Мздоимцев Михаил Сергеевич Сергеев Михил Илларионович Иванов Иван Иваныч Митрофанов Иван Иванович Отловило ИВАНОВ ИВАН ИВАНОВИЧ --- ИВАНОВ ИВАН ИВАНЫЧ СЕРГЕЕВ МИХАИЛ ИЛЛАРИОНОВИЧ --- СЕРГЕЕВ МИХИЛ ИЛЛАРИОНОВИЧ МИТРОФАНОВ ИВАН ИВАНОВЧ --- МИТРОФАНОВ ИВАН ИВАНОВИЧ Для начала вполне прилично |
|||
128
Кирпич
16.11.15
✎
12:07
|
Хотя нет. Ошибся я. Маловато итераций. Запустил на списке из 10000 фио и теперь жду и не дождусь :)
|
|||
129
Кирпич
16.11.15
✎
12:09
|
И чего только в наших интернетах нету...
http://names-generator.ru/ |
|||
130
Злопчинский
16.11.15
✎
12:25
|
(119) может и 5 секунд - там в основном все упирается в заполнение кеша, я программил на черных запросах - подготовка кеша занимает основное время (написать на прямом или если это на снеговике - то вообще не вопрос). а собственно сравнение входящей строки с массивом - практически мгновенно.
|
|||
131
Злопчинский
16.11.15
✎
12:27
|
(122) "Те делаем запрос с подобно по первому слову! а не всем вместе.
Если есть результат - запрос выгружаем в ТЗ и уже дальше точечно перерабатываем остальные слова. " хреновый вариант. подходит для формализованных входных данных, в которых (условно) первое слово "определяющее" |
|||
132
Гёдза
16.11.15
✎
12:29
|
Первоночально нужно алгоритмически расписать что ты будешь и как проверять.
А после это го уже задача будет на 90% решена |
|||
133
Гёдза
16.11.15
✎
12:31
|
Или тебе нужен морфологический поиск как у Яндекса?
|
|||
134
Злопчинский
16.11.15
✎
13:22
|
Я для начала тупо сделал бы.
Сформировал строку ФИО+"#"+ДатаРождения+"#"+Адрес+"#"+ИНН Веса чисел поднял бы "побольше" (такая возможность есть в стрматч) И тупо прогнал бы по нечеткому поиску. наличие Адреса (прокатит и без него) и ИНН (если он есть, прокатит и без него) в строке очень сильно повысит достоверность поиска "проблем" и уменшит количество ненужных "срабатываний" А выявленные проблемные позиции - уже "обрабатывал" бы по предметно-ориентированной эвристике - да и то - при необходимости - и при этом мне кажется что вариантов для такой допобработки эвристикой - будет очень мало - имеет смысл окончательную верификацию - отдать на откуп оператору (у меня была сделана дополнительная двухпроходная верификация - "младший" оператор быстро отсеивал/разрешал явные проблемы, что для него представляло трудность - это "делегировалось" на след.уровень, уровней может быть много ;-) в принципе, справлялся младший оператор почти со всем |
|||
135
Maniac
16.11.15
✎
13:41
|
(134) проще телефон спрашивать и скать по последним цифрам номера.
а дальше тупо в списке уже уточнять по фамилии. |
|||
136
Garykom
гуру
16.11.15
✎
16:13
|
(135) так нету телефонов в базе РФМ
|
|||
137
Кирпич
16.11.15
✎
16:30
|
(136) Можно еще проиндексировать по фамилиям именам и отчествам и делать проверки сначала, допустим, в записях, где есть такое имя, потом отчество, потом фамилия. Ну и потом паспорт для верности.
|
|||
138
Злопчинский
17.11.15
✎
09:21
|
(137) тебе имя для какого нить казахавобьют в фамилию или наоборот и капец товей проверке по конкретным реквизитам, а вариант (134) нормально словит, что
Курам Барым Мамед Оглы и Мамед Оглы Барым Курам - это почти одно и то же, степень совпадения бедет очень высокая |
|||
139
naehi8sh
17.11.15
✎
12:52
|
(0) я думаю вам надо решать через внешние компоненты, это даст прирост производительности + все возможные решения, такие как например регулярные выражения.
Но лучше соблюсти условия: 1. Делать только один запрос к внешнему компоненту, передал данные - передал запрос - поучил ответ(не будет потерь при передачи данных между 1с и компонентом) 2. База не так уж и большая, если одну запись преобразовать в строку то база будет примерно 2мега, что замечательно умещаться в памяти да и больше уместиться. 3. Есть предложение работать с регулярными вырождениями. Как вариант еще: базу проверки выгрузить в файл, запрос сохранить в файл и скормить их какой-либо программе(в том числе и самописной на любом языке). Общая идея выгрузить из 1с и обработать внешней магией)))) средствами 1с вы не решите данную задачу с заявленными условиями. |
|||
140
rsv
17.11.15
✎
13:46
|
(0) Если базуха на скуле - то скорее подергать функционал скуля . Там что то должно быть по поиску.
|
|||
141
Кирпич
17.11.15
✎
13:48
|
(138) ну Мамед Оглы решается. Сколько слов в строке, столько и индексов создать. Сделал вариант с индексами. Приятно удивился. В виртуальной XP на i5 выдало такое:
строк: 9988 фамилий: 506 имен: 186 отчеств: 211 % несовпадений: наши: эталон: 7,41 ВЛАДИМИРОВА АЛИНА МАТВЕЕВНА ВЛАДИМИРОВА ФАИНА МАТВЕЕВНА 4,35 БЕСПАЛОВА ВЕРА ГЛЕБОВНА БЕСПАЛОВА ВЕРА УЛЕБОВНА 8,33 ЕФИМОВА ФАИНА НИКОЛАЕВНА ЕФИМОВА ЖАННА НИКОЛАЕВНА 4,35 ГУСЕВА НАИНА НИКОЛАЕВНА ГУСЕВА ФАИНА НИКОЛАЕВНА 8,33 ЕФИМОВА ЖАННА НИКОЛАЕВНА ЕФИМОВА ФАИНА НИКОЛАЕВНА 4,55 МУХИНА НАИНА МИХАИЛОВНА МУХИНА НИНА МИХАИЛОВНА 4,35 ЧЕРНОВ ВАЛЕРИЙ ГЛЕБОВИЧ ЧЕРНОВ ВАЛЕРИЙ УЛЕБОВИЧ 6,67 НИКИФОРОВА АНГЕЛИНА МАРТЫНОВНА НИКИФОРОВА АНЖЕЛИКА МАРТЫНОВНА 10,00 ОВЧИННИКОВА ФЕВРОНИЯ ФЕДОТОВНА ОВЧИННИКОВА ФЕВРОНИЯ ФИЛАТОВНА 4,17 БОРИСОВ ГЕРМАН СЕРГЕЕВИЧ БОРИСОВ ГЕРМАНН СЕРГЕЕВИЧ 8,33 АРТЕМЬЕВА НИНА РОМАНОВНА АРТЕМЬЕВА АННА РОМАНОВНА 8,33 ЛОГИНОВА МАРФА ДОНАТОВНА ЛОГИНОВА МАРИНА ДОНАТОВНА 4,55 МУХИНА НИНА МИХАИЛОВНА МУХИНА НАИНА МИХАИЛОВНА 4,17 ОДИНЦОВА АЛИНА ИРИНЕЕВНА ОДИНЦОВА ГАЛИНА ИРИНЕЕВНА 3,70 ГОЛУБЕВА НАИНА ВСЕВОЛОДОВНА ГОЛУБЕВА ФАИНА ВСЕВОЛОДОВНА 4,35 ЧЕРНОВ ВАЛЕРИЙ УЛЕБОВИЧ ЧЕРНОВ ВАЛЕРИЙ ГЛЕБОВИЧ 7,14 СМИРНОВА АЛИНА ХРИСТОФОРОВНА СМИРНОВА ПОЛИНА ХРИСТОФОРОВНА 8,00 АНДРЕЕВА НОННА ЯРОСЛАВОВНА АНДРЕЕВА НИНА ЯРОСЛАВОВНА 7,14 СМИРНОВА ПОЛИНА ХРИСТОФОРОВНА СМИРНОВА АЛИНА ХРИСТОФОРОВНА 3,70 ГОЛУБЕВА ФАИНА ВСЕВОЛОДОВНА ГОЛУБЕВА НАИНА ВСЕВОЛОДОВНА 10,00 ОВЧИННИКОВА ФЕВРОНИЯ ФИЛАТОВНА ОВЧИННИКОВА ФЕВРОНИЯ ФЕДОТОВНА 4,17 ОДИНЦОВА ГАЛИНА ИРИНЕЕВНА ОДИНЦОВА АЛИНА ИРИНЕЕВНА 8,00 АНДРЕЕВА НИНА ЯРОСЛАВОВНА АНДРЕЕВА НОННА ЯРОСЛАВОВНА 7,41 ВЛАДИМИРОВА ФАИНА МАТВЕЕВНА ВЛАДИМИРОВА АЛИНА МАТВЕЕВНА 4,17 БОРИСОВ ГЕРМАНН СЕРГЕЕВИЧ БОРИСОВ ГЕРМАН СЕРГЕЕВИЧ 4,35 ГУСЕВА ФАИНА НИКОЛАЕВНА ГУСЕВА НАИНА НИКОЛАЕВНА 8,33 ЛОГИНОВА МАРИНА ДОНАТОВНА ЛОГИНОВА МАРФА ДОНАТОВНА 10,00 МЯСНИКОВА ФЕВРОНИЯ ЛАВРЕНТЬЕВНА МЯСНИКОВА ЕВДОКИЯ ЛАВРЕНТЬЕВНА 6,67 НИКИФОРОВА АНЖЕЛИКА МАРТЫНОВНА НИКИФОРОВА АНГЕЛИНА МАРТЫНОВНА 4,35 БЕСПАЛОВА ВЕРА УЛЕБОВНА БЕСПАЛОВА ВЕРА ГЛЕБОВНА 4,17 БОГИСОВ ЕВГЕНИЙ ОЛЕГОВИЧ БОРИСОВ ЕВГЕНИЙ ОЛЕГОВИЧ 3,85 ГАЛКИНА КЛАВДИЯЯ МИХАИЛОВНА ГАЛКИНА КЛАВДИЯ МИХАИЛОВНА 3,45 ЕВСЕВ КОНСТАНТИН СЕРАПИОНОВИЧ ЕВСЕЕВ КОНСТАНТИН СЕРАПИОНОВИЧ 8,33 АРТЕМЬЕВА АННА РОМАНОВНА АРТЕМЬЕВА НИНА РОМАНОВНА 10,00 МЯСНИКОВА ЕВДОКИЯ ЛАВРЕНТЬЕВНА МЯСНИКОВА ФЕВРОНИЯ ЛАВРЕНТЬЕВНА time:00:00:01:420 это только проверка по фамилиям без прочих идентификаторов. проблема только как проверить, что нашего человека нет в эталонном списке. P.S Автор (или кто нибудь хороший) дай реальный список людей на проверить алгоритм. Только фио без прочих данных. |
|||
142
Кирпич
17.11.15
✎
13:49
|
+(141)за полторы секунды отработало
|
|||
143
Кирпич
17.11.15
✎
13:51
|
естественно, такой вариант подходит если операторы не совсем дибилы и правильно занесли хотя бы имя или фамилию или отчество.
|
|||
144
Кирпич
17.11.15
✎
14:00
|
В конечном итоге алгоритм такой: индексируем эталонный список, проходим по своему списку и ищем в эталонном списке совпадения. Если человек не найден в эталонном списке, то ищем для него похожее имя по моему алгоритму. Как то так.
|
|||
145
Кирпич
17.11.15
✎
15:17
|
Продолжаю свой бложек. По алгоритму (144) отрабатывает за 190 миллисекунд. Лучше уже и не надо.
|
|||
146
Garykom
гуру
18.11.15
✎
12:28
|
(145) все проще намного
для всех строк считается битовый хеш (симхеш) это линейная операция почти, зависит от длины строк далее этот хеш для списка в котором ищем сохраняется и вся проверка строки заключается в посчитать хеш (вида 100100011100001) и найти все хеши которые отличаются как можно меньшим числом бит для этого используем B-Tree индекс |
|||
147
Кирпич
18.11.15
✎
12:51
|
(146) и шо быстро ищет?
|
|||
148
Garykom
гуру
18.11.15
✎
12:53
|
(147) мгновенно
|
|||
149
Garykom
гуру
18.11.15
✎
12:55
|
(148)+ но уточнить сразу нужно, индексация весьма долгая
т.е. суть сначала когда есть время подготавливаем данные, строим индекс - это долго и занимает много места но потом поиск "похожих" строк это секунды для сотен проверяемых, среди тысяч по которым проверям |
|||
150
Кирпич
18.11.15
✎
12:58
|
(146) проще то как раз у меня. а у тебя правильнее :)
|
|||
151
Garykom
гуру
19.11.15
✎
06:40
|
(149) более точные цифры по скорости по тестам (при учете все в памяти а не в БД)
приблизительно 1 мс выбрать хеши похожих строк для одной среди 10000 хешей т.е. 10000х10000 (проверить 10к строк на похожесть среди 10к строк) это 10 секунд понятно что реально с учетом переброски данных все будет медленнее а если нужно для каждой из нескольких подобранных строк еще вычислить % похожести (тот же Дамерау-Левенштайн для пар проверяемая-найденные) то еще медленнее будет но вот индекс реально долго строится (( |
|||
152
Кирпич
19.11.15
✎
10:08
|
(151) Ну мой метод вместе с индексированием работает меньше секунды. Правда я сомневаюсь, что он правильный и у меня нет реальных данных, чтобы проверить. Скинь, базу ФИО без остальных данных, если не жалко.
|
|||
153
Garykom
гуру
19.11.15
✎
11:37
|
(152) в почту отправил
|
|||
154
Кирпич
19.11.15
✎
14:06
|
Здравствуй бложек!
Короче, всё оказалось еще проще чем просто. 1. Приводим оба списка в порядок. (один регистр, один пробел между словами) 2. Эталонный список сортируем. 3. Проходим по нашему списку и берем наше ФИО и ищем в эталонном списке. Если не находим, то полностью проходим по эталонному списку сравнивая оба ФИО функцией нечеткого поиска. Чем больше ошибок тем дольше будет работать. Если предполагается, что ошибок не много, то такой алгоритм нас устраивает. У меня 5000 строк и 60 ошибок отработало за 4 сек на i5 |
|||
155
Кирпич
19.11.15
✎
14:08
|
+(154) причем это время включает всё: от загрузки файлов с диска до выдачи результата
|
|||
156
Garykom
гуру
19.11.15
✎
15:01
|
(154) т.е. 4 секунды на одно наше проверяемое ФИО ?
Вот есть "перечень" из 6000 имен, для того чтобы проверить по нему (на совпадения) одно наше ФИО сколько времени уходит? А если нам не одно ФИО нужно проверять а несколько тысяч? Сколько потребуется времени? Тоже всего 4 секунды ;) ? |
|||
157
ProxyInspector
19.11.15
✎
15:02
|
Мне кажется проблема немного надумана. Если бы надо было проверить 6 млн записей на таблице в 6 млн, то это было бы задачей.
У меня под рукой Регистр сведений с прайсами поставщиков на 200 тыс позиций. Установка фильтра по вхождению строки по трем полям срабатывает менее чем за 1 сек. К примеру ищешь "ван" через 1 сек ты получишь список Иванов Петр Сергеевич Сидоров Петр Полуванович ну и т.д При этом чем больше полей для анализа, тем быстрее работает поиск |
|||
158
ProxyInspector
19.11.15
✎
15:08
|
Это я специально делал для быстрого поиска в прайс листах поставщиков.
УФ форма списка с возможностью программной установки отбора |
|||
159
Кирпич
19.11.15
✎
15:09
|
(156) Нет, не на одно. 5000 наших фио на 5000 не наших. Всё за 4 секунды.
|
|||
160
ProxyInspector
19.11.15
✎
15:12
|
В свое время здесь проскакивала проблема. Есть КЛАДР несколько сот тысяч записей. Одна запись изменена. За несколько сек эта запись находится без проблем
|
|||
161
Кирпич
19.11.15
✎
15:16
|
(160) нужно сравнить в двух кладрах похожие названия городов
например Выдропужск и Выдропопск и т.д. |
|||
162
Garykom
гуру
19.11.15
✎
15:43
|
(159) нэ вэрю ))
в смысле ошибки то как? или точнее когда при забивании переврали 2 поля из 3-х? а нельзя быть уверенным не в одной нашей записи что не переврали Может он вовсе не "Иванов" как забили а вовсе даже "Ифанов" и не "Петрович" а "Патрович" |
|||
163
Garykom
гуру
19.11.15
✎
15:45
|
(162)+ если пропустим кого, то цена ошибки возможно сотни тысяч штрафа
|
|||
164
ProxyInspector
19.11.15
✎
15:46
|
У тебя могут быть ошибки сразу в трех словах. Если да, то тогда проблема, Если хотя бы одно слово верное - тогда проблем нет
|
|||
165
Garykom
гуру
19.11.15
✎
15:47
|
(163) или человеческие жизни...
но не будем о грустном )) |
|||
166
Garykom
гуру
19.11.15
✎
15:47
|
(164) в том то то и дело, сча поищу пример посмешнее
|
|||
167
Garykom
гуру
19.11.15
✎
15:49
|
(166) + Осина? Пчельнокова? Каринэ?
причем так и занесено... |
|||
168
ProxyInspector
19.11.15
✎
16:01
|
Если вместо одной буквы в слове оператор может набить одну или несколько других, то проблем быть не должно. Сейчас попробую.
|
|||
169
Garykom
гуру
19.11.15
✎
16:09
|
(168) оператор может набить что угодно и нужно кроме ФИО еще прочее учитывать
|
|||
170
Кирпич
19.11.15
✎
16:16
|
(162)
Ошибка - это когда в ФИО из нашего списка нет в эталонном списке. например у нас есть Иваов Михуил Игнатьевич в эталонном есть только Иванов Михаил Сергеевич про другие данные это уже другой вопрос. ну пусть на них уйдет еще пару секунд. |
|||
171
Кирпич
19.11.15
✎
16:18
|
(169) щас скину тебе свои изыскания. сам побалуйся
|
|||
172
ProxyInspector
19.11.15
✎
16:19
|
(170) Сейчас я сделаю эту задачку на списке 200 тыс за 1 сек
|
|||
173
Кирпич
19.11.15
✎
16:19
|
(172) давай
|
|||
174
Кирпич
19.11.15
✎
16:24
|
+(171) правда там на Delphi7. Кодировка ANSI.
|
|||
175
Garykom
гуру
19.11.15
✎
16:39
|
(174) мне как то пофиг я только питонов не люблю, жуются плохо
а дельфи тем более 7, еще с турбо паскаля на ура идет |
|||
176
Belomor
19.11.15
✎
16:40
|
Скинул свое решение для 7.7
|
|||
177
Кирпич
19.11.15
✎
16:42
|
(175) да я про кодировку. в новых delphi string юникодный. если нет 7, то придется переделывать.
|
|||
178
Garykom
гуру
19.11.15
✎
17:06
|
(177) это фигня, в лазарусе прекрасно компилится, только преобразование кодировки добавил чтобы нормально выводил вместо ?????
но чуял что где то наколка )) подставил свой список за период из 1600 фио, за 00:00:51:015 отработало но это решение все таки половинчатое, оно предполагает что хоть что то Ф, И или О обязательно правильно ввели и оно правильно в перечне тоже 1 28,57 АБРАМОВА ЮЛИЯ ВАСИЛЬЕВНА ГАНЖА ЮЛИЯ ВАСИЛЬЕВНА !нет в списке АБРАМОВСКАЯ ОЛЬГА ИГОРЕВНА !нет в списке АБУГОВА МАРИЯ ИЗБУДИНОВНА !нет в списке АВАЛИАНИ НАТАЛЬЯ ЮРЬЕВНА 1 23,08 АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ ЖАРКОВ СЕРГЕЙ ВЛАДИМИРОВИЧ 2 23,08 АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ ЗАХАРОВ СЕРГЕЙ ВЛАДИМИРОВИЧ 3 28,00 АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ ЗЫБИН СЕРГЕЙ ВЛАДИМИРОВИЧ 4 28,00 АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ ЗЫБИН СЕРГЕЙ ВЛАДИМИРОВИЧ 5 23,08 АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ КАТУНЦЕВ СЕРГЕЙ ВЛАДИМИРОВИЧ 6 23,08 АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ ЛЕОНОВ СЕРГЕЙ ВЛАДИМИРОВИЧ |
|||
179
Garykom
гуру
19.11.15
✎
17:08
|
(178)+ 1 28,57 АБРАМОВА ЮЛИЯ ВАСИЛЬЕВНА ГАНЖА ЮЛИЯ ВАСИЛЬЕВНА - чисто технически нужно смотреть паспорт на вопрос штампов прежних Ф и(или) еще что ))
|
|||
180
Кирпич
19.11.15
✎
17:17
|
(178) "что хоть что то Ф, И или О обязательно правильно ввели"
да нет. ему вообще по барабану. всё зависит от функции сравнения. какой процент совпадения тебе нужен. const LevenProcConst: Extended = 30; //процент несовпадений в нечетком сравнении вот LevenProcConst и крути |
|||
181
Garykom
гуру
19.11.15
✎
17:27
|
(180) тогда слишком долго считает...
|
|||
182
ProxyInspector
19.11.15
✎
17:27
|
Я сделал. Скорость приметно 5 сек на 200 тыс записей. Если допускать, что хотя бы одно поле должно совпадать то скорость вырастет раз в 10. Если допускать, что первая буква в Фамилии введена правильно, то скорость вырастет в два раза. Скорость пропорционально объему базы. Для 6 тыс записей скорость поиска << 1 сек
Нечёткое сравнение с возможностью вместо любого символа иметь что угодно. Если ищем "Иванов" тогда делаем фильтр ( Рег.Наименование LIKE "%иванов%") ИЛИ( Рег.Наименование LIKE "%ванов%") ИЛИ( Рег.Наименование LIKE "%и%анов%") ИЛИ( Рег.Наименование LIKE "%ив%нов%") ИЛИ( Рег.Наименование LIKE "%ива%ов%") ИЛИ( Рег.Наименование LIKE "%иван%в%") ИЛИ( Рег.Наименование LIKE "%ивано%") ИЛИ( Рег.Наименование LIKE "%иванов%") |
|||
183
ProxyInspector
19.11.15
✎
17:30
|
Можно список поиска втаскивать в таблицу значений, к помещать ее во временную таблицу и к таблице уже делать запрос. А можно в регистре сведений хранить информацию
|
|||
184
Garykom
гуру
19.11.15
✎
17:31
|
(182) люблю лисапедистов ))
после них мопед, супербайком кажется клиентам |
|||
185
Garykom
гуру
19.11.15
✎
17:34
|
(182) еще чуть чуть и дойдем до понимания метода N-грамм
|
|||
186
ProxyInspector
19.11.15
✎
17:34
|
Однако все это работает и будет работать не на копеечных 6 тыс записей, а на 6 млн :) Хотя хозяин барин.
|
|||
187
ProxyInspector
19.11.15
✎
17:35
|
Ты можешь бороться с
АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ = ЗЫБИН СЕРГЕЙ ВЛАДИМИРОВИЧ |
|||
188
Кирпич
19.11.15
✎
17:37
|
(181) ну так всех, кого надо нашло. или нет?
а что на Lazarus медленно, так попробуй без отладчика запустить или это перекодировки в UTF8 сжирают время. На дельфях твой список из 5000 у меня за 4 секунды пролетает. (182) ну а теперь проделай это с остальными 1999999 людьми и скажи сколько это времени заняло |
|||
189
Гёдза
19.11.15
✎
17:37
|
Надо нейросеть учить
|
|||
190
ProxyInspector
19.11.15
✎
17:40
|
Мой метод даст в лучшем случае
авднеев сероей влажимирович = авдеев сергей владимирович |
|||
191
Garykom
гуру
19.11.15
✎
17:41
|
(190) перестановки двух символов?
это после пропусков и лишних букв такая же частая ошибка |
|||
192
ProxyInspector
19.11.15
✎
17:41
|
Перестановку тоже даст
|
|||
193
Garykom
гуру
19.11.15
✎
17:42
|
(191)+ вадеев сегрей владиимрович
|
|||
194
ProxyInspector
19.11.15
✎
17:42
|
Наверно
|
|||
195
Garykom
гуру
19.11.15
✎
17:42
|
(192) и чем он лучше метода n-грамм ?
|
|||
196
Garykom
гуру
19.11.15
✎
17:43
|
(189) думал, а какую порекомендуете?
я только с однослойными персептронами развлекался |
|||
197
ProxyInspector
19.11.15
✎
17:45
|
Перестановку берешь вместо "%" "_ _"
|
|||
198
ProxyInspector
19.11.15
✎
17:46
|
Конечно если
АВДЕЕВ СЕРГЕЙ ВЛАДИМЕРОВИЧ = Иванов Иван Иванович без нейросети не обойтись :) |
|||
199
ProxyInspector
19.11.15
✎
17:47
|
К слову % корректно съест
вадеев сегрей владиимрович = авдеев сергей владимирович |
|||
200
Garykom
гуру
19.11.15
✎
17:56
|
(180) сорри, сча соображать уже не могу, age++
так что позже отпишусь что меня смущает в этом методе принцип то понятен, ограничение полной проверки разными способами |
|||
201
ProxyInspector
19.11.15
✎
18:19
|
авдеев сергей владимирович = ХХХев сеХХХей влХХХ = Авдеев С. В.
Надо только чтобы Фамилия, Имя, Очество были в отдельных колонках. И самое интересное, что это все работает очень быстро. Если немного подумать, то можно список из 1 млн строк нечетко сравнить со списком из другого 1 млн строк |
|||
202
Кирпич
19.11.15
✎
18:45
|
(200) я знаю почему на лазарусе тормозит. там по умолчанию не работает двоичный поиск. замени функцию на это и всё залетает
procedure LoadStringList(T: TStrings; filename: string); var i: integer; begin T.LoadFromFile(filename); for i := 0 to T.Count - 1 do T[i] := FormatFio(T[i]); TStringList(T).Sorted := True; end; |
|||
203
Garykom
гуру
19.11.15
✎
18:45
|
(201) уже нашел простой в использовании способ, причем он универсальный без. разницы какого вида строки (сколько там пробелов и т.д.)
линейно зависит от длин строк для 1 млн х 1 млн примерно 10 млн миллисекунд потребуется а про то что пишешь, это нечто вроде построения множества символьных масок/шаблонов и затем поиск строк им удовлетворяющим две проблемы: 1. время на постройку/формирование этих масок/шаблонов 2. при увеличении длины строк линейно увеличивается время построения масок это мелочи, но квадратно увеличивается время на проверку (так как количество разных вариантов масок/шаблонов вырастает) |
|||
204
Кирпич
19.11.15
✎
18:49
|
+(202) ну и в StartProcess добавь в конце
FioList.Free; MasterFioList.Free; |
|||
205
Garykom
гуру
19.11.15
✎
19:01
|
(204)
"R := (R / L) * 100; result := R <= LevenProcConst;" когда const LevenProcConst: Extended = 30; //процент несовпадений в нечетком сравнении точно нет ошибки? |
|||
206
Кирпич
19.11.15
✎
19:10
|
(205) ну это не совсем процент. Я эту фигню к длине строки пытаюсь прилепить. Функция же выдает количество вставок, замен и удалений. На слове из 3 букв это одно, а на слове из 30 букв это другое. Можешь заменить на любую функцию. Я просто в инете нашел, вроде работает.
|
|||
207
Garykom
гуру
19.11.15
✎
19:14
|
(206) ты не понял ))
там выше если разница 0 то ложь, а тут если разница меньше или равна 30 то истина )) |
|||
208
Кирпич
19.11.15
✎
19:17
|
(207) ЕСЛИ 0 ТО СЛОВА ОДИНАКОВЫЕ. НАМ НЕ НУЖНЫ ОДИНАКОВЫЕ. МЫ ОДИНАКОВЫЕ ПРОПУСКАЕМ.
|
|||
209
Кирпич
19.11.15
✎
19:18
|
Блин большие буквы потому что на телефоне нитуда тыкнул
|
|||
210
Garykom
гуру
19.11.15
✎
19:25
|
(209) это ладно, просто для меня логика программы совсем непонятная
я не так думаю, совсем не так, и не так код пишу т.е. никаких возвратов/выходов досрочно из процедуры/функции, всегда до конца доходим с помощью условий и в конце возвращаем результат установленный по пути если выход досрочно то это try-catch сработал и зачем "function LevenProc(s, t: string; var R: Extended): boolean;" когда можно function LevenProc(s, t: string): Extended; ? но это мелкие придирки |
|||
211
Кирпич
19.11.15
✎
19:27
|
(210) да пиши как хочешь. Главное чтобы работало.
|
|||
212
Злопчинский
21.11.15
✎
09:47
|
(163) Не сношайте мозг.
если цена одной ошибки настолько высок - обеспечивайте потребный ресурс для снижения вероятности ошибки до приемлемого для вас уровня. |
|||
213
Garykom
гуру
21.11.15
✎
11:23
|
(212) ничего... и до складов как нибудь свой егаис, платон или 115фз доберется...
|
|||
214
Злопчинский
21.11.15
✎
11:31
|
(213) "..только в эру эту прекрасную нам не жить ни тебе уже и не мне...." ;-) - и слава богу! ;-)
|
|||
215
Garykom
гуру
21.11.15
✎
11:36
|
(214) ви таки так плохо думаете о наших законодателях?
|
|||
216
Garykom
гуру
21.11.15
✎
11:39
|
А насчет цен ошибки, проблема что $ то откуда взять на этот дополнительный прогрессивный (причем от количество продаж а не от суммы) налог?
Вот сча разбираемся Алинину как Аликину забили в базу, случайно выплыло она от СМС решила отказаться. А до этого было что у нас у человека в базе фамилия почему то нету в карточке (и как смогли догадаться занести у меня там запрет пустых), а по его имени и отчеству в перечне числится "нетоварищ" |
|||
217
ProxyInspector
21.11.15
✎
20:21
|
Как успехи в нечетком сравнении ФИО.
Я придумал небольшое дополнение к велосипеду, которое проводит нечеткое сравнение по ТРЕМ символам. Т.е. перестановка двух символов местами, опечатка в одном символе, залипание клавиш, изменение двух символов в трех соседних и как бонус - двойные фамилии. Иванов Иван Иванович Иавнов Иван Иванович Ивааанов Иоан Иванонанович Петров-Иванов Иван Иоанович Оказывается один и тот же человек |
|||
218
ProxyInspector
21.11.15
✎
20:27
|
Этот алгоритм работает с параноидальной подозрительностью. Он должен быть востребован в рамках современной действительности. На твоей базе 6000 фамилий проверка 200 фамилий будет занимать меньше 1 сек
|
|||
219
Garykom
гуру
21.11.15
✎
20:59
|
(218) патентуй :)
|
|||
220
Garykom
гуру
21.11.15
✎
21:01
|
(219)+ особенно если замены "а" на "a" или "о" на "o" нормально отрабатывает
причем без предварительной замены иначе как имена на английской раскладке без преобразования... |
|||
221
МуМу
21.11.15
✎
21:50
|
Было лень все читать. Как я делал в свое время и какие основные выводы почерпнул.
1) 1С здесь вообще не при делах(скорость важна, как форма отображения пожалуйста) 2) Реляционные СУБД тоже не очень подходят - но в моем вариантов особых не было, поэтому применялись следующие варианты комбинаторики. Сразу скажу что ошибка в два и более символа это уже на основании словарно-справочного сопоставления. Основная концепция построена на предрасчете(типа как ОЛАП кубы рассчитываются) Берется слово оригинал - к нему рассчитывается большое количество комбинаций слов с одной ошибкой. Как это делается - Путем простой замены каждого символа на любой проивзольный. Также аналогично делается для +1 и -1 символ близлежащий. Таким образом можно сопоставлять. Далее можно накладывать ограничения типа "нельзя столько и таких согласных подряд". Далее можно включать словарное сопоставление. Получается соотношение один ко многим. Служебная база очень растет, Но возможно сопоставление в онлайне. Если же онлайн не важен то тут другие алгоритмы, реляционные СУБД не самый лучший выбор. |
|||
222
МуМу
21.11.15
✎
21:51
|
Да и еще эти задачи хорошо параллелятся и поэтому скорость очень зависит от оборудования(при хороших алгоритмах).
|
|||
223
МуМу
21.11.15
✎
21:52
|
Обратите внимание как яндекс подсказки выдает. Можете подумать об ограничениях.
|
|||
224
Garykom
гуру
21.11.15
✎
22:05
|
(223) яндекс выдает подсказки на методе n-грамм + захардкоженный словарик
примеры: водка = вотка - ищется вобла = вопла - не ищется |
|||
225
Garykom
гуру
21.11.15
✎
22:09
|
(221) а проблема в принципе решена, при небольших объемах (до нескольких тысяч строк, причем строки до 150 символов)
даже просто расстояние Левенштайна нормально работает при реализации на общих языках и засовывании все в память если нужно "еще быстрее" то специальные методы с построением битовых хешей строк (коротких к примеру 32 бита) и сравнении уже только их |
|||
226
Злопчинский
21.11.15
✎
22:48
|
(217) вот вы все продолжаете велосипед изобретать
Эти ваши перестановки по трем символам стрмач автоматом понимает что эти пять фамилий очень близки по похожести Он их в пуле похожих автоматом поверху выдаст |
|||
227
Злопчинский
21.11.15
✎
22:53
|
С недели две назад клиент нарисовался
Я ему дохренища лет назад рм писал для магазина радиодеталей для заказов по прайсам поставщиков - до сих пор работает клиент счастлив А у него сиуевина посложнее чем с фамилиями была - у него все буквенно цифровое и все короткое и надо было похожее искать И даже в таких сложных условиях стрматч спавлялся очень хорошо Без оператора нифига все равно не обойдетесь Всегда какаяниь фигня вылезет типа щекатурка и штукатурка |
|||
228
ProxyInspector
21.11.15
✎
23:00
|
(220) Ему до лампочки русский на английский работает без предварительный замены. Алгоритм красивый и умнее всех нас вместе взятых. Обрабатывает пропуски 1-2 букв.
А мой алгоритм ищет водка = вотка вобла = вопла воводка вовыводка и так далее и тому подобное |
|||
229
Garykom
гуру
21.11.15
✎
23:00
|
(227) да тут уже предлагали нейронные сети...
|
|||
230
Garykom
гуру
21.11.15
✎
23:01
|
(228) № патента? ну или хотя бы авторского свидетельства
|
|||
231
ProxyInspector
21.11.15
✎
23:04
|
Свой алгоритм я тестировал на прайсах по запчастям. 250 тыс строк за 5 сек. Это уже с выводом отфильтрованных строк регистра сведений
|
|||
232
Garykom
гуру
21.11.15
✎
23:05
|
(231) а можно хоть что то для подтверждения? хотя бы видео?
|
|||
233
ProxyInspector
21.11.15
✎
23:07
|
Идея - смотри (182). Это нулевое приближение. За 1 мин этот алгоритм меняется до уровня (228)
|
|||
234
ProxyInspector
21.11.15
✎
23:09
|
Идеально он работает когда надо производить нечеткое сравнение по более чем одному полю. Чем больше полей, тем лучше
|
|||
235
ProxyInspector
21.11.15
✎
23:15
|
щекатурка и штукатурка по моему при поиске по трем символам мой алгоритм посчитает разными вернее
щекатурка = штукатурка штукатурка <> щекатурка В этом что-то есть, для дополнительной фильтрации |
|||
236
Garykom
гуру
21.11.15
✎
23:19
|
(233) хаха ))
"По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, все-рвано ткест чтаитсея без побрелм. Пичрионй эгото ялвятеся то, что мы не чиатем кдаужЮ бкуву по отдльенотси, а все солво цликеом. " |
|||
237
ProxyInspector
21.11.15
✎
23:23
|
(236) У тебя в каждом слове по две ошибки через правильный символ. Такого он конечно не съест. А вот
Иванов Иван Иванович Иавнов Иван Иванович Ивааанов Иоан Иванонанович Петров-Иванов Иван Иоанович съест |
|||
238
Garykom
гуру
21.11.15
✎
23:26
|
(237) проблема слишком много будет ложных срабатываний
можешь сам убедиться Иванов, Пиванов, Упиванов, Выпиванов, Черезногузадерищенкованов.... |
|||
239
ProxyInspector
21.11.15
✎
23:27
|
Естественно по этому и надо несколько полей
|
|||
240
ProxyInspector
21.11.15
✎
23:28
|
Фамилия, имя, отчество ну а потом оператор
|
|||
241
ProxyInspector
21.11.15
✎
23:29
|
Согласись, что Иванов, Пиванов - это одно и тоже. Ошибка в одной букве
|
|||
242
Garykom
гуру
21.11.15
✎
23:30
|
(241) для поиска "Пиванков" нет
|
|||
243
ProxyInspector
21.11.15
✎
23:32
|
Иванов = Пиванов
Иванов <> Пиванков Иванов = Иванков |
|||
244
ProxyInspector
21.11.15
✎
23:36
|
Конечно там есть побочные эффекты типа
Иванов = Иванкян - это правильно, если ты допускаешь ошибку в трех буквах |
|||
245
Garykom
гуру
21.11.15
✎
23:39
|
(243) по сути то что предлагается это обычный "Алгоритм расширения выборки"
из http://habrahabr.ru/post/114997/ только без составления словаря, вместо этого составляем "шаблоны поиска" |
|||
246
ProxyInspector
21.11.15
✎
23:43
|
Да только он реализован средствами базы по индексированному полю. Поэтому очень быстрый. Более того Алгоритм расширения выборки они не смогут реализовать по трем символам. А у на он реализован
|
|||
247
Garykom
гуру
21.11.15
✎
23:47
|
(246) и все равно процент достоверности в сравнении со скоростью поиска никакой ))
т.е. если посчитать "качество" алгоритма то будет хуже других стандартных вот для сопоставления номенклатуры скажем может и катит (по артикулам/кодам зарытым внутри длинной строки в вперемешку с хламом) |
|||
248
ProxyInspector
21.11.15
✎
23:49
|
Если ты ищешь во трем полям, то все получается великолепно. Ну и конечно если ошибок не очень много
|
|||
249
ProxyInspector
21.11.15
✎
23:54
|
Качество поиска великолепное.
Есть две большие разницы ошибка в одной букве, ошибка в двух буквах и перестановка, ошибка в трех буквах и перестановка, английский/русский алфавит |
|||
250
ProxyInspector
21.11.15
✎
23:58
|
Что просишь, то и получаешь. Если делать поиск по словарю как (245) Словарь 100 тыс слов,
То "крокодил" - отработает замену трех символов за время << 1 сек. |
|||
251
Garykom
гуру
21.11.15
✎
23:58
|
(249) очень сложно "уровень похожести" регулировать для выборки
точнее даже никак |
|||
252
ProxyInspector
22.11.15
✎
00:00
|
Ты делаешь предварительную выборку по мягкой схеме ТРИ символа, а потом на результате делай уровень похожести
|
|||
253
Garykom
гуру
22.11.15
✎
00:05
|
(252) можно конечно, но зачем?
когда сразу можно искать с заданным уровнем похожести? причем этот поиск даже быстрее будет вот предварительная подготовка (разовая) построение хешей и запись их в базу (получение их нее) да не очень быстро |
|||
254
ProxyInspector
22.11.15
✎
09:45
|
(236)
"По рзелульаттам илссеовадний одонго анлигйсокго унвиертисета, не иеемт занчнеия, в кокам пряокде рсапожолены бкувы в солве. Галвоне, чотбы преавя и пслоендяя бквуы блыи на мсете. Осатьлыне бкувы мгоут селдовтаь в плоонм бсепордяке, все-рвано ткест чтаитсея без побрелм. Пичрионй эгото ялвятеся то, что мы не чиатем кдаужЮ бкуву по отдльенотси, а все солво цликеом. " Имея словарь на 100 тыс символов. При условии, что первая и последняя буква правильная, что внутри буквы могут быть переставлены в произвольном порядке, а несколько букв добавлены, алгоритм (182) прочитает данный текст без ошибок на уровне 99%. Чуть хуже, чем человек. Человек привлекает для фильтрации контекст. |
|||
255
ProxyInspector
22.11.15
✎
09:49
|
Если еще хотя бы совпадал еще и слог. А вот если еще прикрутить дополнительный анализ, то может прочитать все.
|
|||
256
МуМу
22.11.15
✎
13:38
|
Я вас умоляю - 200 анкет в месяц явно не стоят сложных алгоритмов. ФИО в 200 записей можно и глазами просмотреть.
|
|||
257
Злопчинский
22.11.15
✎
13:41
|
(256) в день...
"все что они делают руками - все плохо..." |
|||
258
Кирпич
22.11.15
✎
14:14
|
(256) да там алгоритм примитивный, вся программа в 20 строчек да функция расстояния Левенштейна, которая тупо копипастится из интернета.
|
|||
259
Кирпич
23.11.15
✎
10:15
|
Здравствуй, бложек.
С утра встал в прекрасном настроении и сделал вариант с хешированием по сигнатуре. Отрабатывает за 1,5 секунды. Прежний вариант (154) отрабатывал за 4,5 секунды. Прогресс! |
|||
260
Garykom
гуру
23.11.15
✎
10:19
|
(259) ага ))
|
|||
261
Garykom
гуру
23.11.15
✎
10:19
|
(259) длина битового хеша какая?
|
|||
262
Кирпич
23.11.15
✎
10:21
|
(261) тупо со статьи на хабре стырил. 13
|
|||
263
Кирпич
23.11.15
✎
10:21
|
(261) да он у меня и не битовый. просто строка с нулями и единицами
|
|||
264
Garykom
гуру
23.11.15
✎
10:27
|
(263) ыыыы, ты переведи на битовый )) и дальше XOR'ами
слегка удивишься )) |
|||
265
Garykom
гуру
23.11.15
✎
10:28
|
(264) писал уже вроде, на тестовых 1 запись среди 10к за 1 мс при подборе похожих
это как бы тысячная доля секунды |
|||
266
Кирпич
23.11.15
✎
10:31
|
(264) да это не тот хеш
ты про simhash наверное говоришь |
|||
267
Garykom
гуру
23.11.15
✎
10:35
|
(266) а когда хеши сравниваются это уже пофиг
от видов хешей зависит только качество поиска и скорость подготовки базы а ищем то потом все равно одинаково по числу различий в битах |
|||
268
Кирпич
23.11.15
✎
10:47
|
(267) да у меня после этого хеширования всего штук 300 хешей получается на твою базу из 5000 фамилий. там даже смысла нету в битах это хранить. ну сэкономлю 100 миллисекунд. фигня.
Попробую simhash теперь запилить. |
|||
269
Кирпич
23.11.15
✎
10:51
|
+(268) вот для simhash важно хранить в числе и быстро разницу в битах считать, потому что там на каждую фамилию будет свой хеш, если я правильно понял эту хрень.
|
|||
270
Кирпич
23.11.15
✎
11:02
|
+(269) ну не на каждую фамилию, а на группу похожих фамилий.
|
|||
271
Кирпич
23.11.15
✎
11:04
|
Гы. Получается, в нашем случае, когда похожих ФИО мало, simhash вообще нафиг не нужен. Тратить время на его создание глупо и смешно, если он действительно долго создается.
|
|||
272
Garykom
гуру
23.11.15
✎
11:27
|
(271) нет не долго, долго это относительно поиска по нему
(269) (270) не совсем, для симхеш можно просто нужную длину выбирать и этим регулировать как хочется размеры похожести |
|||
273
Кирпич
23.11.15
✎
11:38
|
(272) ну у тебя сколько по времени хеши генерятся?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |