Textpro在汉语文本处理中的应用

xujiajin

管理员
Staff member
#1
http://www.pkucn.com/viewthread.php?tid=176875&extra=page%3D1
TextPro四篇

第一篇:佛经整理添利器 文本专家显身手
第二篇:简繁非对称转换 交互式逐词核选
第三篇:正则表达式替换 中英文分项匹配
第四篇:外部自定义替换 新功能扩展无限

自转用Windows XP以来,一直为中文内码转换和简繁转换烦恼,原因是很多旧文件并非采用Unicode编码。尽管通过区域语言选项(Regional and Language Options)的高级(Advanced)选项卡可以设置非Unicode语言,但只能在Chinese(PRC)或Chinese(Taiwan)做出选择,不能同时兼顾GB和Big5。

中文内码转换还说好办,因为从Windows 2000可以找到中文转码器(Chinese Code Converter)来完成Unicode、GB和Big5三者之间的转换,最不济记事本(Notepad)在保存文件时指定ANSI或Unicode编码也可完成基本转换。比较棘手的是简繁转换,中文转码器所提供的简繁转换属于简单的一对一转换,而不考虑一对多转换。

当然,处理这方面工作的最理想工具非Word莫属了,但似乎有杀鸡用牛刀之嫌。且不说Word个头大、价格高,一般英文版也不提供中文校对工具(Proofing Tools),而简繁转换属于中文校对工具的功能之一。

在网上曾看过一些简繁转换工具介绍,只有小部分做得比中文转码器稍好一点点,但也就这个水平了。尽管当时也看到TextPro这个工具,却发现由佛教网站“菩提树”(后为“中华佛典宝库”)所开发,以为不过尔尔。去年(2004)终于在佛友的推荐下下载试用,不禁惊为天人,大有“众里寻他千百度”之叹。


正则表达式替换
中英文分项匹配

1998年TextPro从原本是网页文本处理的小工具发展起来,1999年进入版本频繁升级时期,从2.1版到4.3版陆续

增加了GBK繁转简、文件合并、文件比较等功能。踏入2000年迎来了5.0测试版,主要增加了GBK简转繁、GBK转

Big5+、正则表达式、自定义替换、自动合并文件等功能,总体功能多达20项。

2003年推出的5.1版解决了TextPro在Windows NT/2000/XP英文版运行的问题,至此TextPro的开发告一段落。

一般用户对于上述所提的功能都不会感到陌生,但听过正则表达式的人相信不多。最早在Unix实现的正则表达

式(regular expression)并非一门专用语言,主要用在基于文本的编辑器和搜索工具,是文件或字符查找和

替换文本的一种标准。TextPro所提供的正则表达式的搜索引掣是在Henry Spencer的源代码基础上,经过大量

的增补而完成的,尤其是增加对双字节字符的支持。值得一提的是Perl所引用的正则表达式也同样来源于Henry

Spencer,较后广泛应用于Python、PHP、Apache乃至Java、VB和.NET。

我们在处理文本时,经常会遇到一些具有某种特定格式或者满足某种规则的文本。如果某个字符串满足正则表

达式指定的规则,则称该字符串为正则表达式的一个“匹配串”。由于TextPro推出自创的支持双字节的正则表

达式,因此可匹配GBK字集、Big5字集以及中文数字、天干地支等。经过适当的组合,可以完成的查找替换功能

几乎是无限的。

下面让就我们通过示例来掌握正则表达式的应用。

例一:我们要把一个汉字后附有编号的文本段(图1)替换成每个汉字独占一行,去掉等号、编号和标点,添加

括号,括号中重复该汉字(图2)。


图片附件: Txtpro31.gif (2006-6-15 13:24, 23.8 K)
首先我们从编辑菜单选择替换或点击工具栏上的替换按钮,打开替换对话框(图3)。在查找项填入:

(\c)=\d*\P

在替换项填入:

\1(\1)\n

注意要选中“忽略大小写”和“正则表达式”,然后点击开始替换按钮就大功告成了。


这里,我们主要应用了通配符。通配符是正则表达式的一个结构类型,即重复操作,其中“\c”是指匹配任意

