-
Если видишь что адрес это хороший маркер то бъешь на блоки и на каждый блок натравливаешь свой анализатор который: - вытаскивает наименование (считает что это то что над адресов например) - вытаскивает адреса пытаясь их нормализовать (с проверкой по справочнику) - вытаскивает телефоны - весь оставшийся "мусор" ссыпает в общий блок (который потом можно отдельно проанализировать используя уже словарь предметной области)
-
Угу, это предложил 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 и указать к какому типу информации она относится.
-
Я бы еще посоветовал использовать словари, в разборе/нормализации текстов с ними проще. Например для названий вполне вероятно, что если есть "ООО" то за ним может идти название, в официальной форме может быть "Название ООО". Т.е. словари тоже должны помочь ИМХО.
-
Отчёт
Кое-что в общем получилось. Придумал и реализовал довольно простую систему, основанную на правилах.
Весть текст разбивается на строки. У каждой строки есть список правил, соответствие которым там можно найти.
Правила бывают двух типов: правила, которые можно найти по рег. выражениям и правила, которые можно найти по расстоянию от других, уже найденных правил.
Работает просто. Сначала парсер перебирает строки и ищет то, что можно найти с помощью рег. выражений. Дальше, он снова проходит все строки и ищет позиции правил по расстоянию.
У правила есть атрибут, который делает его разделителем блоков. Дальше преобразовать все это в БД али еще куда — не проблема.
Сами правила загружаются из ини файла.
Благодарю за обсуждение вопроса.
|