The following code is much more complicated than your sample, but scales reasonably for likely data and is much faster. The code breaks the data into lines of words then builds a lookup hash keyed by word and with a list of each line and word position where the word occurs. The main loop then, for each target word pair and distance, searches the two occurrence lists for the target words to see if there are any matching pairs. Note that it only allows a match if the words are in the same line and of course they must be within the correct distance of each other.
Most of the tricky stuff is taking care of retaining the punctuation while only matching the words.
#!/usr/bin/perl use strict; use warnings; use POSIX qw(locale_h); my $old_locale = setlocale (LC_CTYPE); setlocale (LC_CTYPE, 'ca_ES.iso885915@euro'); use locale; my $content = qq{ La mitad de las personas con VIH requiere de una atención psicológica + y emocional derivada del impacto del diagnóstico o de las consecuen +cias de la propia infección, una cifra que dobla a la de la població +n general, según las conclusiones de las IV Jornadas de Divulgación +sobre VIH que han reunido a unos doscientos profesionales, pacientes + y estudiantes en el hospital Reina Sofía de Murcia. En el congreso +, organizado por Amuvih en colaboración con el servicio de Proyecció +n Social y Voluntariado de la Universidad de Murcia y Abbott, ha det +erminado que las personas que viven con VIH demandan especialmente a +tención a su salud mental para mejorar su calidad de vida, "una asig +natura pendiente a pesar de los innumerables avances farmacológicos" +. Entre otros factores, las jornadas establecieron que en la situación +de "vulnerabilidad" de las personas con VIH influyen "el propio diag +nóstico, la comunicación de su situación a los allegados, el inicio +del tratamiento, las fluctuaciones a lo largo de la infección, la pé +rdida de salud y deterioro físico, así como los efectos adversos del + tratamiento". Igualmente, otros factores importantes son la pérdida de la motivació +n, el hastío, el estigma y rechazo, así como las nuevas parejas sexu +ales, los cambios familiares, laborales y sociales, entre otras cosa +s, que derivan en "riesgo de depresión mayor, trastorno distímico, t +rastorno por ansiedad generalizada o trastorno de pánico". }; my $tag = 'span'; my $class = "lighligth"; my @expressions = ('psicológica atención::20', 'otros hastío::11', 'pánico distímico +::8'); my @lines = map { [grep {defined $_->[1]} map {/(\w+)/; [$_, $1]} split] } split "\n", $content; my %lookup; for my $lineIdx (0 .. $#lines) { my $line = $lines[$lineIdx]; next if !@$line; push @{$lookup{lc $line->[$_][1]}}, [$lineIdx, $_] for 0 .. $#$lin +e; } foreach my $currExp (@expressions) { next if ($currExp !~ /::/); my ($exp, $distance) = split ("::", $currExp); my ($par1, $par2) = map {lc} split (' ', $exp); next if !exists $lookup{$par1} || !exists $lookup{$par2}; for my $par1Entry (@{$lookup{$par1}}) { for my $par2Entry (@{$lookup{$par2}}) { next if $par1Entry->[0] != $par2Entry->[0]; # same line + check next if abs ($par1Entry->[1] - $par2Entry->[1]) > $distanc +e + 1; my $par1Ref = \$lines[$par1Entry->[0]][$par1Entry->[1]][1] +; my $par2Ref = \$lines[$par2Entry->[0]][$par2Entry->[1]][1] +; $$par1Ref = "<$tag $class>$$par1Ref</$tag>"; $$par2Ref = "<$tag $class>$$par2Ref</$tag>"; } } } @lines = map { [map {$_->[0] =~ s/\w+/$_->[1]/; $_->[0]} @$_] } @lines; print "@{$lines[$_]}\n" for 0 .. $#lines;
Prints:
La mitad de las personas con VIH requiere de una <span lighligth>atenc +ión</span> <span lighligth>psicológica</span> y emocional derivada de +l impacto del diagnóstico o de las consecuencias de la propia infecci +ón, una cifra que dobla a la de la población general, según las concl +usiones de las IV Jornadas de Divulgación sobre VIH que han reunido a + unos doscientos profesionales, pacientes y estudiantes en el hospita +l Reina Sofía de Murcia. En el congreso, organizado por Amuvih en col +aboración con el servicio de Proyección Social y Voluntariado de la U +niversidad de Murcia y Abbott, ha determinado que las personas que vi +ven con VIH demandan especialmente atención a su salud mental para me +jorar su calidad de vida, "una asignatura pendiente a pesar de los in +numerables avances farmacológicos". Entre otros factores, las jornadas establecieron que en la situación d +e "vulnerabilidad" de las personas con VIH influyen "el propio diagnó +stico, la comunicación de su situación a los allegados, el inicio del + tratamiento, las fluctuaciones a lo largo de la infección, la pérdid +a de salud y deterioro físico, así como los efectos adversos del trat +amiento". Igualmente, <span lighligth>otros</span> factores importantes son la p +érdida de la motivación, el <span lighligth>hastío</span>, el estigma + y rechazo, así como las nuevas parejas sexuales, los cambios familia +res, laborales y sociales, entre otras cosas, que derivan en "riesgo +de depresión mayor, trastorno <span lighligth>distímico</span>, trast +orno por ansiedad generalizada o trastorno de <span lighligth>pánico< +/span>".
In reply to Re^3: Problems searching and highlighting proximity words in a text
by GrandFather
in thread Problems searching and highlighting proximity words in a text
by jrc
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |