如何在Perl中的两个文档之间匹配字符串顺序?

时间:2010-05-24 00:59:10

标签: perl textmatching

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

所以我想删除文档A中不在文档B中的单词。

示例1

答:我吃披萨

B:她去市场吃披萨

结果:吃披萨

示例2 : - 答:吃披萨

B:披萨吃

结果:比萨 (单词顺序是相关的,因此删除“吃”。)

我使用Perl作为系统,每个文档中的句子不是很大,所以我想我不会使用SQL

该计划是印尼语(Bahasa)自动论文评分的子项目

感谢名单, 对不起,如果我的问题有点令人困惑。我对'这个世界'真的很新:)

1 个答案:

答案 0 :(得分:1)

好的,我目前无法访问,因此不保证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 :(单词顺序很重要但是你可以打印出文件A中的单词,而不考虑保留空格)

#!/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的情况下在shell中轻松地做到这一点(或者在父Perl脚本中通过system()调用或反引号)

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

从Perl调用它:

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

但是看到我的上一条评论为什么这可能被认为是“糟糕的Perl”......至少如果你在循环中执行此操作,并且迭代了很多文件并且关心性能。