此处的假设是:词头已经整理格式化完成,需要对里面的英文词头进行校对。
英文词头的错误可能有很多方面造成,例如:识别的错误、制作中引入的错误、输入的错误、源数据的错误等等,我们现在的任务是:把这此错误找出来,并验证其正确性。
首先,你需要一个什么样的校对方式?或者说你理想中的校对方式是个什么样的?
阐述一下我的:
- 相似的错误能聚在一起
- 错误的单词在上,原文在下
- 每个错误与错误之间采用适当间距,浏览舒适
- 相似错误之间要能快速区分
- 相似错误之间要能快速找出
- 找到错误后,能快速定位源件,方便修改
要求很简单,下面就是怎样去实现这些需求了。
- 针对5,这个可用正则
- 针对4,如果不是自已编写的话,需编辑器支持
- 针对6,需要对整个文件夹并且所有文件内容进行搜索
- 针对1,2,3,采用啥方式?编个程序?能力不太够。txt 文本文件最简单,就选它,如何实现?整个脚本就行
文本处理嘛,正则这个是毕需的,后面所有的工具都需要支持正则。对于一般的图型界面类软件,支持一般的正则表达式就可以了,正则的高级功能,GUI反倒成为阻碍,编程里用更加顺畅。那么正则处哪家强?这次不到同东找监翔,该轮到老当益壮的Perl登场了。
Perl的正则和文本处理能力,是其它编程语言所不能比拟的,就四个词来形容:简单、方便、快捷、强大!
针对4
编辑器的选择,推荐 Kate
sudo apt install kate
先中后,同一个相同的词会进行高亮,里面的搜索,Perl中的正则大部分都可以直接用
针对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 作的交互,费时较多,几万词头,全过一遍,需要几分钟。
最后效果大体如此:
现在把这些准备工作完成了,剩下的呢?便是漫漫长路了。
现把这些分享出来,与诸君共勉!
各位有更好的工具或建议,欢迎交流、指正。