Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.206 c
11-1196406133
Михаил
2007-11-30 10:02
2008.12.21
ListBox


15-1224581575
Студенты
2008-10-21 13:32
2008.12.21
Dbgrid, как повернуть 90 ?


15-1224141876
brother
2008-10-16 11:24
2008.12.21
проблемма с гуглем...


2-1226754671
vegarulez
2008-11-15 16:11
2008.12.21
Вопрос про TLabel.Caption


15-1224564830
Slider007
2008-10-21 08:53
2008.12.21
С днем рождения ! 21 октября 2008 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский