Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

Парсинг текста и выделение реквизитов.   Найти похожие ветки 

 
Kolan ©   (2008-10-21 15:23) [0]

Здравствуйте,
 Мне нужно сделать парсер, который мог бы в тексте находить реквизиты; нужен ваш совет. Сложность заключается в том, что текст может быть совсем любой.

Пример №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) они разделены разделителем?
— Ничего не получается придумать.

Хотелось бы услышать ваши соображения по поводу того, как можно подойти к решению задачи.


 
Eraser ©   (2008-10-21 15:27) [1]

> [0] Kolan ©   (21.10.08 15:23)

общее решение задачи - ИИ.


 
Kolan ©   (2008-10-21 16:25) [2]

Предложения нужны конкретные, если ИИ, то как конкретно. Если условаия слишком общие, то как бы вы их ужесточили. То есть я хочу пононять как бы вы решали такую задачу, конкретно, что бы делали...


 
clickmaker ©   (2008-10-21 16:30) [3]

> А вот как понять где название фирмы?

так оно там не первой строкой разве?

> ведь не всегда (пример №1) они разделены разделителем?

а там не перевод строки разделитель?


 
Eraser ©   (2008-10-21 16:39) [4]

> [2] Kolan ©   (21.10.08 16:25)

путей несколько:
1. заставить/попросить того, кто присылает этот текст следовать какому-либо четкому шаблону.
2. разгребать все самому вручную, либо поручить это кому-либо.

в том виде, в котором информация предоставляется сейчас (как попало) ничего распарсить не получится со 100% результатом качества, все равно потом перепроверять человеку прийдется.


 
TUser ©   (2008-10-21 16:47) [5]

100% гарантии никто не даст

главная сложность - вычленить название компании из всего этого мусора


 
Anatoly Podgoretsky ©   (2008-10-21 16:49) [6]


> Kolan ©   (21.10.08 16:25) [2]

Грид две/три колонки
СheckMark    Значение    Тип (комбобокс)

Что можешь автоматически опознать опознаешь, что нет то сам задаешь в комбобокс.

Но похоже, что ты хочешь украсть чужую информацию, с веб сайтов.


 
Kolan ©   (2008-10-21 16:53) [7]

> так оно там не первой строкой разве?

На первой, на первой строке блока, а как выделить блок?


> а там не перевод строки разделитель?

Да, он, только он же раздялет и все остальное...


> 1. заставить/попросить того, кто присылает этот текст следовать
> какому-либо четкому шаблону.

Это совершенно невозможно, исходные данные копируются с сайтов, с любых.


> 2. разгребать все самому вручную, либо поручить это кому-
> либо.

Как разгребать? Что именно предлагается?

Сто процентное качество не требуется, я об этом писал в [0].


 
clickmaker ©   (2008-10-21 17:03) [8]

> Но похоже, что ты хочешь украсть чужую информацию, с веб
> сайтов.


> Это совершенно невозможно, исходные данные копируются с
> сайтов, с любых.


:)


 
KilkennyCat ©   (2008-10-21 17:04) [9]

Парсер - это набор правил. Если ты можешь выявить что-либо в этом тексте, согласно этим правилам, то какие-проблемы их описать?

О 100% качестве.
Тут нельзя говорить 100 или 90 или 2 процента. Либо-либо. Либо парсит, либо не парсит. Ибо, если парсинг предполагает ошибки, то проверяющему человеку придется проверять все абсолютно.


 
Eraser ©   (2008-10-21 17:04) [10]

> [7] Kolan ©   (21.10.08 16:53)


> Как разгребать? Что именно предлагается?

разгребать спорные места.
как-то контора, где я работал, делала сайт по отелям tur-hotel .ru (описание отеля, описание пляжа, фотки, отзывы об отеле и т.п.). т.е. была собрана база из примерно 30000 отелей, информация по-возможности структурированна в CSV файл, но тоже были спорные места. так вот разгребать эти спорные места поручили девочке секретарше ) справилась вполне нормально примерно за месяц (+/- неделя), при том, что занималась этим час-два в день. особой срочности не было.


 
Kolan ©   (2008-10-21 17:53) [11]

