У меня есть медицинские документы, которые в настоящее время представлены в формате hOCR . Я хочу преобразовать их в формат xml.
Есть ли специальное программное обеспечение для Mac/Linux, которое может это сделать?
Может существовать специальное программное обеспечение для Mac/Linux/Windows, но я написал свой собственный PHP-скрипт, чтобы получить все данные из файла hOCR в базу данных, и оттуда я могу создать любой формат данных, который я хочу.
hOCR уже должен быть xhtml. Приведенный ниже php-скрипт считывает файл данных hOCR (созданный Tesseract OCR) пословно (со словесными данными, такими как страница, строка, номер слова, само слово, координаты...) в базу данных SQLite3, и оттуда я могу сделать все, что я хочу с данными, например запрос и вставка его в некоторые теги xml по мере необходимости, или поиск слов из следующей строки с такими же начальными координатами x и т. д.
PHP-код (5.4+) ниже содержит много ненужных вещей, таких как комментарии и т. д., но он довольно быстро считывает содержимое файла hOCR в файл базы данных SQLite3.
В зависимости от вашего языка (здесь в основном финский, т.е. ISO-8859-15) вы можете изменить некоторые регулярные выражения и т. д. И имя обрабатываемого файла указывается в качестве первого аргумента этого скрипта.
<?php
// Splitting a hOCR file to rows with page, area, line, word info per word in a doc
// Function to replace all separator chars on row with one thing, so that one explode per row will do
$dbh_hocr=new SQlite3("hOCRtemp.db");
$createTable=$dbh_hocr->exec("create table if not exists invWords (id INTEGER PRIMARY KEY, FileName TEXT, PageNr INTEGER, LineNr INTEGER, WordNr INTEGER, WordName TEXT, X1 INTEGER, Y1 INTEGER, X2 INTEGER, Y2 INTEGER)");
$clearTheTable=$dbh_hocr->exec("delete from invWords");
$thisDocWords=array();
// The file name is in argv[1]
$fileNameHere=$argv[1];
$fileToUse=file_get_contents($fileNameHere);
$pages=explode("<div class='ocr_page'", $fileToUse);
foreach($pages as $ocrCarea)
{
$thisOcrCarea=explode("<div class='ocr_carea'", $ocrCarea);
foreach($thisOcrCarea as $ocrPar)
{
$thisOcrPar=explode("<div class='ocr_par'", $ocrPar);
foreach($thisOcrPar as $ocrLine)
{
$thisOcrLine=explode("<span class='ocr_line'", $ocrLine);
foreach($thisOcrLine as $ocrWord)
{
$thisOcrWord=explode("<span class='ocrx_word'", $ocrWord);
foreach($thisOcrWord as $item)
{
if(substr_count($item, "block_")>0)
{
$printYes=0;
$msg="Not";
}
if(substr_count($item, "page_")>0)
{
$printYes=1;
$msg="Sivurivi ";
$thisItem=explode("page_", $item);
$thisItem=$thisItem[1];
$thisPageNr=explode("'", $thisItem);
$pageItem=strip_tags($thisPageNr[0]); // Jeh. It works.
}
if(substr_count($item, "line_")>0)
{
$printYes=1;
$msg="Rivirivi ";
$thisLineItem=explode("line_", $item);
$thisLineItem=$thisLineItem[1];
$thisLineNr=explode("'", $thisLineItem);
$lineItem=strip_tags($thisLineNr[0]);
}
if(substr_count($item, "word_")>0)
{
$printYes=1;
$msg="Sanarivi ";
$thisWordItem=explode("word_", $item);
$thisWordItem=$thisWordItem[1];
$thisWordNr=explode("'", $thisWordItem);
$item=$thisWordNr[0];
$restOfRow=$thisWordNr[1];
$lopRiv=explode("\"", $restOfRow);
$boxCoordsPart=$lopRiv[1];
$boxCoordsPart=explode(" ", $boxCoordsPart);
$boxCoordX1=$boxCoordsPart[1];
$boxCoordY1=$boxCoordsPart[2];
$boxCoordX2=$boxCoordsPart[3];
$boxCoordY2=$boxCoordsPart[4];
$theWordHere=strip_tags(substr($lopRiv[2], 1));
if(trim($theWordHere!=""))
{
$theWordHere=trim(str_replace("\n", "", $theWordHere));
}
else
{
$theWordHere=str_replace("\n", "", $theWordHere);
}
$theWordHere=iconv('UTF-8', 'ISO-8859-15', $theWordHere);
$theWordHere=preg_replace("/[^0-9A-ZÅÄÖa-zåäö\-\/, .]/", "", $theWordHere);
$thisWordData=$pageItem."#".$lineItem."#".$item."#".$theWordHere."#".$boxCoordX1."#".$boxCoordY1."#".$boxCoordX2."#".$boxCoordY2."\r\n";
array_push($thisDocWords, $thisWordData);
}
}
}
}
}
}
// TESTING
$dbh_hocr->exec('BEGIN');
$stmt=$dbh_hocr->prepare("insert into invWords (FileName, PageNr, LineNr, WordNr, WordName, X1, Y1, X2, Y2) values (:FileName, :PageNr, :LineNr, :WordNr, :WordName, :X1, :Y1, :X2, :Y2)");
foreach($thisDocWords as $thisWordRowArr)
{
$thisWordRowArr=explode("#", $thisWordRowArr);
$pageNumber=$thisWordRowArr[0];
$lineNumber=$thisWordRowArr[1];
$wordNumber=$thisWordRowArr[2];
$wordName=$thisWordRowArr[3];
$wordName=trim($wordName);
$theFirstCharInWordName=substr(trim($wordName), 0, 1);
if(!preg_match('/^[A-Za-zÅÄÖåäö0-9]/', $theFirstCharInWordName))
{
$wordName=substr($wordName, 1);
}
$theLastChar=substr($wordName, -1);
if(!preg_match('/^[A-Za-zÅÄÖåäö0-9]/', $theLastChar))
{
$lengthOfWordNameToUse=strlen($wordName)-1;
$wordName=substr($wordName, 0, $lengthOfWordNameToUse);
}
if($lineNumber<15 && substr($wordName, 0, 7)=="VUOKRAA")
{
$wordName="VUOKRAAJA";
}
$x1=$thisWordRowArr[4];
$y1=$thisWordRowArr[5];
$x2=$thisWordRowArr[6];
$y2=$thisWordRowArr[7];
$stmt->bindValue(':FileName', $fileNameHere);
$stmt->bindValue(':PageNr', $pageNumber);
$stmt->bindValue(':LineNr', $lineNumber);
$stmt->bindValue(':WordNr', $wordNumber);
$stmt->bindValue(':WordName', $wordName);
$stmt->bindValue(':X1', $x1);
$stmt->bindValue(':Y1', $y1);
$stmt->bindValue(':X2', $x2);
$stmt->bindValue(':Y2', $y2);
$stmt->execute();
} // END FOREACH
$dbh_hocr->exec('COMMIT');
?>