汉字(不包括符号),“\d”是指匹配任意数字,“\P”是指匹配全角标点符号。

至于括号和星号,前者是将匹配到的内容供后面引用,后者则表示前一字符重复匹配0或多次。替换项里的“\1

”即引用匹配到的内容,括号是插入的内容,而“\n”表示插入换行符。

例二:有一个从“输入法生成器”反编译出来的拼音码表,其中有单字的拼音,也有词组的拼音(图4)。现在

希望把单字的拼音和词组的拼音分开。文件的格式是每行一个字或词组,行首是汉字或词组,其后紧跟拼音。
这里将用到正则表达式所定义的一个特殊符号、两个通配符、一个重复指示符和一个替换表达式:

特殊符号^:匹配行首。例如,“^他”匹配出现在行首的“他”字。

通配符\c:匹配任意汉字。

通配符\~f:匹配任意单字节字符。参考\f:匹配任意双字节字符(汉字或全角符号)。

重复指示符+:表示前一字符至少匹配一次。

替换表达式\d:向后删除一个字符。(注意:不要与匹配任意数字的通配符\d相混。)

操作办法:用替换功能,查找“^\c\c+\~f+”,替换为“\d”,就得到了一份单字的拼音表,另存为“单

字.txt”。按Ctrl+Z (Undo)撤消刚才的操作,再用替换功能,查找“^\c\~f+”,替换为“\d”,就得到了

词组的拼音表,可另存为“词组.txt”。

分析:“^\c\c+\~f+”匹配行首以汉字开头,跟着一个以上的汉字,再跟着一个以上任意半角字符的行,也就

是所有的词组行,替换为“\d”把这些行删除,得到的是单字的拼音表;“^\c\~f+”匹配以一个汉字开头,紧

跟着一个以上任意半角字符,这些正好是单字的拼音行,删除后即得词组的拼音表。

同理,如果把单字去掉后,用查找“^\c\c\c+\~f+”替换为“\d”,将只保留双字词组。要在汉字和编码之间

插入空格,则只需用“^\c+”替换为“\0 ”(注意:0后面跟空格)即可。

在网上论坛看到很多有关于码表格式的转换,主要是从Windows码表格式先字词后编码转换成其他码表格式先编

