User Tools

Site Tools


parse_informe

Parsing para informes de radiologia

Convirtiendo a TXT

Lo primero es obtener los informes en un pdf legible. Hay dos tipos de informes disponibles en PDF.

  1. PDFs escaneados m(
  2. PDFs impresos desde MSWord o similar

Para los primero tenemos que usar OCR. Primero hay que convertirlos en una imagen mas o menos grande y sobre esta ejecutar el reconnocimiento de caracteres,

$ convert -density 300 -units PixelsPerInch informe.pdf tmp.tif
$ tesseract tmp.tif informe

En el segundo caso, esto no funciona. Pero el texto en si se puede facilmente,

$ pdftotext informe.pdf informe.txt

En el caso de la v0, cuando proceden de MSWord el archivo .docx existe en el directorio. Entonces es facil hacer,

for x in facehbi_informes_mri/v0/*.pdf; do n=$(echo ${x} | awk -F"/" '{print $3}'); if [[ -e ${x%.pdf}.docx ]]; then pdftotext ${x} txts/v0/${n%.pdf}.txt; else convert -density 300 -units PixelsPerInch ${x} tmp.tif; tesseract tmp.tif txts/v0/${n%.pdf}; fi; done

Variables a buscar

parse.pl
#!/usr/bin/perl
 
use strict;
use warnings;
use File::Find::Rule;
use File::Basename qw(basename);
use Data::Dump qw(dump);
 
my %rois = ('medial' => 'ATM',
	'cortical parietal' => 'ACP');
my $parse_dir = shift;
my @txts = find(file => 'name' => "*.txt", in => $parse_dir);
my %info;
foreach my $report (sort @txts){
	my $name = basename $report;
	$name =~ s/\.txt$//;
	$info{$name}{'Fazekas'} = "NA";
	open IDF, "<$report";
	my $this_line;
	while(<IDF>) {
		foreach my $roi (sort keys %rois){
			if (/$roi/){
				if (/bilateral/){
					if(/\d\s*bilateral/){ 
						my ($grado) = /(\d)\s*bilateral/;
						$info{$name}{$rois{$roi}.'_I'} = $grado;
						$info{$name}{$rois{$roi}.'_D'} = $grado;
					}
					if(/bilateral\s*grad\w\s*\d/){
						my ($grado) = /bilateral\s*grad\w\s*\d*-*(\d)/;
						$info{$name}{$rois{$roi}.'_I'} = $grado;
						$info{$name}{$rois{$roi}.'_D'} = $grado;
					}
				}
				if (/izqui/){
					if(/\d\s*izqui/){
						my ($grado) = /(\d)\s*izqui/;
						$info{$name}{$rois{$roi}.'_I'} = $grado;
					}
				}
				if (/dere/){
					if(/\d\s*dere/){
						my ($grado) = /(\d)\s*dere/;
						$info{$name}{$rois{$roi}.'_D'} = $grado;
					}
				}
			}
		}
		if (/azekas\s*\d/){
			(my $fazekas) = /azekas\s*\d*-*(\d)/;
			$info{$name}{'Fazekas'} = $fazekas;
		}
		if (/cortical global/){
			if(/\d/){
				my ($grado) = /\d*-*(\d)/;
				$info{$name}{'ACG'} = $grado;
			}
		}
	}
	close IDF;
}
 
print "Subject,";
foreach my $roi (sort keys %rois){
	my $ch = $rois{$roi}.'_I,'.$rois{$roi}.'_D,';
	print "$ch";
}
print "ACG,Fazekas\n";
foreach my $subject (sort keys %info){
	my $fazekas = exists($info{$subject}{'Fazekas'})?$info{$subject}{'Fazekas'}:"NA";
	my $acg = exists($info{$subject}{'ACG'})?$info{$subject}{'ACG'}:"NA";
	print "$subject,";
	foreach my $roi (sort keys %rois){
		my $ad = exists($info{$subject}{$rois{$roi}.'_D'})?$info{$subject}{$rois{$roi}.'_D'}:"NA";
		my $ai = exists($info{$subject}{$rois{$roi}.'_I'})?$info{$subject}{$rois{$roi}.'_I'}:"NA";
		print "$ad,$ai,";
	}
	print "$acg,$fazekas\n";
}
parse_informe.txt · Last modified: 2021/04/22 16:05 by osotolongo