> ...что нет то сам задаешь в комбобокс.

Понял идею. Боюсь будет много «непонятного».


> Но похоже, что ты хочешь украсть...

Украсть хочу не я, я хочу написать парсер :) Кстати, я точно не знаю для чего им будут пользоваться, может и не для воровства. Да и воровством это не назовёшь, данные в отрытом доступе, тайного хищения тут нет.


> Парсер - это набор правил. Если ты можешь выявить что-либо
> в этом тексте, согласно этим правилам, то какие-проблемы
> их описать?

Согласен. Описать проблем нет. Проблема придумать правила.

Eraser, я понял, ты предлагаешь примерно то же, что и АП в [6].


> главная сложность - вычленить название компании.

Мне кажется, что если бы их вычленить, то можно былобы легко поразбивать на блоки, и дальше было бы легче. Как бы это сделать...


 
Anatoly Podgoretsky ©   (2008-10-21 19:04) [12]

Это не важно, что ты только объявление дал :-)
Сомневаюсь, что держатели сайтов давали добро на собирание базы таким способом. На подобное должно быть письменное разрешение, кроме того у сайта выгоднее купить уже структированую информацию, чем ее воровать.


 
Kolan ©   (2008-10-21 19:06) [13]

Анатолий, эта тема, я думаю, выходит за пределы данного топика.


 
Anatoly Podgoretsky ©   (2008-10-21 19:15) [14]

> Kolan  (21.10.2008 19:06:13)  [13]

Я еще думаю закрыть или нет.

Задача решения не имеет, все что можно сделать так это удобное средство для указания аттрибутов и разделения из на строки
Вообще то ничего писать не надо, может только предварительный парсинг, а инструмент обычный Эксель, потом с него в базу.


 
Kolan ©   (2008-10-21 19:21) [15]

Я понимаю, что в таком виде задача не имеет нормального решения, поэтому я и спрашиваю что бы вы (отвечающие) делали, как подходили бы к задаче. Вариант с удобным указанием аттрибутов — один из ответов. Может быть будут другие.


 
Сергей М. ©   (2008-10-21 19:28) [16]


> Kolan ©   (21.10.08 19:21) [15]


Этот файл с "атрибутами-реквизитами" к тебе с какой Луны падает ?


 
Kolan ©   (2008-10-21 19:29) [17]

Я вот думал, может сделать парсер многопроходным? На первом проходе можно попробовать найти то, что найти легко — телефоны, емэйлы, адреса сайтов, города (по КЛАДР), и, возможно, улицы. А на втором проходе используя даннные найденые на первом выделять блоки реквизитов по, например, расстоянию в строках или символах между телефонами или еще чем-то.

Есть идеи?


 
Kolan ©   (2008-10-21 19:32) [18]

