Автор Тема: CuneiForm для DjVu  (Прочитано 55666 раз)

N.M.E.

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: CuneiForm для DjVu
« Ответ #30 : 14 ЅЮпСам 2010, 23:18:16 »
Цитировать
Так что буду теперь делать модифицированную версию djvuxmlparser
ненужная, лишняя программа..
правильнее встроить данную функцию в djvutoxml.. конечно, предварительно исправив баги..
имхо..

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #31 : 15 ЅЮпСам 2010, 09:12:39 »
N.M.E.
Цитировать
ненужная, лишняя программа..
правильнее встроить данную функцию в djvutoxml.. конечно, предварительно исправив баги..
Лично я согласен с таким мнением. Но мне этим заниматься неохота. Главное, чтобы всё вообще хоть как-то работало.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #32 : 15 ЅЮпСам 2010, 11:36:43 »
Я сделал свой вариант исправленного djvuxmlparser - с указыванием пути к DjVu в командной строке. Отправил Леону Боту описание исправления. Теперь всё будет зависеть от того, одобрит ли это Леон, или нет.

Но даже если и не одобрит - то для себя я, конечно, буду пользоваться именно таким djvuxmlparser - потому что так будет гораздо удобнее.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #33 : 15 ЅЮпСам 2010, 22:34:57 »
Леон Боту прислал мне ответ:
Цитировать
Thanks for your patch.
But please let me repeat my constraint:
Because I do not know all the users of djvuxmlparser and all the reasons for this design, I will only make changes that leave the original functionality unchanged.
It is okay to have an optional extra argument that does more logical things, but, when called without this argument, djvuxmlparser must do exactly the same thing as before.

Anyway I believe I have sufficient info from your files to do it.
But not immediately though..

- L.

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #34 : 16 ЅЮпСам 2010, 09:31:03 »
Я решил пока выложить свой вариант подправленного djvuxmlparser. Пока там Леон будет зреть, уже можно будет моим вариантом реально пользоваться:

http://www.djvu-soft.narod.ru/soft/djvuxmlparserm.rar  (257 КБ)

Внутри экзешник и модифицированные исходники.

Синтаксис такой:

djvuxmlparserm <xml_path> <djvu_path>

Утилита игнорирует путь к DjVu, содержащийся в XML.

N.M.E.

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: CuneiForm для DjVu
« Ответ #35 : 16 ЅЮпСам 2010, 18:32:44 »
Цитировать
Утилита игнорирует путь к DjVu, содержащийся в XML.
а если сделать так:
при наличии в строке ссылки на djvu-файл - игнорировать, при отсутствии - брать из xml..
тогда и по-старому работать будет, и новая функциональность появится..

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #36 : 16 ЅЮпСам 2010, 19:37:44 »
N.M.E.
Цитировать
тогда и по-старому работать будет, и новая функциональность появится..
Вот как раз так Леон и хочет сделать. Надеюсь, он это действительно сделает.

Я же считаю вариант работы "по-старому" ошибочным и неправильным. Кроме того, нынешний вариант программы позволяет обрабатывать сразу несколько XML-файлов в одной командной строке. Это я тоже считаю ошибочным и неправильным. Такой цикл правильнее организовывать за пределами программы - а не внутри неё. Это нарушение принципа оптимальной простоты, т.е. опять "вредный универсализм" (как у Тулона, Болеги и многих других).

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #37 : 16 ЅЮпСам 2010, 19:39:44 »
Ура, Леон прислал мне новое письмо:
Цитировать
Done. I just added an option "-o djvufile" that
can be specifed before any xml file on the command line.

- L.
Завтра скомпилю и выложу новую версию программы. :)

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #38 : 17 ЅЮпСам 2010, 13:13:24 »
Вот новая официальная версия djvuxmlparser от Леона Боту

http://www.djvu-soft.narod.ru/soft/djvuxmlparser.rar  (254 КБ)

Внутри экзешник и модифицированные исходники.

Синтаксис такой:

Usage: djvuxmlparser [-o <djvufile>] <xmlfile> ...

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #39 : 19 ЅЮпСам 2010, 13:11:27 »
Мне пришлось забраковать конвертер html2xhtml http://www.it.uc3m.es/jaf/html2xhtml/download.html (как я думаю, этот тот самый, который мне посоветовал Thomas Breuel - если только нет другого одноимённого).