码后字词,结果无不动用Excel等软件而大费周章,最后由阿门大师(AhMan)放出一个码表格式转换程序
(http://input.foruto.com/compare/utility/FORMcon.htm)一举解决此类问题。其实如果用TextPro来完成

这项工作最合适(图5)。


也许掌握正则表达式最难的地方就是记忆特殊符号、通配符、重复指示符等等,令人惊喜的是TextPro已经考虑

到这一点,用户在替换对话框中点击查找项后面的按钮,即可打开正则表达式构造器(图6),再也不会对正则

表达式感到无从下手了。
一般文本编辑器甚至专业文字处理软件所提供的模糊查找仅仅对半角字符、数字、字母有效(图7),不具备识

别汉字和全角字符的能力。TextPro支持双字节的正则表达式无疑为中文文本处理带来了极大突破,使我们对中

英文字符更加操控自如。

外部自定义替换
新功能扩展无限

TextPro可以说是每一位文字工作者不可缺少的工具,几乎包含了处理文字资料所需要的全部功能。有了

TextPro,用户很快就能把文字歪歪斜斜、全角半角、简繁混合的文章在瞬间整理好。难怪有文学网站指定投稿

者必须用TextPro来发表文章。

如今利用扫描仪自动输入印刷体文本已不是什么新鲜事,但经过光学字符识别(OCR)出来的文字难免出现许多

空格和换行。在TextPro处理这些文本时,只需点击工具栏上的“删除半角字符”和“删除换行”两个按钮,即

刻把多余的空格和换行清除干净。当然,事先我们必须在设置菜单里的有关选项中分别选中“删除连续空格”

(图1)和“连续两个换行保留”(图2)。
也许我们会发现TextPro众多的出色功能得益于其支持双字节的正则表达式,那么它是否让我们自定义功能来加

强处理能力呢?答案是肯定的,那就是TextPro提供的自定义替换功能。所谓自定义替换,其实是一张替换表,

表中把某个字符串对应转换为另外一个字符串,比如把汉字转换为拼音。TextPro允许定义多达10张替换表。

替换表是一个文本文件,每一行指定一个转换关系。行由两栏组成,栏与栏之间用一个(或多个)空格(或Tab

)分开。第一栏是源字符串,第二栏是目标字符串。如果源串或目标串中需要包含空格,可以把串用半角的单

引号或双引号括起来。

替换表中最好不要有重复的源串。如有重复,TextPro只取最后出现的那对转换关系。

【例一】

目标:要求替换汉语拼音中用数字作为调号的韵腹(表1)。
首先,准备替换表Biaodiao.txt(图3),然后安装替换表:点击设置菜单中的自定义替换表,选择空白行,点

击“文件”按钮(图4),选中“Biaodiao.txt”,点击“命名”按钮,输入“标调”(图5),点击“退出”

按钮结束。

接下来,在文本区输入“nan2 yang2 shang1 bao4 zi1 xun4 wang3”,选择编辑菜单中的自定义替换,可以看

到下级菜单中有一项功能被开启了,菜单项的名称就是刚才给替换表起的名称“标调”(如果没有起名称,默

认的菜单名称是“自定义替换n”,其中n是0~9的数字,n为0表示第10张替换表)。选择这项功能,将把出现

在当前文件中的所有源串按替换表替换为目标串“nán yáng shāng bào zī xùn wǎng”。

【例二】

目标:OCR输出的文本往往含有重复的错误须纠正如下:

「→“
」→”
『→‘
』→’
.→?

我们只需准备一张含上述替换内容的替换表Biaodian.txt,通过设置菜单添加该替换表并命名为“标点”,从

编辑菜单调出自定义替换“标点”,即可轻松完成标点替换。

TextPro也支持批量正则表达式的替换表功能。正则表达式替换表的格式跟自定义替换表差不多,只不过用的是

正则表达式,其中首字符为“#”或“%”(要顶格写)作为注释行处理。TextPro附带的去除HTML标志的正则替

换表(remove_html_tags.txt),其功能与转换菜单中的删除置标符是一样的。使用时先在设置菜单下选择批

量正则替换表,然后在编辑菜单下选择批量正则替换即可。

有时候,上述简单的自定义替换功能是不够的。例如,用户可能希望只把出现在括号内的源串替换为目标串。

这种文本处理可以通过在替换中使用自定义替换表来解决。

在替换功能中,使用自定义替换表的替换函数是\Tn,其中n是0~9的数字(与上同)。如果略去n,其效果相当

于\T1,即使用第一张替换表。

例如要把所有放在方括号中的汉字替换为拼音(事先要准备一张汉字拼音对照表,并设置为第3张自定义替换表

),可以查找“\[(\c)\]”,替换为“\T3{\1}”,即把第一个子表达式的匹配内容按自定义替换表转换。如果

\T函数的参数不在替换表的源串中,\T函数的结果与源串相同,即不做任何变换。

有些情况下,用户可能希望只使用替换表的一部分内容。以汉字替换为拼音为例,替换表中包含了拼音的音调

,如果在替换时不希望加上这些数字音调,可以使用“过滤”功能。所谓过滤,其实是用一个正则表达式去分

析替换表的目标串,并把其中的某个子表达式取出来。

使用“过滤”时,在设置自定义替换表对话框中点击“过滤”按钮,在弹出的对话框中填入一个正则表达式(

图6)。以汉字替换为拼音为例,表达式可以写为“(\a+)(\d?)”,其中第一对括号中是不含音调的拼音,第二

对括号是音调(可有可无)。在调用\T函数时,TextPro会在目标串中查找这个正则表达式。但是如何把其中的

子表达式取出来呢?\T函数还有一个可选的下标,取第n个子表达式的值就写作\T{...}[n]。所以,把放在方括

号中的汉字替换为不带调的拼音,可以查找“\[(\c)\]”,替换为“\T3{\1}[1]”。
 
顶部