![]() |
|
|
![]()
|
|
| dereyly |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 16.6.2006 Репутация: 1 Всего: 4 |
Какое то время занимаюсь разработкой, разнообразных парсеров, которые по html-тегам выделяют: текст сообщения, автора текста, дату написания и т.д. Можно назвать данную задачу не парсингом а простейшим data-mining'ом. Так вот вопрос какими средствами лучше решать данный вопрос, библиотеки или ссылку на описания алгоритма или идеи алгоритмов? точнее как сделать все более менее универсально.
То что уже есть: написал несколько алгоритмов которые перебирают шаблоны. Шаблон это частичное дерево переходов по html-тегам обход идет методом конечных автоматов. Работаю с новостями и новостными лентами рус и англ. 1-шаблон 1- сайт и любое изменение или неучтенный фактор ведет к ошибке. |
|||
|
||||
| maxdiver |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
А шаблоны строгие? И приходится ли учитывать всю информацию, включая всякие css-классы, или всё-таки на практике достаточно обходиться именами тегов?
|
|||
|
||||
| dereyly |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 16.6.2006 Репутация: 1 Всего: 4 |
Для большинства сайтов подходит просто модель переходов по тегам, но редко нужно указывать классы. Я сделал шаблоны к 16 иностранным новостным сайтам и к 2 из них использовали css-классы. (Минус css-классов: из них сложнее получить int для последующих сравнений, а тегов мало, и мы смело их в std::map кидаем (хеш или дерево -- все равно)). Но проблема моего парсера, то что 1 шаблон -- 1 сайт. Так же я пробовал читать rss (лента.ру, риан, рбк), там проще, так-как из rss я основную инфу получаю: дату, название, категорию. После этого перехожу по линку и читаю только текст. Для данных сайтов подойдет 1 шаблон, так как текст чаще всего характеризуется линком <p> (иногда <br>) и заканчивается <div> или <table>. Сформулировал некоторые эвристики: 1. В текстовом блоке встречаются теги <p> <br> 1а. Если теги <p> встречаются в разных местах (разделены <div> или <table>), то текст находится там где данных тегов больше. 2. Текст имеет наибольшее количество символов на одном уровне дерева. 3. Текст является блоком информации, содержащим не более k-ссылок. Но эвристики тоже не очень спасут мир. Лучше б сравнивать похожие сайты и находить закономерности основанные на статистике. Только я недодумал какой механизм получения статистики. Первая идея была написать совпадающие теги, ведущие к заданному фрагменту. Вторая - ввести характеристики: текст в центре экрана; список тегов в фрагменте; количество ссылок в фрагменте; количество символов и т.д. Короче, путного мало, а велосипед изобретать неохота. Тема достаточно простая, и парсеры писали тоннами, только вот методичного описания я так и не нашел. Это сообщение отредактировал(а) dereyly - 18.7.2009, 14:14 |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Есть понятие "грамматики". Грамматика -- это набор правил порождения одних цепочек из других. Комбинируя эти правила (произвольно) можно получить любой текст на заданном языке (грамматически-правильный, но необязательно по смыслу).
Обычно в последнее время во всех мануалах по всем языкам синтаксис указывается при помощи этих грамматик. Вот объяснение из мануала по джаве: http://java.sun.com/docs/books/jls/third_e...l/grammars.html Прелесть грамматик в том, что их можно выполнять в обратную сторону и тогда они будут распознавать структуру текста. Обычно такой процесс выполняется в несколько проходов, распознавая как бы несколько уровней текста. Например, лексику и синтаксис. Так, при распознавании HTML можно было бы сперва распознать отдельные теги, а на втором проходе объединить их в блоки. Я видел библиотеки, которые позволяют работать с любыми грамматиками. Есть так же библиотеки, которые позволяют такие грамматики кодировать. Это сообщение отредактировал(а) Dims - 26.7.2009, 20:14 |
|||
|
||||
| dereyly |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 217 Регистрация: 16.6.2006 Репутация: 1 Всего: 4 |
Спасибо за совет, но все же это несколько не то. Последовательность HTML-тегов не порождает однозначного варианта по расположению структурных элементов в тексте. Тут проблема HTML языка, то что он слишком мягок и анализ на основе грамматик вряд ли даст результат, так как при анализе естественного языка. Но все же ваши рассуждения наталкивают на мысль о преобразование HTML в упрощенную форму, по которой легче можно судить о принадлежности заданного фрагмента струтурообразующему элементу. Так же я наткнулся в инете на правильную мысль что можно конвертить в XHTML и после этого парсить, так как чем ближе язык к XML тем проще |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Мне кажется, Вы неправы. HTML прекрасно распознаётся грамматиками. Другое дело, что полное распознавание может потребовать очень сложную грамматику.
Обращаю внимание, что понятие грамматики -- это не про русский язык. Это чисто компьютерный термин. Фактически, когда вы составляете регекспы -- вы пользуетесь понятием грамматики. |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |