-
Здравствуйте, Мне нужно сделать парсер, который мог бы в тексте находить реквизиты; нужен ваш совет. Сложность заключается в том, что текст может быть совсем любой. Пример №1 Кварта-Трейд Подробная информация об организации
Город: Аксайский р-н, Аксай
Адрес: Промышленная ул. 5
Телефон: (86350) 49396
(86350) 48985
(86350) 56292 — факс
E-mail: Отправить e-mail
Транс-Абсолют Экспорт-Импорт, дилер автомобилей SCANIA Подробная информация об организации
Город: Аксайский р-н, Аксай
Адрес: Промышленная ул. 2
Телефон: (86350) 55155
(863) 2919333 — г.Ростов-на-Дону
(863) 2919222 — г.Ростов-на-Дону
(863) 2919111 — г.Ростов-на-Дону
(863) 2999000 — диспетчерская
E-mail: Отправить e-mail Пример №2 ПихтинАвто
344090, Ростов-на-Дону, Малиновского ул., 13а/1 (Автосервис)Общий: (863) 200-77-88 ;Эвакуатор: (863... ;Кузовной цех: (863... ;E-mail: www.pihtinauto@aaanet.ru
Ростов-на-Дону, Авторынок Фортуна, павильон №46Общий: (863... ;
Ростов-на-Дону, Авторынок Алмаз, павильон №129Общий: (863... ;
Ростов-на-Дону, Малиновского ул., 13в (Автозапчасти)Общий: (863... ;
Автозапчасти на европейские, японские и корейские автомобили, автосервис, электронная измерительная система параметров кузова, чип-тюнинг, автострахование, независимая оценка ущерба
Web-сайт: www.pihtinauto.rostov.ru Пример №3 Автобаза СКЖД
Город: Ростов-на-Дону
Адрес: Шолохова пр. 5а
Телефон: (863) 2595684
Автоколонна №1558
Город: Ростов-на-Дону
Адрес: Нансена ул. 103
Телефон: (863) 2348455 — приемная
(863) 2323335 — диспетчерская
(863) 2321339 — диспетчерская
(863) 2345938 — служба безопасности
(863) 2345892
АТП администрации РО
Город: Ростов-на-Дону
Адрес: Текучева ул. 376
Телефон: (863) 2535881 — диспетчер
(863) 2533090 — диспетчер
(863) 2276017 — Театральный, пр., 62а
(863) 2530990 — директор
(863) 2276117 — Пеатральный, пер., 62а-ПТО Основное требование — как можно большая автоматичность и универсальность, но можно ошибаться. Например, если в город попадет еще и строка «Подробная информация об организации», то это не страшно. Некоторые данные (телефон, почта) можно легко найти с помощью рег. выражений. Город и адрес можно поискать в КЛАДРе или, опять же, придумать рег. выражение. А вот как понять где название фирмы? И как сгруппировать найденные реквизиты, ведь не всегда (пример №1) они разделены разделителем? — Ничего не получается придумать. Хотелось бы услышать ваши соображения по поводу того, как можно подойти к решению задачи.
-
> [0] Kolan © (21.10.08 15:23)
общее решение задачи - ИИ.
-
Предложения нужны конкретные, если ИИ, то как конкретно. Если условаия слишком общие, то как бы вы их ужесточили. То есть я хочу пононять как бы вы решали такую задачу, конкретно, что бы делали...
-
> А вот как понять где название фирмы?
так оно там не первой строкой разве?
> ведь не всегда (пример №1) они разделены разделителем?
а там не перевод строки разделитель?
-
> [2] Kolan © (21.10.08 16:25)
путей несколько: 1. заставить/попросить того, кто присылает этот текст следовать какому-либо четкому шаблону. 2. разгребать все самому вручную, либо поручить это кому-либо.
в том виде, в котором информация предоставляется сейчас (как попало) ничего распарсить не получится со 100% результатом качества, все равно потом перепроверять человеку прийдется.
-
100% гарантии никто не даст
главная сложность - вычленить название компании из всего этого мусора
-
> Kolan © (21.10.08 16:25) [2]
Грид две/три колонки СheckMark Значение Тип (комбобокс)
Что можешь автоматически опознать опознаешь, что нет то сам задаешь в комбобокс.
Но похоже, что ты хочешь украсть чужую информацию, с веб сайтов.
-
> так оно там не первой строкой разве?
На первой, на первой строке блока, а как выделить блок?
> а там не перевод строки разделитель?
Да, он, только он же раздялет и все остальное...
> 1. заставить/попросить того, кто присылает этот текст следовать > какому-либо четкому шаблону.
Это совершенно невозможно, исходные данные копируются с сайтов, с любых.
> 2. разгребать все самому вручную, либо поручить это кому- > либо.
Как разгребать? Что именно предлагается?
Сто процентное качество не требуется, я об этом писал в [0].
-
> Но похоже, что ты хочешь украсть чужую информацию, с веб > сайтов.
> Это совершенно невозможно, исходные данные копируются с > сайтов, с любых.
:)
-
Парсер - это набор правил. Если ты можешь выявить что-либо в этом тексте, согласно этим правилам, то какие-проблемы их описать?
О 100% качестве. Тут нельзя говорить 100 или 90 или 2 процента. Либо-либо. Либо парсит, либо не парсит. Ибо, если парсинг предполагает ошибки, то проверяющему человеку придется проверять все абсолютно.
-
> [7] Kolan © (21.10.08 16:53)
> Как разгребать? Что именно предлагается?
разгребать спорные места. как-то контора, где я работал, делала сайт по отелям tur-hotel .ru (описание отеля, описание пляжа, фотки, отзывы об отеле и т.п.). т.е. была собрана база из примерно 30000 отелей, информация по-возможности структурированна в CSV файл, но тоже были спорные места. так вот разгребать эти спорные места поручили девочке секретарше ) справилась вполне нормально примерно за месяц (+/- неделя), при том, что занималась этим час-два в день. особой срочности не было.
-
> ...что нет то сам задаешь в комбобокс.
Понял идею. Боюсь будет много «непонятного».
> Но похоже, что ты хочешь украсть...
Украсть хочу не я, я хочу написать парсер :) Кстати, я точно не знаю для чего им будут пользоваться, может и не для воровства. Да и воровством это не назовёшь, данные в отрытом доступе, тайного хищения тут нет.
> Парсер - это набор правил. Если ты можешь выявить что-либо > в этом тексте, согласно этим правилам, то какие-проблемы > их описать?
Согласен. Описать проблем нет. Проблема придумать правила.
Eraser, я понял, ты предлагаешь примерно то же, что и АП в [6].
> главная сложность - вычленить название компании.
Мне кажется, что если бы их вычленить, то можно былобы легко поразбивать на блоки, и дальше было бы легче. Как бы это сделать...
-
Это не важно, что ты только объявление дал :-) Сомневаюсь, что держатели сайтов давали добро на собирание базы таким способом. На подобное должно быть письменное разрешение, кроме того у сайта выгоднее купить уже структированую информацию, чем ее воровать.
-
Анатолий, эта тема, я думаю, выходит за пределы данного топика.
-
> Kolan (21.10.2008 19:06:13) [13]
Я еще думаю закрыть или нет.
Задача решения не имеет, все что можно сделать так это удобное средство для указания аттрибутов и разделения из на строки Вообще то ничего писать не надо, может только предварительный парсинг, а инструмент обычный Эксель, потом с него в базу.
-
Я понимаю, что в таком виде задача не имеет нормального решения, поэтому я и спрашиваю что бы вы (отвечающие) делали, как подходили бы к задаче. Вариант с удобным указанием аттрибутов — один из ответов. Может быть будут другие.
-
> Kolan © (21.10.08 19:21) [15]
Этот файл с "атрибутами-реквизитами" к тебе с какой Луны падает ?
-
Я вот думал, может сделать парсер многопроходным? На первом проходе можно попробовать найти то, что найти легко — телефоны, емэйлы, адреса сайтов, города (по КЛАДР), и, возможно, улицы. А на втором проходе используя даннные найденые на первом выделять блоки реквизитов по, например, расстоянию в строках или символах между телефонами или еще чем-то.
Есть идеи?
-
Пользователь-Луна заходит на сайт (пример http://allorostov.ru), копирует данные, вставляет их в мемо.
-
> Kolan (21.10.2008 19:21:15) [15]Мне многократно приходилось решать подобные задачи. Я обычно загонял в базу и там ручками редактировал, но делал предварительно два комплекта полей, исходные данные и конечная структура. Конечное частично заполнялось автоматически, там где это возможно, где нет, то оставалось пустым. Далее оператор проходил по записям и при необходимости корректировал и/или копировал информацию из полей. Иногда делалось многократная автоматическая корректировка, когда после каждого прохода дописывалась программа или корректирующий скрипт. Потому что разделение делалось довольно глубое, например адреса и фамилии разбивались на составляющие, в итоге ручной работы оставалось немного. Адреса к тому же приводились к единому виду, что бы не было такого, как Московская область/Московская обл. Часто это делалось просто в Экселе, с помощью его формул и отсутствие нужды в программисте. После некоторой дроссировке эту работу делала свободная девушка.
Исходные данные | Field1 | Field2 | FieldN |
-
> Сергей М. (21.10.2008 19:28:16) [16]
Методом экспроприации
-
Сайт <> Файл
Так откуда взялся файл ?
-
Eraser © (21.10.08 16:39) [4] >в том виде, в котором информация предоставляется сейчас (как попало) >ничего распарсить не получится со 100% результатом качества, все равно >потом перепроверять человеку прийдется. Неправда. Именно на такую информацию - легко написать парсер который будет 90% правильно разбирать и оставшиеся 10% представлять в виде удобном для анализа. У меня такую работу студентка-дипломница делала без проблем. Хинт - разбивается на лексемы те на группы построчно. email-ы и телефоны парсятся однозначно и сразу - тут не о чем и говорить. Все адреса при парсинге элементарно проверяются пор справочнику - тоже исключаются неоднозначности. На типовые фразы составляется словарь. Это начало дальше немного сложнее но проблем нет. Потом оператор проверяет только неразобраное
-
> Так откуда взялся файл ?
Если данные на сайте выделить и скопировать в буфер, то их затем можно будет вставить в обычный текстовый файл. Файлы эти будут похожи на те, которые я привел в вопросе. Анатолий, заголовки полей, как я понял, в моём случае такие: Исходные данные | Название фирмы | Телефон | Адрес | ... А что будет исходными данными, можно пример?
-
> Kolan © (21.10.08 19:47) [23]
Ну да ладно.
Вставил и вставил.
А ты, мил человек, с технологиями и механизмами регулярных выражений хоть в коей-то мере знаком ?
-
Sergey Masloff, а как рабить на блоки? Я считаю, что это самое сложное. Как понять, что тут: Кварта-Трейд Подробная информация об организации
Город: Аксайский р-н, Аксай
Адрес: Промышленная ул. 5
Телефон: (86350) 49396
(86350) 48985
(86350) 56292 — факс
E-mail: Отправить e-mail
Транс-Абсолют Экспорт-Импорт, дилер автомобилей SCANIA Подробная информация об организации
Город: Аксайский р-н, Аксай
Адрес: Промышленная ул. 2
Телефон: (86350) 55155
(863) 2919333 — г.Ростов-на-Дону
(863) 2919222 — г.Ростов-на-Дону
(863) 2919111 — г.Ростов-на-Дону
(863) 2999000 — диспетчерская
E-mail: Отправить e-mail два блока реквизитов?
-
Сергей, в вопросе я пишу: «Некоторые данные (телефон, почта) можно легко найти с помощью рег. выражений...», видимо знаком :).
-
> Kolan © (21.10.08 19:55) [26]
А все остальное, мил человек, не регулярное.. и ищется с пом. того самого "ИИ", который тебе предстоит изобрести)
-
В принципе, Сергей Маслофф подсказал куда копать — лексемы. Осталось только отделить блоки данных, может таки в два прохода?
-
> [22] Sergey Masloff (21.10.08 19:39)
и, тем не менее, без проверки человеком не обойтись. довольно просто написать парсер, который сделет пусть 70-80% работы, но очень сложно написать парсер, который сделает 90-95% работы. цифры грубо привел, но думаю мысль понятна. чем отвлекать на несколько дней квалифицированного программиста, проще сделать базовый скрипт, а потом поручить работу девочке. конечно от объемов данных зависит.. если записей миллионы (даже сотни тысяч) и более, тогда я не прав, но смоневаюсь, что у автора такие объемы данных.
-
Eraser, смысл отвлекать программиста есть. Программист, то есть я, должен показать на новой работе, что он умеет программировать :) Пусть 70% сейчас я не понимаю как и 1% найти. Ну разложу я на лексемы, ну понахожу телефоны и все «простое», и что из этого? Что делать с этим добром? Как вычленить группы реквизитов? — Хз...
-
> может таки в два прохода?
Да хоть в двести !
Во сколько проходов, мил человек, ты определишь судьбу того, в "файле" которого так или иначе фигурируют "казнить" и "помиловать" ?
-
> [30] Kolan © (21.10.08 20:11)
из тех примеров, что ты привел нифига не понятно, как разделять на группы. надо просмотреть все записи и составить список признаков начала/окончания блока. потом в нужной последовательности пытаться разбивать текст по этим признакам.
-
> Kolan ©
Блок данных почти во всех случаях имеет адрес. Его можно использовать в качестве разделителей блоков(информация о конторе). + нужно еще сделать правки вверх или вниз. Например вверх на одну строку, поскольку в большинстве случаев
Пусть он будет в виде. a) Адрес: .... б) ....
Таким образом ты делаешь нетерминалом - реквизит. И пытаешься свернуть правую часть раньше левой части. То есть как только в потоке встречается поток представляющий новый нетерминал. Начинаешь его анализ. И в случае успеха, останавливаешь предыдущий(то есть реквизит останавливается на начале нового), в случае провала продолжаешь старый реквизит.
То есть действуешь по принципу почти LR анализатора. Пытаешься свернуть, то что справа. Но действуешь явной без грамматики(оно задана частично).
Например
Нашли нетерминал
1. Город: (терминал - это удачно, но не всегда так будет) 2. Аксайский 3. р-н, 4. Аксай
О!!!! новый нетерминал
5. Адрес: 6. Промышленная ул. 7. Телефон: (86350) 49396
С телефоном сложнее придется придумать несколько правил на него. И рассматривать самое длинное правило в грамматике. Аля прогностический оператор.
P.S. Я к сожалению не эксперт. Читаю в данный момент сам. Пока только написал ДКА построитель для рег. выражений. Уверен Ахо бы тебе помог.
-
> oxffff © (21.10.08 20:21) [33]
Уж сколько раз твердили миру - бардак не поддается автоматизации его разгребания)
-
> Сергей М. © (21.10.08 20:26) [34]
Как бы нам не хотелось, хотим мы того или нет, но мы всегда вынуждены бороться со сложностями. Слава богу что мир не идеален, для нас всегда найдется работа. ;)
-
> oxffff © (21.10.08 20:30) [35] > > Сергей М. © (21.10.08 20:26) [34] > мы ..вынуждены бороться со сложностями.
Кроме тебя вряд ли кого-то понуждают)
Давай уже не трынди)
-
Сергей М. © (21.10.08 20:26) [34] >Уж сколько раз твердили миру - бардак не поддается автоматизации его >разгребания) Ну так мир не в нашей власти (скорее наоборот) поэтому тверди не тверди а разгребать приходится ;-)
-
Sergey Masloff, нужен еще хинт. Положим, что блоки чётко разделены. Вот я разбил строки на лексемы для двух примеров. Кварта-Трейд
Подробная
информация
об
организации
Город:
Аксайский
р-н,
Аксай
Адрес:
Промышленная
ул.
5
Телефон:
(86350)
49396
(86350)
48985
(86350)
56292
—
факс
E-mail:
Отправить
e-mail ПихтинАвто
344090,
Ростов-на-Дону,
Малиновского
ул.,
13а/1
(Автосервис)Общий:
(863)
200-77-88
;Эвакуатор:
(863...
;Кузовной
цех:
(863...
;E-mail:
www.pihtinauto@aaanet.ru
Ростов-на-Дону,
Авторынок
Фортуна,
павильон
№46Общий:
(863...
;
Ростов-на-Дону,
Авторынок
Алмаз,
павильон
№129Общий:
(863...
;
Ростов-на-Дону,
Малиновского
ул.,
13в
(Автозапчасти)Общий:
(863...
;
Автозапчасти
на
европейские,
японские
и
корейские
автомобили,
автосервис,
электронная
измерительная
система
параметров
кузова,
чип-тюнинг,
автострахование,
независимая
оценка
ущерба
Web-сайт:
www.pihtinauto.rostov.ru Теперь что? Иду полексемно? И что делаю?
-
Kolan © Если в лоб (на тех данных что приведены) я бы попробовал выделять адреса (это можно делать с достаточно высокой степенью достоверности). Причем в адрес объединять возможно несколько подряд идущих строк перед которыми есть строка точно с не-адресом. Написать анализатор который такие блоки выделяет. Потом взять достаточно большой массив исходных данных и порезать его на куски беря например на одну строку "выше" начала адреса. И статичтически посмотреть сколько будет ошибок сразу. Ну и дальше по обстановке
-
Если видишь что адрес это хороший маркер то бъешь на блоки и на каждый блок натравливаешь свой анализатор который: - вытаскивает наименование (считает что это то что над адресов например) - вытаскивает адреса пытаясь их нормализовать (с проверкой по справочнику) - вытаскивает телефоны - весь оставшийся "мусор" ссыпает в общий блок (который потом можно отдельно проанализировать используя уже словарь предметной области)
-
Угу, это предложил oxffff. Это способ разрезать на блоки. А дальше? Как анализировать сами данные, на лексемы разбивать? И что? Анализировать каждую лексему?
-
41 писал не видя 40.
А первоначальную разбивку по адресу делать не по словарю, а по признакам ул. пр., да?
-
> Kolan (21.10.2008 19:47:23) [23]
Это не для твоего случая, твой случай был выше, поле с типом, для каждой строки + надо подумать над разделением склееных строк на несколько (пример 2). Но как я говорил, правильнее обратиться к держателю авторских прав, для получения структурной информации.
-
> Kolan (21.10.2008 20:11:30) [30]
Тут надо плясать от конечной базы, явно видно множественные аттрибуты, которые надо помещать в отдельные таблицы, например телефоны, для которых тоже отдельный парсинг.
-
> Kolan © (21.10.08 22:22) [41]
Я не спец. по составлению грамматик, но как то так. :)
Например
Улица.
NT_Address -> NT_ANY_STRING 'ул.' NT_ANY_STRING NT_Address -> 'Адрес:' NT_ANY_STRING 'ул.' NT_ANY_STRING NT_Address -> 'Адрес' NT_ANY_STRING 'ул.' NT_ANY_STRING NT_Address -> NT_Address ANYCHAR | NO_CHAR ANYCHAR_SEQ -> ANY_NUM|a|b|c| ANY_NUM -> 1|2|3| ANY_NUM_SEQ -> ANY_NUM_SEQ ANY_NUM | ANY_NUM NO_CHAR -> ''
Телефон.
NT_TEL -> (ANY_NUM_SEQ) ANY_NUM_SEQ-ANY_NUM_SEQ NT_TEL -> ANY_NUM_SEQ-ANY_NUM_SEQ (ANYCHAR_SEQ) NT_TEL -> ANY_NUM_SEQ
ORG_ITEM-> NT_TEL | NT_Address | .... ORG_ITEMs-> ORG_ITEMs ORG_ITEM | NO_CHAR ORG -> ORG_ITEMs.
:))))
-
> oxffff © (21.10.08 22:38) [45]
Разбор введешь в стиле LR анализа.
-
> Я не спец. по составлению грамматик
НО очень им хочу быть. :))))))))))))))))))))))))))))))))))))))))))))))))))))))
-
Kolan © (21.10.08 22:24) [42] >А первоначальную разбивку по адресу делать не по словарю, а по >признакам ул. пр., да? Надо пробовать насколько это корректно.Без реальных объемов не так просто угадать. Упрощает ситуацию то что времени на попробовать много не надо -за один день реально 2-3 варианта анализаторов написать
-
Kolan, ты же с сайтов собираешься обрабатывать информацию. В пределах сайта для разбора достаточно использовать одно единственое правило. Так как все страницы сайта делаются по одному шаблону. Парсить нужно не текст с HTML страницы, а саму HTML-страницу. Например в [0] Подробная информация об организации очевидно ссылка и её можно отсеивать по тегу <A>. Т.е. тэги являются разделителями. Твоя задача создать программу которая берёт одну страницу с сайта, показывает её пользователю. Пользователь поочерёдно выделяет фрагменты текста и сообщает программе какой фрагмент чем является: адресом, названием или чем другим. Программа запоминает между какими тэгами находятся указаные фрагменты и начинает потрошить сайт. Пока одна часть программы потрошит сайт, вторая с помощью пользователя проходит обучение по потрошению следующего сайта и т.д. Так за день можно выпотрошить сотню сайтов.
-
oxffff, благодарю. Кстати, мне кажется ты не знаешь что для Delphi есть уже реализованый модуль для рег. выражений, называется TRegExp. Это я к тому, что вдруг ДКА ты зря делаешь :). --- Ладно, для начала кое-что есть. Благодарю за ответы.
-
> Kolan © (21.10.08 22:43) [50]
TRegExp?
Уверен, что я не первый и не последний это делаю. :) Я всегда стараюсь изучить подход досконально. Поэтому читаю не нового дракона, а старого в части синтаксического разбора.
-
> Наиль
Идея неплоха, но теги-то обычно все одинаковые, это же не xml. Вот для примера №1 <table cellspacing="0" cellpadding="0" border="0" class="info">
<tr><td colspan="2">Одежда, магазин №001 </td></tr>
<tr><td class="pole" width="20%"><noindex>Город:</noindex></td>
<td width="80%">Сальск</td></tr>
<tr><td class="pole"><noindex>Адрес:</noindex></td>
<td>Ленина ул. 17 </td></tr>
</table>
И что тут выбирать. А ведь надо для любых сайтов...
-
> TRegExp?
Извеняюсь, ошибся чуть-чуть.
-
> Kolan
Без правил нет игры
-
Будем считать любую пару скобок <> тэгом. Тогда Название находится после третьего тэга, Город после одиннацатого, Улица и дом после девятнацатого. Это и должна определять программа после того, как пользователь укажет, что Одежда, магазин №001 - Название Сальск - город Ленина ул. 17 - Адрес. Далее полученые правила применяются ко всем страницам сайта. Начать лучше с http://foliant.info/ - 90% всех предприятий России, включая мелкие.
-
Кстати, пользователю не обязательно показывать тэги. Достаточно определить где находится выделеный фрагмент в HTML-коде.
-
Например, Вывести текст попадающий между двумя тэгами в отдельную строчку ListBox. Тогда пользователю остаётся найти нужную строку в ListBox и указать к какому типу информации она относится.
-
Я бы еще посоветовал использовать словари, в разборе/нормализации текстов с ними проще. Например для названий вполне вероятно, что если есть "ООО" то за ним может идти название, в официальной форме может быть "Название ООО". Т.е. словари тоже должны помочь ИМХО.
-
Отчёт
Кое-что в общем получилось. Придумал и реализовал довольно простую систему, основанную на правилах.
Весть текст разбивается на строки. У каждой строки есть список правил, соответствие которым там можно найти.
Правила бывают двух типов: правила, которые можно найти по рег. выражениям и правила, которые можно найти по расстоянию от других, уже найденных правил.
Работает просто. Сначала парсер перебирает строки и ищет то, что можно найти с помощью рег. выражений. Дальше, он снова проходит все строки и ищет позиции правил по расстоянию.
У правила есть атрибут, который делает его разделителем блоков. Дальше преобразовать все это в БД али еще куда — не проблема.
Сами правила загружаются из ини файла.
Благодарю за обсуждение вопроса.
-
Судя по тому что
> текст может быть совсем любой
размерчик ini-файла будет впечатлять).. Вселенной для его хранения не хватит)
|