У него обнаружилась такая проблема: при создании XML он заворачивает строки:
Цитировать
<span class="ocr_line" id="line_1" title="bbox 62 89 1283 131">шенствованию
        компрессоров в ХИ11 и Х1Х вв. способст-<span class="ocr_cinfo"
А надо так:
Цитировать
<span class="ocr_line" id="line_1" title="bbox 62 89 1283 131">шенствованию компрессоров в ХИ11 и Х1Х вв. способст-<span class="ocr_cinfo"
Из-за этого потом при парсении XML получаются дикие проблемы: в единой строке посередине оказывается символ перевода строки и после него куча пробелов. И всё это нужно суметь удалить правильно. Перепробовал все опции там - ничего не помогло.

Кроме того - там абзацные отступы в XML (форматирующие) сделаны пробелами! :o Насколько я знаю, отступы следует делать табами - а не пробелами.

Попробовал я вернуться к http://www.xsolvo.com/files/html2xmlcl.exe с http://www.xsolvo.com/Download .

На удивление, он сработал как нужно - строки не завернул. Так что буду им пользоваться. Правда, там проблемка с кодировками - не понимает он UTF8. :-\ Ну, это решаемо.

Конечно, на самом деле мне нетрудно сам HTML пропарсить - но делать это не хочется, так как это некрасивое решение ИМХО.

