我在制作PERL程序以匹配两个文档中的单词时有一个问题。假设有文档A和B。

因此,我想删除文档A中不在文档B中的单词。

示例1:

答:我吃披萨

B:她去市场吃披萨

结果:吃披萨

示例2:A:吃披萨

B:披萨吃

结果:披萨(订单一词相关,因此删除了“饮食”。)

我将perl用于系统,每个文档中的句子都不大,所以我想我不会使用sql

该计划是印尼语言自动散文评分(Bahasa)的次要条件(Bahasa)

thanx,对不起,如果我的问题有些混乱。我真的是“这个世界”的新手:)

有帮助吗?

解决方案

好的,我目前没有访问权限,因此不能保证这是100%甚至编译,但应该提供足够的指导:

解决方案1: :(单词顺序无关紧要)

#!/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: $!";

这应该创建一个新的文件“ a_new”,该文件仅包含B中的A单词。

这有一个微小的错误 - 它将用一个空间替换文件A中的任何多次空间,因此

    word1        word2              word3

会变成

word1 word2 word3

它可以修复,但是这样做真的很烦人,所以除非您绝对要求正确保留100%的空格,否则我不会打扰

解决方案2: :(单词顺序很重要,但您可以从文件中打印单词,而无需保留空格的问题)

#!/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]";
}

解决方案3 (为什么我们再次需要Perl?:))

您可以在没有perl(或通过system()呼叫或parent perl脚本中的system()呼叫或backticks的情况下,可以在shell中进行此操作)

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

从perl称呼:

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

但是,请看我的最后评论,为什么这可能会被视为“不好的perl” ...至少如果您在循环中进行此操作,并且有很多文件被迭代并关心性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top