Пользователь-Луна заходит на сайт (пример http://allorostov.ru), копирует данные, вставляет их в мемо.


 
Anatoly Podgoretsky ©   (2008-10-21 19:34) [19]

> Kolan  (21.10.2008 19:21:15)  [15]

Мне многократно приходилось решать подобные задачи. Я обычно загонял в базу и там ручками редактировал, но делал предварительно два комплекта полей,  исходные данные и конечная структура. Конечное частично заполнялось автоматически, там где это возможно, где нет, то оставалось пустым. Далее оператор проходил по записям и при необходимости корректировал и/или копировал информацию из полей. Иногда делалось многократная автоматическая корректировка, когда после каждого прохода дописывалась программа или корректирующий скрипт. Потому что разделение делалось довольно глубое, например адреса и фамилии разбивались на составляющие, в итоге ручной работы оставалось немного. Адреса к тому же приводились к единому виду, что бы не было такого, как Московская область/Московская обл. Часто это делалось просто в Экселе, с помощью его формул и отсутствие нужды в программисте. После некоторой дроссировке эту работу делала свободная девушка.


Исходные данные | Field1 | Field2 | FieldN |


 
Anatoly Podgoretsky ©   (2008-10-21 19:36) [20]

> Сергей М.  (21.10.2008 19:28:16)  [16]

Методом экспроприации


 
Сергей М. ©   (2008-10-21 19:37) [21]

Сайт <> Файл

Так откуда взялся файл ?


 
Sergey Masloff   (2008-10-21 19:39) [22]

Eraser ©   (21.10.08 16:39) [4]
>в том виде, в котором информация предоставляется сейчас (как попало) >ничего распарсить не получится со 100% результатом качества, все равно >потом перепроверять человеку прийдется.
Неправда.  Именно на такую информацию - легко написать парсер который будет 90% правильно разбирать и оставшиеся 10% представлять в виде удобном для анализа. У меня такую работу студентка-дипломница делала без проблем.
 Хинт - разбивается на лексемы те на группы построчно.
 email-ы и телефоны парсятся однозначно и сразу - тут не о чем и говорить. Все адреса при парсинге элементарно проверяются пор справочнику - тоже исключаются неоднозначности. На типовые фразы составляется словарь.
 Это начало дальше немного сложнее но проблем нет. Потом оператор проверяет только неразобраное


 
Kolan ©   (2008-10-21 19:47) [23]

> Так откуда взялся файл ?

Если данные на сайте выделить и скопировать в буфер, то их затем можно будет вставить в обычный текстовый файл. Файлы эти будут похожи на те, которые я привел в вопросе.

Анатолий, заголовки полей, как я понял, в моём случае такие:
Исходные данные | Название фирмы | Телефон | Адрес | ...

А что будет исходными данными, можно пример?


 
Сергей М. ©   (2008-10-21 19:51) [24]


> Kolan ©   (21.10.08 19:47) [23]


Ну да ладно.

Вставил и вставил.

А ты, мил человек, с технологиями и механизмами регулярных выражений хоть в коей-то мере знаком ?


 
Kolan ©   (2008-10-21 19:52) [25]

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 ©   (2008-10-21 19:55) [26]

Сергей, в вопросе я пишу: «Некоторые данные (телефон, почта) можно легко найти с помощью рег. выражений...», видимо знаком :).


 
Сергей М. ©   (2008-10-21 20:01) [27]


> Kolan ©   (21.10.08 19:55) [26]


А все остальное, мил человек, не регулярное.. и ищется с пом. того самого "ИИ", который тебе предстоит изобрести)


 
Kolan ©   (2008-10-21 20:05) [28]

В принципе, Сергей Маслофф подсказал куда копать — лексемы. Осталось только отделить блоки данных, может таки в два прохода?


 
Eraser ©   (2008-10-21 20:06) [29]

> [22] Sergey Masloff   (21.10.08 19:39)

и, тем не менее, без проверки человеком не обойтись.
довольно просто написать парсер, который сделет пусть 70-80% работы, но очень сложно написать парсер, который сделает 90-95% работы. цифры грубо привел, но думаю мысль понятна. чем отвлекать на несколько дней квалифицированного программиста, проще сделать базовый скрипт, а потом поручить работу девочке. конечно от объемов данных зависит.. если записей миллионы (даже сотни тысяч) и более, тогда я не прав, но смоневаюсь, что у автора такие объемы данных.


 
Kolan ©   (2008-10-21 20:11) [30]

Eraser, смысл отвлекать программиста есть. Программист, то есть я, должен показать на новой работе, что он умеет программировать :) Пусть 70% сейчас я не понимаю как и 1% найти. Ну разложу я на лексемы, ну понахожу телефоны и все «простое», и что из этого? Что делать с этим добром? Как вычленить группы реквизитов? — Хз...


 
Сергей М. ©   (2008-10-21 20:15) [31]


> может таки в два прохода?


Да хоть в двести !

Во сколько проходов, мил человек, ты определишь судьбу того, в "файле" которого так или иначе фигурируют "казнить" и "помиловать" ?


 
Eraser ©   (2008-10-21 20:17) [32]

> [30] Kolan ©   (21.10.08 20:11)

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


 
oxffff ©   (2008-10-21 20:21) [33]


> Kolan ©  


Блок данных почти во всех случаях имеет адрес. Его можно использовать в качестве разделителей блоков(информация о конторе). + нужно еще сделать правки вверх или вниз. Например вверх на одну строку, поскольку в большинстве случаев

