词头校对交流

此处的假设是:词头已经整理格式化完成,需要对里面的英文词头进行校对。

英文词头的错误可能有很多方面造成,例如:识别的错误、制作中引入的错误、输入的错误、源数据的错误等等,我们现在的任务是:把这此错误找出来,并验证其正确性。

首先,你需要一个什么样的校对方式?或者说你理想中的校对方式是个什么样的?

阐述一下我的:

  1. 相似的错误能聚在一起
  2. 错误的单词在上,原文在下
  3. 每个错误与错误之间采用适当间距,浏览舒适
  4. 相似错误之间要能快速区分
  5. 相似错误之间要能快速找出
  6. 找到错误后,能快速定位源件,方便修改

要求很简单,下面就是怎样去实现这些需求了。

  • 针对5,这个可用正则
  • 针对4,如果不是自已编写的话,需编辑器支持
  • 针对6,需要对整个文件夹并且所有文件内容进行搜索
  • 针对1,2,3,采用啥方式?编个程序?能力不太够。txt 文本文件最简单,就选它,如何实现?整个脚本就行

文本处理嘛,正则这个是毕需的,后面所有的工具都需要支持正则。对于一般的图型界面类软件,支持一般的正则表达式就可以了,正则的高级功能,GUI反倒成为阻碍,编程里用更加顺畅。那么正则处哪家强?这次不到同东找监翔,该轮到老当益壮的Perl登场了。

Perl的正则和文本处理能力,是其它编程语言所不能比拟的,就四个词来形容:简单、方便、快捷、强大!

针对4

编辑器的选择,推荐 Kate

sudo apt install kate

先中后,同一个相同的词会进行高亮,里面的搜索,Perl中的正则大部分都可以直接用
image

针对6

全文搜索,推荐 Kfind ,不过没法用正则,想要用正则进行文件名和全文内容的搜索,直接用文件管理器 Dolphin 即可,不过在校对中,已经确定了错误,只需定进入源文件修改就行,此时,需要的是精确搜索,正则已派不上用场。

针对1,2,3

现需要的是把所有可能的错词给筛选出来,并进行格式化。

筛选错词,推两个工具,Aspell 和 Hunspell

sudo apt install aspell aspell-en
sudo apt install hunspell hunspell-en-us

具体用哪个,按个人喜好。利用此,筛选出错词并进行格式化的 Perl 程序如下:

my $line;
my $new_content="检查\n\n\n";

my $error_words;

my $error_words_A=""; #全小写
my $error_words_ABC=""; #首字母大写
my $error_words_a=""; #全大写

my @words_A;
my @words_ABC;
my @words_a;

my $my_i=0;

open my $handle, '<', "./m_词头.txt" or die $!;
while ( $line = <$handle>) {
    $error_words="";
    
    if ( $line eq "\n"){
    next;
    }
    
    #使用 aspell 检查
    #$error_words=qx(echo "$line" | aspell list);
    ##使用 hunspell 检查
    $error_words=qx(echo "$line" | hunspell -l);
    if ($error_words ne "") {
        $error_words =~ s/^(.+)\n(\1\n)+/${1}\n/mg;
        $error_words =~ s/\n/ /mg;
        if ($error_words =~ m/^[A-Z].+ ?$/m ) {
            if ($error_words =~ m/^[A-Z]+ ?$/m){
                $error_words_ABC=$error_words_ABC.$error_words."「」".$line."\n\n";
                $my_i++;
            }else{
                $error_words_A=$error_words_A.$error_words."「」".$line."\n\n";
                $my_i++;
            }
             
        }else{
            $error_words_a=$error_words_a.$error_words."「」".$line."\n\n";
            $my_i++;
        }
    }
}
close $handle;

#删除换行
$error_words_A =~ s/\n\n+/\n/g;
$error_words_ABC =~ s/\n\n+/\n/g;
$error_words_a =~ s/\n\n+/\n/g;

#字符串转数组,排序
@words_A = split(/\n/,$error_words_A);
@words_ABC = split(/\n/,$error_words_ABC);
@words_a = split(/\n/,$error_words_a);

@words_A=sort(@words_A);
@words_ABC=sort(@words_ABC);
@words_a=sort(@words_a);

#数组转字符串
$error_words_A = join( "\n", @words_A );
$error_words_ABC = join( "\n", @words_ABC );
$error_words_a = join( "\n", @words_a );

#恢复文本格式
$error_words_A =~ s/^(.+)「」(.+)$/${1}\n${2}\n\n\n/mg;
$error_words_ABC =~ s/^(.+)「」(.+)$/${1}\n${2}\n\n\n/mg;
$error_words_a =~ s/^(.+)「」(.+)$/${1}\n${2}\n\n\n/mg;

$new_content=$error_words_a."\n\n".$error_words_A."\n\n".$error_words_ABC;

open(FH, '>', "./z-words.txt") or die "Could not open file $_ because $!";
print FH $new_content;
close FH;

后面了解到,Hunspell 已经提供了Perl内部的调用,上面这个是与 shell 作的交互,费时较多,几万词头,全过一遍,需要几分钟。

最后效果大体如此:
image


现在把这些准备工作完成了,剩下的呢?便是漫漫长路了。

现把这些分享出来,与诸君共勉!

各位有更好的工具或建议,欢迎交流、指正。

6 Likes

我的一个简单经验:
1、启用拼写检查(在Vim里可以定义合适的词库),逐个找出可能有误的词汇(在Vim里可以定义快捷键快速导航上下条)。
2、调取词典软件采用多词典联合查询该词汇(在Vim里可以定义相应快捷键快速查询)。
3、人工判断并修正。

案例:

自定义词库的话对专业领域的校对就比较友好了,通用的检查,对一些专业单词会误杀