Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中匹配两个文档之间的字符串顺序?_Perl_Textmatching - Fatal编程技术网

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

如何在Perl中匹配两个文档之间的字符串顺序?,perl,textmatching,Perl,Textmatching,我在制作一个PERL程序来匹配两个文档中的单词时遇到了一个问题。假设有文件A和B 所以我想删除文档A中不在文档B中的单词 示例1: 我吃比萨饼 她去市场吃比萨饼 结果:吃比萨饼 示例2: 吃比萨饼 吃比萨饼 结果:比萨饼 (词序是相关的,因此“eat”被删除。) 我在系统中使用Perl,并且每个文档中的句子数量不多,所以我想我不会使用SQL 该程序是印度尼西亚语(Bahasa)自动论文评分的子程序 Thanx, 对不起,如果我的问题有点混乱。我对“这个世界”真的很陌生:)好的,我现在没有访问权限

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

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

示例1

我吃比萨饼

她去市场吃比萨饼

结果:吃比萨饼

示例2: 吃比萨饼

吃比萨饼

结果:比萨饼 (词序是相关的,因此“eat”被删除。)

我在系统中使用Perl,并且每个文档中的句子数量不多,所以我想我不会使用SQL

该程序是印度尼西亚语(Bahasa)自动论文评分的子程序

Thanx,
对不起,如果我的问题有点混乱。我对“这个世界”真的很陌生:)

好的,我现在没有访问权限,所以这不能保证100%甚至可以编译,但应该提供足够的指导:

解决方案1:(词序不重要)

这将创建一个新文件“a_new”,其中只包含a在B中的单词

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

    word1        word2              word3
将成为

word1 word2 word3
它可以被修复,但这样做会很烦人,所以我不想麻烦,除非你绝对要求保留100%正确的空白

解决方案2:(字序很重要,但您可以将文件A中的单词打印出来,而无需考虑保留空格)

要从Perl调用此函数,请执行以下操作:

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

但是请看我最后的评论,为什么这可能被认为是“糟糕的Perl”。。。至少在循环中执行此操作时,需要迭代很多文件并关心性能。

好的,我刚刚看到了第二个示例,并将尝试解决此问题。。。如果词序很重要的话,这种方式会有点复杂。3.很抱歉进行了编辑。自从我第一次使用Perl以来,这有点让人困惑,但非常感谢您的回复:)@兰迪-请看我在评论中的问题。你真的关心常用词是如何输出的吗?不,如果问题是关于行的,我已经做了,所以文档只有一行。嗯..句子中的常用词或停止词已经删除,所以只剩下重要的词了。你关心词序吗?例如,你是否关心示例2中的结果是否为两行,并在两行上分别显示“吃”和“比萨饼”字样?不,我这样做是为了使所有内容都在同一行上。到目前为止,你做了多少?你对哪一部分有困难?如果我错了,请纠正我,但你似乎是在用这个来确定论文之间的匹配程度。@Zaid-这也是ny猜测:)
#!/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]";
}
comm -12 A B | tr "\012" " " 
my $new_text = `comm -12 A B | tr "\012" " " `;