Короче, и tidy, и html2xhtml - оба кривые, косые и неправильные конвертеры HTML -> XML. Нельзя ими пользоваться.
« Последнее редактирование: 19 ЅЮпСам 2010, 13:17:00 от monday2000 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #40 : 19 ЅЮпСам 2010, 17:03:34 »
Выяснилось, что hOCR вообще нельзя преобразовать в такой XML, который можно было бы потом правильно пропарсить. :(

Проблема оказалась в выделении текста курсивом/жирным. В hOCR это выглядит так:
Цитировать
<span class="ocr_line" id="line_9" title="bbox 68 445 1287 486"><i>прошлого</i> столетия. Многоступенчатый компрессор с межсту-</span>
И в XML оно потом выглядит точно так же.

При попытке пропарсить такое выражение XML-парсер "вырывает" из общей строки узел <i> и считает его подузлом общей строки. Но самое главное, что при этом теряется позиция узла <i> в общей строке.  >:( Поэтому общую строку в итоге невозможно воссоздать. Вот если бы XML-парсер умел игнорировать некоторые узлы - тогда проблемы бы не было.

Прийдётся, наверное, делать самодельный парсер hOCR с заменой всех узлов <i> и <b> на их содержимое.  :'(

На самом деле нужно было делать hOCR (разработчикам hOCR) как-то так:
Цитировать
<span class="ocr_line" id="line_9" title="bbox 68 445 1287 486"><span style="i">прошлого</span> <span style="common">столетия. Многоступенчатый компрессор с межсту-</span></span>
Вот тогда бы не было никаких проблем с парсением.

Очередной раз убеждаюсь в глупости создателей hOCR.
« Последнее редактирование: 19 ЅЮпСам 2010, 17:07:44 от monday2000 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #41 : 20 ЅЮпСам 2010, 14:29:33 »
Кажется, проблему с XML удастся обойти. Я получил ответ от Арсения Капулькина, автора pugixml.
Вот мой вопрос:
Цитировать
Добрый день.

Подскажите, пожалуйста, по pugixml.

Есть ли возможность сделать так, чтобы программа при парсении XML-файла игнорировала бы вложенные узлы по имени. Пример:

<span>Солнце <i>светит</i> жёлтым светом</span>

Мне из узла span надо прочитать так: "Солнце светит жёлтым светом".

А пока что я получаю при обходе дерева 2 фразы:

"Солнце жёлтым светом"

"светит"

и я потом никак не могу собрать это воедино.
Вот его ответ:
Цитировать
При парсинге игнорировать теги и сохранять контент нельзя.
Но. Собрать воедино - можно.

В данном примере у <span> есть три ребенка:
тип node_pcdata, value = "Солнце "
тип node_element, name = "i"
тип node_pcdata, value = " жёлтым светом"

У <i> есть один ребенок:
тип node_pcdata, value = "светит"

Соответственно простая рекурсивная функция может все это собрать.
Например - совсем тривиальная, без выборочного игнорирования:

std::string inner_text(pugi::xml_node node)
{
    std::string result;
    for (pugi::xml_node child = node.first_child(); child; child =
child.next_sibling())
        if (child.type() == pugi::node_pcdata || child.type() ==
pugi::node_cdata)
            result += child.value();
        else if (child.type() == pugi::node_element)
            result += inner_text(child);

    return result;
}

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #42 : 21 ЅЮпСам 2010, 11:20:43 »
Парсер HTML для MFC:

http://www.codeproject.com/KB/library/GomzyHTMLReader.aspx

Fast and Compact HTML/XML Scanner/Tokenizer

http://www.codeproject.com/KB/recipes/HTML_XML_Scanner.aspx

Парсинг странички, посылаю запрос, получаю ответ сервера в виде html-кода
http://forum.sources.ru/index.php?showtopic=207001
« Последнее редактирование: 21 ЅЮпСам 2010, 11:43:03 от monday2000 »

monday2000

  • Администратор
  • *****
  • Сообщений: 985
    • AOL клиент - -
    • Yahoo клиент - -
    • Просмотр профиля
    • Создание книг в электронном виде из бумажных книг (в формате DjVu)
    • E-mail
Re: CuneiForm для DjVu
« Ответ #43 : 23 ЅЮпСам 2010, 11:03:28 »
Я сделал консольную программу:

hocr2djvuxml

Версия:  v1.0.

Скачать:

http://www.djvu-soft.narod.ru/soft/hocr2djvuxml_v1_0.rar  (123 КБ)

Синтаксис:

hocr2djvuxml <hOCR_path> <DjVuXML_path>

Эта программа делает из одностраничного hOCR-файла, полученного в CuneiForm, соответствующий DjVu XML-файл, который можно затем подать на вход djvuxmlparser, и таким образом вставить OCR от CuneiForm в DjVu.

Программа написана на С++ STL и использует pugixml. Она является полностью кроссплатформенной. Лицензия - "GPL 2 and later". Программа работает полностью на UTF-8 - на входе и на выходе имеем UTF-8.

Я решил не делать преобразование hOCR -> hxml (а уже потом hxml->dxml), поскольку это оказалось довольно непросто (особенно в плане перекодировок).

И ещё я сделал демо-набор для демонстрации работы этой утилиты:

Скачать:

http://www.djvu-soft.narod.ru/scan/hocr2djvuxml_demo.rar  (322 КБ)

Там один hOCR-файл и соответствующий ему DjVu-файл без OCR-слоя.

Пока что hocr2djvuxml ещё очень примитивен. Он способен обрабатывать только самый простейший hOCR-синтаксис. Формируемая в DjVu XML OCR-информация разбита лишь построчно - даже не пословно (не говоря уже о побуквенном разбиении). Я пока точно не знаю, делает ли CuneiForm более точное разбиение, чем просто построчное. Если делает, то я тоже сделаю.

С моей точки зрения hocr2djvuxml более прост, чем hocr2djvused от Jakub Wilk. Всего одна утилита - и полностью кроссплатформенная. Не требующая для своей работы никакой дополнительной хрени вроде Java, Python, .NET и т.д. и т.п.

В дальнейшем буду в случае необходимости совершенствовать эту утилиту. Для этого мне нужны неординарные примеры hOCR-файлов от CuneiForm.

N.M.E.

  • Пользователь
  • **
  • Сообщений: 87
    • Просмотр профиля
Re: CuneiForm для DjVu
« Ответ #44 : 23 ЅЮпСам 2010, 19:12:01 »
Цитировать
Я пока точно не знаю, делает ли CuneiForm более точное разбиение, чем просто построчное.
:o
а что ж по твоему означает всё это множество цифр после title="x_bboxes?
конечно же это координаты букв))
и использовать надо именно эти координаты, складывая их затем в слова или строки..