Пусть он будет в виде.
a) Адрес: ....
б)  ....

Таким образом ты делаешь нетерминалом - реквизит. И пытаешься свернуть правую часть раньше левой части. То есть как только в потоке встречается поток представляющий новый нетерминал. Начинаешь его анализ. И в случае успеха, останавливаешь предыдущий(то есть реквизит останавливается на начале нового), в случае провала продолжаешь старый реквизит.

То есть действуешь по принципу почти LR анализатора.
Пытаешься свернуть, то что справа.
Но действуешь явной без грамматики(оно задана частично).

Например

Нашли нетерминал

1. Город: (терминал - это удачно, но не всегда так будет)
2.  Аксайский
3. р-н,
4. Аксай

О!!!! новый нетерминал

5. Адрес:  
6. Промышленная ул.
7. Телефон: (86350) 49396

С телефоном сложнее придется придумать несколько правил на него. И рассматривать самое длинное правило в грамматике. Аля прогностический оператор.

P.S. Я к сожалению не эксперт. Читаю в данный момент сам.
Пока только написал ДКА построитель для рег. выражений.
Уверен Ахо бы тебе помог.


 
Сергей М. ©   (2008-10-21 20:26) [34]


> oxffff ©   (21.10.08 20:21) [33]


Уж сколько раз твердили миру - бардак не поддается автоматизации его разгребания)


 
oxffff ©   (2008-10-21 20:30) [35]


> Сергей М. ©   (21.10.08 20:26) [34]


Как бы нам не хотелось, хотим мы того или нет, но мы всегда вынуждены бороться со сложностями.
Слава богу что мир не идеален, для нас всегда найдется работа. ;)


 
Сергей М. ©   (2008-10-21 21:12) [36]


> oxffff ©   (21.10.08 20:30) [35]
> > Сергей М. ©   (21.10.08 20:26) [34]
> мы ..вынуждены бороться со сложностями.


Кроме тебя вряд ли кого-то понуждают)

Давай уже не трынди)


 
Sergey Masloff   (2008-10-21 21:59) [37]

Сергей М. ©   (21.10.08 20:26) [34]
>Уж сколько раз твердили миру - бардак не поддается автоматизации его >разгребания)
Ну так мир не в нашей власти (скорее наоборот) поэтому тверди не тверди а разгребать приходится ;-)


 
Kolan ©   (2008-10-21 22:01) [38]

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


Теперь что? Иду полексемно? И что делаю?


 
Sergey Masloff   (2008-10-21 22:13) [39]

Kolan ©  
Если в лоб (на тех данных что приведены) я бы попробовал выделять адреса (это можно делать с достаточно высокой степенью достоверности). Причем в адрес объединять возможно несколько подряд идущих строк перед которыми есть строка точно с не-адресом. Написать анализатор который такие блоки выделяет. Потом взять достаточно большой массив исходных данных и порезать его на куски беря например на одну строку "выше" начала адреса. И статичтически посмотреть сколько будет ошибок сразу. Ну и дальше по обстановке


 
Sergey Masloff   (2008-10-21 22:19) [40]

Если видишь что адрес это хороший маркер то бъешь на блоки и на каждый блок натравливаешь свой анализатор который:
- вытаскивает наименование (считает что это то что над адресов например)
- вытаскивает адреса пытаясь их нормализовать (с проверкой по справочнику)
- вытаскивает телефоны
- весь оставшийся "мусор" ссыпает в общий блок (который потом можно отдельно проанализировать используя уже словарь предметной области)



Страницы: 1 2 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.02 c
15-1224238625
TUser
2008-10-17 14:17
2008.12.21
Вопрос к геймерам


3-1211885281
Vlad Oshin
2008-05-27 14:48
2008.12.21
Транзакции осуществляются в соединении или как? ADO


15-1224152807
stas
2008-10-16 14:26
2008.12.21
Вопрос по ASP.NET


2-1226596493
snake-as
2008-11-13 20:14
2008.12.21
TreeView


2-1226328530
@!!ex
2008-11-10 17:48
2008.12.21
класс, который не нужно создавать.