设想你给一个文字处理程序输入了六个字:
研究生命起源
你想讨论生命从哪里来。程序处理完,交出的结果却是:
研究生/命/起源
生命起源还没研究,一位研究生先被分配了出来,旁边孤零零地站着一个“命”字。
程序没有漏字,也没有认错字。六个字按原顺序排着,问题只出在两道分隔线上。你希望它得到的是:
研究/生命/起源
这两种切法,足够让后面的处理走向不同方向。如果下一步是按词查翻译词典,程序拿着“研究生”去查,得到的就会是一个人的身份,原本表示动作的“研究”已经不在了。
计算机能够保存、显示每个汉字,为什么还会在这里出错?
因为认出有哪些字,与判断哪些字应该组成一个词,是两件事。要找出这位研究生怎么来的,得看看程序究竟按什么办法切词。
一、电脑收到的是字,工作却可能要按词做
中文平常不在每个词之间留空格。“研究生命起源”写在纸上,没人觉得少印了什么。但如果要求程序逐词查询、统计或翻译,它就必须确定:应该先取“研究”,还是先取“研究生”?
把连续文字划分成词的过程,就叫分词。
为什么不干脆一个字一个字处理?当然可以这样设计系统。但如果当前工作明确要按词进行,就不能把字和词混为一谈。查“生命”的意思,和分别查“生”“命”的意思,并不是同一次查询。两个字的解释堆在一起,也不会自动拼成一个词的解释。
在许多按词工作的传统中文处理系统中,分词因此处在前面的环节。后面的翻译程序即使十分认真,也可能认真地翻译一位原文里并不存在的研究生。错误已经装进了它收到的材料。2
这也解释了分词在这段技术史中的位置:它先为按词查询、统计等工作准备输入。后来的系统可以采用不同文本单位,但在眼前这个查词任务里,边界没定好,后续再精巧也可能先查错对象。
于是,一个很自然的方案出现了:既然要找词,给程序一本词典不就行了吗?
二、词典里都有,反而更难选了
继续这个设想。为了看清操作,我们给程序准备一份只收六个词的小词表:
研究、研究生、生命、命、起源、招生
再规定一条办法:从左往右处理,每到一个新位置,都选词表里能够匹配的最长词。选好后,跳过这些字,接着处理剩下的部分。若一个词也找不到,就暂时把当前这个字单独留下,再往后走。
这叫正向最大匹配。“正向”表示从左往右,“最大”指的是优先选择更长的匹配结果。它是词典分词中的一种经典办法。2
现在把“研究生命起源”交给它。
第一步,从“研”字开始查。词表里既有两个字的“研究”,也有三个字的“研究生”。按照最长优先,程序选中“研究生”。
第二步,剩下“命起源”。词表没有“命起源”或“命起”,但有“命”,于是取出“命”。
第三步,剩下“起源”,正好也在词表里。处理结束。
结果就是开头那位研究生。每一步都遵守了规则,没有一步检查整句话是不是还在讨论生命。
这种经典词典方法,把“找不到词界”的问题缩成了“在已有候选中按长度选一个”。它为什么值得采用?试试同一词表里的另一句话:
研究生招生
从左边选“研究生”,再选“招生”,这次就符合原意。较长的已知词有时确实应该保留完整,不能总把它拆散。最长优先给了程序一个明确、容易执行的选择办法,也省去了在每个位置反复比较整句切法的麻烦。
“研究生”在词典里合法,在“研究生招生”里也合适;到了“研究生命起源”里,它却占用了本该留给“生命”的那个“生”。一个词局部匹配成功,并不能保证后面仍然切得合适。
三、删掉研究生,问题也不会毕业
最直接的修补,是把“研究生”从词表里删除。
再按原规则处理“研究生命起源”:第一步只能选“研究”,接下来选“生命”,最后选“起源”。结果对了。
可是,再处理“研究生招生”,程序先取“研究”,剩下的“生”在词表里找不到,只好按约定单独留下,最后取“招生”。于是得到“研究/生/招生”。为了修好生命起源,我们把招生简章切坏了。
那就把“研究生命”整个收入词表,让它抢在“研究生”前面?程序确实会优先取出这四个字,但结果变成“研究生命/起源”。如果我们的目标是分出“研究”和“生命”这两个词,问题仍未解决。
这也说明,补词典和处理歧义承担着不同的工作。缺少一个新的人名、地名或专业词,可以考虑补进去;两个已知词争用同一个字,就还需要选择依据。
到这里,需要改变的是选择办法:保留“研究”和“研究生”两个候选,再寻找理由决定这里该选谁。后面的字、相邻词怎样搭配,都可能提供线索;但线索具体如何变成程序的决定,还需要另外设计,不能只对它说一句“结合上下文”。
真实研究也碰到了扩充词表之外的问题。1996 年,Wong 和 Chan 研究如何给识别后的文字分词时,把最大匹配和统计信息结合起来:先按词典切;遇到某些留下单字的情形,再比较相邻片段的其他组合。原先一次定下来的切法,获得了局部复查的机会。1
这不是说见到单字就该重切。“命”可以独立成词,“生”也可以出现在别的表达里。单字在那种方法中是触发复查的线索,选择结果还要依靠它使用的统计依据。只换成“尽量别留下单字”,也不过是把最长优先换成了另一条可能误判的规则。
我们的两个例句说明了为什么需要额外依据,却不能证明某一种后续方法已经解决了所有歧义。词典还可以继续使用,只是词长不该独自决定每一次切分。
四、两种切法,也可能指着同一个人
还有一种分歧,不能全算在程序头上。2003 年的首届国际中文分词评测报告指出,研究者使用着不同的切分标准;报告还提到,此前国内评测中,“毛/泽东”与“毛泽东”都曾被允许作为结果。前者把姓和名分开,后者保留整个人名。3
人还是同一个人,词的边界却不同。这与把“生命”里的“生”挪给“研究生”有区别:一边是采用何种标注约定,一边是在本篇指定含义下切坏了词。要比较程序,先得说明目标切法遵循什么标准。2003 年那次国际评测就分别按对应标准严格评分,不能遇到错误再临时换一套答案。3
分词开始接受共同评测时,问题也从“这次切得顺不顺眼”,变成了“按事先约定的目标,能处理多少未见过的文本”。否则,研究生刚被误切出来,程序又替自己改了评分标准,招生与毕业一条龙办理,错误反倒无处登记。
回到开头,那位研究生是被“最长优先”的规则切出来的。词典给了程序候选,规则替它过早作了决定;删词能救回一句生命起源,却又损坏了招生简章。要处理这种冲突,程序还得利用词长之外的依据。
即使我们已经得到“研究/生命/起源”,翻译也只拿到了准备好的材料。这三个词该选什么译法、怎样排列,又是下一道问题。
研究生可以留在招生简章里了。翻译程序还不能下班。
参考资料
- Pak-kwong Wong、Chorkin Chan,Chinese Word Segmentation based on Maximum Matching and Word Binding Force,1996,COLING。论文全文
- Nianwen Xue(薛念文),Chinese Word Segmentation as Character Tagging,2003,Computational Linguistics and Chinese Language Processing。论文全文
- Richard Sproat、Thomas Emerson,The First International Chinese Word Segmentation Bakeoff,2003,SIGHAN。评测报告全文