¿Cómo se puede hacer coincidir orden de las cuerdas entre dos documentos en Perl?

StackOverflow https://stackoverflow.com/questions/2894213

  •  04-10-2019
  •  | 
  •  

Pregunta

Tengo un problema en la fabricación de un programa Perl para hacer coincidir las palabras en dos documentos. Digamos que hay documentos A y B.

Así que quiero borrar las palabras que el documento A que no está en el documento B.

Ejemplo 1 :

R: Me comer pizza

B: Ella va al mercado y comer pizza

Resultado: comer pizza

ejemplo 2 : R: comer pizza

B: comer pizza

Resultado: Pizza (La palabra orden es relevante, por lo que "comer" se suprime.)

Yo uso de Perl para el sistema y las oraciones en cada documento no está en un gran número así que creo que no voy a utilizar SQL

Y el programa es un subproram ensayo para la clasificación automática para Indonesia Idioma (bahasa)

Gracias, Lo siento si mi pregunta es un poco confuso. Estoy muy nuevo en 'este mundo':)

¿Fue útil?

Solución

OK, estoy sin acceso en el momento por lo que no se garantiza que sea 100% o incluso compilar sino que debe proporcionar suficiente orientación:

Solución 1 : (orden de las palabras no importa)

#!/usr/bin/perl -w

use strict;
use File::Slurp;

my @B_lines = File::Slurp::read_file("B") || die "Error reading B: $!";
my %B_words = ();
foreach my $line (@B_lines) {
    map { $B_words{$_} = 1 } split(/\s+/, $line);
}
my @A_lines = File::Slurp::read_file("A") || die "Error reading A: $!";
my @new_lines = ();
foreach my $line (@A_lines) {
    my @B_words_only = grep { $B_words{$_} } split(/\s+/, $line);
    push @new_lines, join(" ", @B_words_only) . "\n";
}
File::Slurp::write_file("A_new", @new_lines) || die "Error writing A_new: $!";

Esto debería crear un nuevo archivo "A_new" que sólo contiene las palabras de A que están en en B.

Esto tiene un ligero error - que reemplazará cualquier espacio en blanco múltiple en un archivo con un solo espacio, por lo que

    word1        word2              word3

se convertirá

word1 word2 word3

Puede ser fijo, pero sería muy molesto para hacerlo, por lo que no nos molestó a no ser que a pesar de todo requerir que los espacios en blanco se conserva correctamente al 100%

Solución 2 : (asuntos de orden de las palabras pero puede imprimir palabras de fichero A con respecto no hay espacios en blanco para la conservación en absoluto)

#!/usr/bin/perl -w

use strict;
use File::Slurp;

my @A_words = split(/\s+/gs, File::Slurp::read_file("A") || die "Error reading A:$!");
my @B_words = split(/\s+/gs, File::Slurp::read_file("B") || die "Error reading B:$!");
my $B_counter = 0;
for (my $A_counter = 0; $A_counter < scalar(@A_words); ++$A_counter) {
    while ($B_counter < scalar(@B_words)
        && $B_words[$B_counter] ne $A_words[$A_counter]) {++$B_counter;}
    last if $B_counter == scalar(@B_words);
    print "$A_words[$A_counter]";
}

Solución 3 (¿por qué necesitamos Perl nuevo? :))

Se puede hacer esto trivialmente con cáscara y sin Perl (o por medio del sistema () llamada o acentos abiertos en los padres script de Perl)

comm -12 A B | tr "\012" " " 

Para llamar a esto desde Perl:

my $new_text = `comm -12 A B | tr "\012" " " `;

Pero ver a mi último comentario por qué esto puede ser considerado "malo Perl" ... al menos si lo hace en un circuito con muchos archivos que se itera y la atención sobre el rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top