Конференция "Прочее" » Парсинг текста и выделение реквизитов.
 
  • Kolan © (21.10.08 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 © (21.10.08 15:27) [1]
    > [0] Kolan ©   (21.10.08 15:23)

    общее решение задачи - ИИ.
  • Kolan © (21.10.08 16:25) [2]
    Предложения нужны конкретные, если ИИ, то как конкретно. Если условаия слишком общие, то как бы вы их ужесточили. То есть я хочу пононять как бы вы решали такую задачу, конкретно, что бы делали...
  • clickmaker © (21.10.08 16:30) [3]
    > А вот как понять где название фирмы?

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

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

    а там не перевод строки разделитель?
  • Eraser © (21.10.08 16:39) [4]
    > [2] Kolan ©   (21.10.08 16:25)

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

    в том виде, в котором информация предоставляется сейчас (как попало) ничего распарсить не получится со 100% результатом качества, все равно потом перепроверять человеку прийдется.
  • TUser © (21.10.08 16:47) [5]
    100% гарантии никто не даст

    главная сложность - вычленить название компании из всего этого мусора
  • Anatoly Podgoretsky © (21.10.08 16:49) [6]

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

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

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

    Но похоже, что ты хочешь украсть чужую информацию, с веб сайтов.
  • Kolan © (21.10.08 16:53) [7]
    > так оно там не первой строкой разве?

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


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

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


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

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


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

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

    Сто процентное качество не требуется, я об этом писал в [0].
  • clickmaker © (21.10.08 17:03) [8]
    > Но похоже, что ты хочешь украсть чужую информацию, с веб
    > сайтов.


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


    :)
  • KilkennyCat © (21.10.08 17:04) [9]
    Парсер - это набор правил. Если ты можешь выявить что-либо в этом тексте, согласно этим правилам, то какие-проблемы их описать?

    О 100% качестве.
    Тут нельзя говорить 100 или 90 или 2 процента. Либо-либо. Либо парсит, либо не парсит. Ибо, если парсинг предполагает ошибки, то проверяющему человеку придется проверять все абсолютно.
  • Eraser © (21.10.08 17:04) [10]
    > [7] Kolan ©   (21.10.08 16:53)


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

    разгребать спорные места.
    как-то контора, где я работал, делала сайт по отелям tur-hotel .ru (описание отеля, описание пляжа, фотки, отзывы об отеле и т.п.). т.е. была собрана база из примерно 30000 отелей, информация по-возможности структурированна в CSV файл, но тоже были спорные места. так вот разгребать эти спорные места поручили девочке секретарше ) справилась вполне нормально примерно за месяц (+/- неделя), при том, что занималась этим час-два в день. особой срочности не было.
  • Kolan © (21.10.08 17:53) [11]
    > ...что нет то сам задаешь в комбобокс.

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


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

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


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

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

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


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

    Мне кажется, что если бы их вычленить, то можно былобы легко поразбивать на блоки, и дальше было бы легче. Как бы это сделать...
  • Anatoly Podgoretsky © (21.10.08 19:04) [12]
    Это не важно, что ты только объявление дал :-)
    Сомневаюсь, что держатели сайтов давали добро на собирание базы таким способом. На подобное должно быть письменное разрешение, кроме того у сайта выгоднее купить уже структированую информацию, чем ее воровать.
  • Kolan © (21.10.08 19:06) [13]
    Анатолий, эта тема, я думаю, выходит за пределы данного топика.
  • Anatoly Podgoretsky © (21.10.08 19:15) [14]
    > Kolan  (21.10.2008 19:06:13)  [13]

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

    Задача решения не имеет, все что можно сделать так это удобное средство для указания аттрибутов и разделения из на строки
    Вообще то ничего писать не надо, может только предварительный парсинг, а инструмент обычный Эксель, потом с него в базу.
  • Kolan © (21.10.08 19:21) [15]
    Я понимаю, что в таком виде задача не имеет нормального решения, поэтому я и спрашиваю что бы вы (отвечающие) делали, как подходили бы к задаче. Вариант с удобным указанием аттрибутов — один из ответов. Может быть будут другие.
  • Сергей М. © (21.10.08 19:28) [16]

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


    Этот файл с "атрибутами-реквизитами" к тебе с какой Луны падает ?
  • Kolan © (21.10.08 19:29) [17]
    Я вот думал, может сделать парсер многопроходным? На первом проходе можно попробовать найти то, что найти легко — телефоны, емэйлы, адреса сайтов, города (по КЛАДР), и, возможно, улицы. А на втором проходе используя даннные найденые на первом выделять блоки реквизитов по, например, расстоянию в строках или символах между телефонами или еще чем-то.

    Есть идеи?
  • Kolan © (21.10.08 19:32) [18]
    Пользователь-Луна заходит на сайт (пример http://allorostov.ru), копирует данные, вставляет их в мемо.
  • Anatoly Podgoretsky © (21.10.08 19:34) [19]
    > Kolan  (21.10.2008 19:21:15)  [15]

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


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

  • Anatoly Podgoretsky © (21.10.08 19:36) [20]
    > Сергей М.  (21.10.2008 19:28:16)  [16]

    Методом экспроприации
  • Сергей М. © (21.10.08 19:37) [21]
    Сайт <> Файл

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

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

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



    А что будет исходными данными, можно пример?
  • Сергей М. © (21.10.08 19:51) [24]

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


    Ну да ладно.

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

    А ты, мил человек, с технологиями и механизмами регулярных выражений хоть в коей-то мере знаком ?
  • Kolan © (21.10.08 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 © (21.10.08 19:55) [26]
    Сергей, в вопросе я пишу: «Некоторые данные (телефон, почта) можно легко найти с помощью рег. выражений...», видимо знаком :).
  • Сергей М. © (21.10.08 20:01) [27]

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


    А все остальное, мил человек, не регулярное.. и ищется с пом. того самого "ИИ", который тебе предстоит изобрести)
  • Kolan © (21.10.08 20:05) [28]
    В принципе, Сергей Маслофф подсказал куда копать — лексемы. Осталось только отделить блоки данных, может таки в два прохода?
  • Eraser © (21.10.08 20:06) [29]
    > [22] Sergey Masloff   (21.10.08 19:39)

    и, тем не менее, без проверки человеком не обойтись.
    довольно просто написать парсер, который сделет пусть 70-80% работы, но очень сложно написать парсер, который сделает 90-95% работы. цифры грубо привел, но думаю мысль понятна. чем отвлекать на несколько дней квалифицированного программиста, проще сделать базовый скрипт, а потом поручить работу девочке. конечно от объемов данных зависит.. если записей миллионы (даже сотни тысяч) и более, тогда я не прав, но смоневаюсь, что у автора такие объемы данных.
  • Kolan © (21.10.08 20:11) [30]
    Eraser, смысл отвлекать программиста есть. Программист, то есть я, должен показать на новой работе, что он умеет программировать :) Пусть 70% сейчас я не понимаю как и 1% найти. Ну разложу я на лексемы, ну понахожу телефоны и все «простое», и что из этого? Что делать с этим добром? Как вычленить группы реквизитов? — Хз...
  • Сергей М. © (21.10.08 20:15) [31]

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


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

    Во сколько проходов, мил человек, ты определишь судьбу того, в "файле" которого так или иначе фигурируют "казнить" и "помиловать" ?
  • Eraser © (21.10.08 20:17) [32]
    > [30] Kolan ©   (21.10.08 20:11)

    из тех примеров, что ты привел нифига не понятно, как разделять на группы.
    надо просмотреть все записи и составить список признаков начала/окончания блока. потом в нужной последовательности пытаться разбивать текст по этим признакам.
  • oxffff © (21.10.08 20:21) [33]

    > Kolan ©  


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

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

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

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

    Например

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

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

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

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

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

    P.S. Я к сожалению не эксперт. Читаю в данный момент сам.
    Пока только написал ДКА построитель для рег. выражений.
    Уверен Ахо бы тебе помог.
  • Сергей М. © (21.10.08 20:26) [34]

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


    Уж сколько раз твердили миру - бардак не поддается автоматизации его разгребания)
  • oxffff © (21.10.08 20:30) [35]

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


    Как бы нам не хотелось, хотим мы того или нет, но мы всегда вынуждены бороться со сложностями.
    Слава богу что мир не идеален, для нас всегда найдется работа. ;)
  • Сергей М. © (21.10.08 21:12) [36]

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


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

    Давай уже не трынди)
  • Sergey Masloff (21.10.08 21:59) [37]
    Сергей М. ©   (21.10.08 20:26) [34]
    >Уж сколько раз твердили миру - бардак не поддается автоматизации его >разгребания)
    Ну так мир не в нашей власти (скорее наоборот) поэтому тверди не тверди а разгребать приходится ;-)
  • Kolan © (21.10.08 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 (21.10.08 22:13) [39]
    Kolan ©  
    Если в лоб (на тех данных что приведены) я бы попробовал выделять адреса (это можно делать с достаточно высокой степенью достоверности). Причем в адрес объединять возможно несколько подряд идущих строк перед которыми есть строка точно с не-адресом. Написать анализатор который такие блоки выделяет. Потом взять достаточно большой массив исходных данных и порезать его на куски беря например на одну строку "выше" начала адреса. И статичтически посмотреть сколько будет ошибок сразу. Ну и дальше по обстановке
  • Sergey Masloff (21.10.08 22:19) [40]
    Если видишь что адрес это хороший маркер то бъешь на блоки и на каждый блок натравливаешь свой анализатор который:
    - вытаскивает наименование (считает что это то что над адресов например)
    - вытаскивает адреса пытаясь их нормализовать (с проверкой по справочнику)
    - вытаскивает телефоны
    - весь оставшийся "мусор" ссыпает в общий блок (который потом можно отдельно проанализировать используя уже словарь предметной области)
  • Kolan © (21.10.08 22:22) [41]
    Угу, это предложил oxffff. Это способ разрезать на блоки. А дальше? Как анализировать сами данные, на лексемы разбивать? И что? Анализировать каждую лексему?
  • Kolan © (21.10.08 22:24) [42]
    41 писал не видя 40.

    А первоначальную разбивку по адресу делать не по словарю, а по признакам ул. пр., да?
  • Anatoly Podgoretsky © (21.10.08 22:26) [43]
    > Kolan  (21.10.2008 19:47:23)  [23]

    Это не для твоего случая, твой случай был выше, поле с типом, для каждой строки + надо подумать над разделением склееных строк на несколько (пример 2).
    Но как я говорил, правильнее обратиться к держателю авторских прав, для получения структурной информации.
  • Anatoly Podgoretsky © (21.10.08 22:29) [44]
    > Kolan  (21.10.2008 20:11:30)  [30]

    Тут надо плясать от конечной базы, явно видно множественные аттрибуты, которые надо помещать в отдельные таблицы, например телефоны, для которых тоже отдельный парсинг.
  • oxffff © (21.10.08 22:38) [45]

    > 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:40) [46]

    > oxffff ©   (21.10.08 22:38) [45]


    Разбор введешь в стиле LR анализа.
  • oxffff © (21.10.08 22:41) [47]

    > Я не спец. по составлению грамматик


    НО очень им хочу быть. :))))))))))))))))))))))))))))))))))))))))))))))))))))))
  • Sergey Masloff (21.10.08 22:42) [48]
    Kolan ©   (21.10.08 22:24) [42]
    >А первоначальную разбивку по адресу делать не по словарю, а по >признакам ул. пр., да?
    Надо пробовать насколько это корректно.Без реальных объемов не так просто угадать. Упрощает ситуацию то что времени на попробовать много не надо -за один день реально 2-3 варианта анализаторов написать
  • Наиль © (21.10.08 22:42) [49]
    Kolan, ты же с сайтов собираешься обрабатывать информацию.
    В пределах сайта для разбора достаточно использовать одно единственое правило.
    Так как все страницы сайта делаются по одному шаблону.
    Парсить нужно не текст с HTML страницы, а саму HTML-страницу.
    Например в [0]
    Подробная информация об организации

    очевидно ссылка и её можно отсеивать по тегу <A>. Т.е. тэги являются разделителями.
    Твоя задача создать программу которая берёт одну страницу с сайта, показывает её пользователю.
    Пользователь поочерёдно выделяет фрагменты текста и сообщает программе какой фрагмент чем является: адресом, названием или чем другим. Программа запоминает между какими тэгами находятся указаные фрагменты и начинает потрошить сайт. Пока одна часть программы потрошит сайт, вторая с помощью пользователя проходит обучение по потрошению следующего сайта и т.д. Так за день можно выпотрошить сотню сайтов.
  • Kolan © (21.10.08 22:43) [50]
    oxffff, благодарю. Кстати, мне кажется ты не знаешь что для Delphi есть уже реализованый модуль для рег. выражений, называется TRegExp. Это я к тому, что вдруг ДКА ты зря делаешь :).
    ---
    Ладно, для начала кое-что есть. Благодарю за ответы.
  • oxffff © (21.10.08 22:47) [51]

    > Kolan ©   (21.10.08 22:43) [50]


    TRegExp?

    Уверен, что я не первый и не последний это делаю. :)
    Я всегда стараюсь изучить подход досконально. Поэтому читаю не нового
    дракона, а старого в части синтаксического разбора.
  • Kolan © (21.10.08 22:51) [52]
    > Наиль

    Идея неплоха, но теги-то обычно все одинаковые, это же не 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>



    И что тут выбирать. А ведь надо для любых сайтов...
  • Kolan © (21.10.08 22:53) [53]
    > TRegExp?

    Извеняюсь, ошибся чуть-чуть.

    {
        TRegExpr class library
        Delphi Regular Expressions

    Copyright (c) 1999-2004 Andrey V. Sorokin, St.Petersburg, Russia

    You may use this software in any kind of development,
    including comercial, redistribute, and modify it freely,
    under the following restrictions :
    1. This software is provided as it is, without any kind of
       warranty given. Use it at Your own risk.The author is not
       responsible for any consequences of use of this software.
    2. The origin of this software may not be mispresented, You
       must not claim that You wrote the original software. If
       You use this software in any kind of product, it would be
       appreciated that there in a information box, or in the
       documentation would be an acknowledgement like

        Partial Copyright (c) 2004 Andrey V. Sorokin
                                   http://RegExpStudio.com
                                   mailto:anso@mail.ru

    3. You may not have any income from distributing this source
       (or altered version of it) to other developers. When You
       use this product in a comercial package, the source may
       not be charged seperatly.
    4. Altered versions must be plainly marked as such, and must
       not be misrepresented as being the original software.
    5. RegExp Studio application and all the visual components as
       well as documentation is not part of the TRegExpr library
       and is not free for usage.

                                       mailto:anso@mail.ru
                                       http://RegExpStudio.com
                                       http://anso.da.ru/
    }

  • Сергей М. © (21.10.08 22:55) [54]

    > Kolan


    Без правил нет игры
  • Наиль © (21.10.08 23:01) [55]
    Будем считать любую пару скобок <> тэгом.
    Тогда Название находится после третьего тэга,
    Город после одиннацатого, Улица и дом после девятнацатого.
    Это и должна определять программа после того, как пользователь укажет, что
    Одежда, магазин №001 - Название
    Сальск - город
    Ленина ул. 17 - Адрес.
    Далее полученые правила применяются ко всем страницам сайта.
    Начать лучше с http://foliant.info/ - 90% всех предприятий России, включая мелкие.
  • Наиль © (21.10.08 23:03) [56]
    Кстати, пользователю не обязательно показывать тэги.
    Достаточно определить где находится выделеный фрагмент в HTML-коде.
  • Наиль © (21.10.08 23:06) [57]
    Например, Вывести текст попадающий между двумя тэгами в отдельную строчку ListBox.
    Тогда пользователю остаётся найти нужную строку в ListBox и указать к какому типу информации она относится.
  • makvell (22.10.08 10:44) [58]
    Я бы еще посоветовал использовать словари, в разборе/нормализации текстов с ними проще. Например для названий вполне вероятно, что если есть "ООО" то за ним может идти название, в официальной форме может быть "Название ООО". Т.е. словари тоже должны помочь ИМХО.
  • Kolan © (23.10.08 16:23) [59]
    Отчёт

    Кое-что в общем получилось. Придумал и реализовал довольно простую систему, основанную на правилах.

    Весть текст разбивается на строки. У каждой строки есть список правил, соответствие которым там можно найти.

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

    Работает просто. Сначала парсер перебирает строки и ищет то, что можно найти с помощью рег. выражений. Дальше, он снова проходит все строки и ищет позиции правил по расстоянию.

    У правила есть атрибут, который делает его разделителем блоков. Дальше преобразовать все это в БД али еще куда — не проблема.

    Сами правила загружаются из ини файла.

    Благодарю за обсуждение вопроса.
  • Сергей М. © (23.10.08 16:30) [60]
    Судя по тому что


    > текст может быть совсем любой


    размерчик ini-файла будет впечатлять).. Вселенной для его хранения не хватит)
 
Конференция "Прочее" » Парсинг текста и выделение реквизитов.
Есть новые Нет новых   [134444   +23][b:0.001][p:0.006]