Конференция "Прочее" » Парсинг текста и выделение реквизитов.
 
  • 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]
    Отчёт

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

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

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

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

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

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

    Благодарю за обсуждение вопроса.
 
Конференция "Прочее" » Парсинг текста и выделение реквизитов.
Есть новые Нет новых   [134444   +24][b:0][p:0.003]