中科院软件所 张俊林
2005年11月
拼写检查错误提示是搜索引擎都具备的一个功能,也就是说用户提交查询给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误,对于中文用户来说一般造成的错误是输入法造成的错误.那么我们就来分析看看百度是怎么实现这一功能的.
我们分析拼写检查系统关注以下几个问题:
(1)系统如何判断用户的输入是有可能发生错误的查询呢?
(2)如果判断是可能错误的查询输入,如何提示正确的词汇呢?
那么百度是如何做的呢?百度判断用户输入是否错误的标准,我觉得应该是查字典,如果发现字典里面不包含这个词汇,那么很有可能是个错误的输入,此时启动错误提示功能,这个很好判断,因为如果是一个正常词汇的话,百度一般不会有错误提示,而你故意输入一个词典不可能包含的所谓词汇,此时百度一般会提示你正确的检索词汇.
那么百度是怎么提示正确词汇的呢?很明显是通过拼音的方式,比如我输入查询” 制才”,百度提供的提示词汇为: “:制裁 质材 纸材”,都是同音字.所以百度必然维持着一个同音词词典,里面保留着同音词信息,比如可能包含着下面这条词条: “ zhi cai à制裁,质材,纸材”,另外还有一个标注拼音程序,现在能够看到的基本流程是: 用户输入” 制才”,查词典,发现没有这个词汇,OK,启动标注拼音程序,将” 制才”标注为拼音”zhi cai”,然后查找同音词词典,发现同音词” 制裁,质材,纸材”,那么提示用户可能的正确拼写.
整体流程看起来很简单,但是还有一些遗留的小问题,比如是否将词表里面所有同音词都作为用户的提示信息呢?比如 某个拼音有10个同音词,是否都输出呢?百度并没有将所有同音词都输出而是选择一定筛选标准,选择其中几个输出.怎么证明这一点?我们看看拼音”liu li”的同音词,紫光输入法提示同音词汇有” 流丽 流离 琉璃 流利”4个,我们看看百度返回几个,输入”流厉”作为查询,这里是故意输入一个词典不包含的词汇,这样百度的拼写检查才开始工作,百度提示: "琉璃 刘丽 刘莉 ",这说明什么?说明不是所有同音词都输出,而是选择输出,那么选择的标准是什么?我能够猜测到的方法是对于用户查询LOG进行统计,提取用户查询次数多的那些同音词输出,如果是这样的话,上面的例子说明用户搜索”琉璃”次数比其它的都要高些,次之是” 刘丽”,再次是” 刘莉”,看来大家都喜欢查询自己或者认识的人的名字.
另外一个小问题:同音词词典包含2字词,3字词,那么是否包含4字词以及更长的词条?是否包含一字词? 这里一字词好回答,不用测试也能知道肯定不包含,因为你输入一个字,谁知道是否是错误的呢?反正只要是汉字就能在词表里面找到,所以没有判断依据.二字词是包含的,上面有例子,三字词也包含,比如查询 "中城药"百度错误提示:”中成药”,修改查询为"重城药",还是提示”中成药” ,再次修改查询 "重城要",百度依然提示”中成药”. 那么4字词汇呢?
百度还是会给你提示的,下面是个例子:
输入:静华烟云 提示 京华烟云
输入 静话烟云 提示 京华烟云
输入 静话阎晕 提示 京华烟云
那么更长的词汇是否提示呢?也提示,比如我输入: "落花世界有风军",这个查询是什么意思,估计读过古诗的都知道,看看百度的提示”落花时节又逢君”,这说明什么?说明同音词词典包含不同长度的同音词信息,另外也说明了百度的核心中文处理技术,也就是那个词典,还真挺大的.
但是,如果用户输入的查询由两个或者两个以上子字符串构成,那么百度的错误提示功能就罢工了,比如输入查询"哀体",百度提示”艾提 挨踢”,但是.输入为 "我 哀体",则没有任何错误提示.
还有一个比较重要的问题:如果汉字是多音字那么怎么处理?百度呢比较偷懒,它根本就没有对多音字做处理.我们来看看百度的一个标注拼音的错误,在看这个错误前先看看对于多音字百度是怎么提示错误的,我们输入查询"俱长",百度提示”剧场 局长”, “俱长”的拼音有两个:”ju zhang /ju chang” ,可见如果是多音字则几种情况都提示..现在我们来看看错误的情况, 我们输入查询”剧常”,百度提示”:剧场 局长”,提示为”剧场"当然好解释,因为是同音字,但是为什么 "局长"也会被提示呢?这说明百度的同音字词典有错误,说明在”ju chang”这个词条里面包含”局长”这个错误的同音词.让我们顺藤摸瓜,这个错误又说明什么问题呢?说明百度的同音词典是自动生成的,而且没有人工校对.还说明在自动生成同音词典的过程中,百度不是根据对一篇文章标注拼音然后在抽取词汇和对应的拼音信息获得的,而是完全按照某个词典的词条来标注音节的,所以对于多音字造成的错误无法识别出来,如果是对篇章进行拼音标注,可能就不会出现这种很容易发现的错误标注. 当然还有另外一种解释,就是"局长"是故意被百度提示出来可能的正确提示词汇,因为考虑到南方人"zh'和 "ch"等前后鼻音分不清么,那么是这样的么?我们继续测试到底是何种情况.是百度有错误还是这是百度的先进的算法?
我们考虑词汇"长大",故意错误输入为"赃大",如果百度考虑到了前后鼻音的问题,那么应该会提示"长大",但是百度提示是"藏大".这说明什么?说明百度并没有考虑前后鼻音问题,根本就是系统错误. 我们输入查询"悬赏",故意将之错误输入为"悬桑",没有错误提示,说明确实没有考虑这种情况.前鼻音没有考虑,那么后鼻音考虑了么,我们输入”:经常”,故意改为后鼻音 "经缠",百度提示为"经产 经忏",还是没有考虑后鼻音.这基本可以确定是百度系统的错误导致.
根据以上推导,我们可以得出如下结论:百度是将分词词典里面每个词条利用拼音标注程序标注成拼音,然后形成同音词词典,所以两个词典是同样大的,而且这个词典也随着分词词典的增长而在不断增长. 至于标注过程中多音字百度没有考虑,如果是多音字就标注成多个发音组合,通过这种方式形成同音词词典.这样的同音词词典显然包含着很多错误.
最后一个问题:百度对于英文进行拼写检查么?让我们试试看,输入查询”china”,不错,搜到不少结果,专注中文搜索的百度还能搜索到英文,真是意外的惊喜.变换一下查询”chine”,会更加意外惊喜的给我们提示”china”吗?百度提示的是: 吃呢 持呢,原来是不小心触发了百度的拼音搜索功能了.那么拼音搜索和中文检查错误是否采用同一套同音词词典呢,让我们来实验一下,搜索”rongji”,百度提示” 榕基 溶剂 容积”,OK,换个中文查询”容机”,百度提示” 榕基 溶剂 容积”,看来使用的是同一套同音词词典.也就是说百度的中文纠错和拼音检索使用的机制相同,中文纠错多了一道拼音注音的过程而已.难道这就是传说中那个百度的”事实上是一个无比强大的拼音输入法”的拼音提示功能么?
最后让我们总结归纳一下百度的拼写检查系统:
后台作业: (1)前面的文章我们说过,百度分词使用的词典至少包含两个词典一个是普通词典,另外一个是专用词典(专名等),百度利用拼音标注程序依次扫描所有词典中的每个词条,然后标注拼音,如果是多音字则把多个音都标上,比如”长大”,会被标注为”zhang da/chang da”两个词条.
(2)通过标注完的词条,建立同音词词典,比如上面的”长大”,会有两个词条: zhang daà长大” , chang daà长大.
(3)利用用户查询LOG频率信息给予每个中文词条一个权重;
(4)OK,同音词词典建立完成了,当然随着分词词典的逐步扩大,同音词词典也跟着同步扩大;
拼写检查:
(1)用户输入查询,如果是多个子字符串,不作拼写检查;
(2)对于用户查询,先查分词词典,如果发现有这个单词词条,OK,不作拼写检查;
(3)如果发现词典里面不包含用户查询,启动拼写检查系统;首先利用拼音标注程序对用户输入进行拼音标注;
(4)对于标注好的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;
(5)如果发现有词条,则按照顺序输出权重比较大的几个提示结果;
拼音提示:
(1)对于用户输入的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;
(2)如果发现有词条,则按照顺序输出权重比较大的几个提示结果;
引用:
http://www.cnblogs.com/wormday/archive/2008/01/17/286453.html
分享到:
相关推荐
Test::Pod::Spelling::CommonMistakes - 检查 POD 的常见拼写错误 版本 This document describes v1.001 of Test::Pod::Spelling::CommonMistakes - released October 31, 2014 as part of Test-Pod-Spelling-...
- 拼写:spelling - 表达:expression - 用法:usage - 词汇:vocabulary - 利用:make use of - 区别:differences 这些词汇和短语是高中一年级英语学习的重要组成部分,涵盖了基础语法、常用表达以及跨文化...
《多种解题技巧在POJ1035_Spelling Checker中的应用》 在编程竞赛领域,ACM(国际大学生程序设计竞赛)是一项备受瞩目的赛事,它要求参赛者在有限的时间内解决一系列复杂的算法问题。POJ(Problemset Online Judge...
通过为许多不同的拼写检查器提供统一的界面,您可以交换拼写检查器而无需进行大量重写。 使用PHP-Spellchecker可以消除供应商锁定,减少技术负担,并提高代码的可测试性。 特征 :face_with_monocle: 支持多种流行...
简单的可扩展工具,用于拼写检查 自述: English 支持的语言 英语 俄语 快速开始 安装: npm i spell-checker-js 代码 const spell = require ( 'spell-checker-js' ) // Load dictionary spell . load ( 'en' ...
- **拼写检查(Spelling Correction)**:自动纠正用户的拼写错误。 **3. 扩展与集成** - **Tika 文本提取**:使用 Apache Tika 提取文档中的文本,支持多种文件格式。 - **多语言支持**:Lucene 支持多种语言的索引...
- **背景介绍**:拼写检查可能会误报方法名缩写为错误,给开发者带来不必要的困扰。 - **操作步骤**: - 打开 `Windows > Preferences > General > Validation > Editors > Text Editors > Spelling`。 - 关闭拼写...
根据给定的文件标题、描述、标签以及部分内容,本文将详细介绍如何在Visual Basic(简称VB)环境中调用Microsoft Word进行拼写检查的功能实现方法。此技术对于那些希望在其应用程序中集成高级文本处理功能的开发者来...
该补丁主要解决,Mindmanger Spelling Checker Failure 错误修正(支持所有Mindmanger版本)。解决Mindmanger 文件换文件夹后不能正常打开的问题。
### 英文单词词根词缀(英文原版)Learningexpress.Vocabulary.Spelling.Success.4e.pdf #### 核心知识点解析 ##### 标题理解 - **标题**:“英文单词词根词缀(英文原版)Learningexpress.Vocabulary.Spelling....
- **拼写检查**:调用`check_spelling()`函数进行拼写检查。 - **文件关闭**:处理完成后关闭输入文件。 #### 3.2 辅助函数 - **字符串处理**: - `lower()`:将字符串转换为小写字母。 - `strip_punct()`:去除...
- spelling:名词,意为“拼写,拼法” - identity:名词,指“自身,身份” - fluently:副词,意为“流利地,流畅地” - frequent:形容词,意为“频繁的,经常的” - command:名词和动词,作为名词时意为...
- **Punctuation, Spelling and Grammar**:良好的语法和拼写可以使注释更加专业。 - **TODO Comments**:TODO注释用于标记待办事项,需要定期检查和更新。 - **Deprecation Comments**:废弃注释用于指示不再...
拼写校正 可以识别并修复拼写错误的拼写校正算法。如何安装? 要安装spelling-correction ,请转到图像中的Playground(Ctrl + OW)并执行以下Metacello脚本(选择它并按Do-it按钮或Ctrl + D): Metacello new ...
功能说明支持英文单词改正您可以快速确定当前单词的拼写是否错误可以返回最佳匹配结果您可以返回更正后的匹配列表,支持指定返回列表的大小错误消息支持i18n 支持大写和小写,全角和半角格式支持自定义词库支持基本...
- **Show Spelling & Grammar**: `⌘:` - **Check Spelling**: `⌘;` #### Design - **Show Model Browser**: `⌃⌘B` - **Diagram Bring to Front**: `⌃⇧⌘F` - **Diagram Bring to Back**: `⌃⇧⌘B` - **...
- **Punctuation, Spelling and Grammar**:注释中的标点符号、拼写和语法应正确无误。 - **TODO Comments**:待办事项注释应明确标注问题所在,并注明责任人。 - **Deprecation Comments**:废弃的代码或功能应有...
- **ispell**(interactive spelling checking):交互式的拼写检查工具。 - **jed**:一个功能丰富的文本编辑器。 - **joe**:一个简单的文本编辑器。 - **join**:将两个文件按列合并在一起。 - **look**:用于...
- **Punctuation, Spelling and Grammar**:注释中的拼写和语法应正确无误。 - **TODO Comments**:使用TODO注释标记未来需要改进的地方。 - **Deprecation Comments**:对于废弃的代码或功能,应在注释中进行说明。...
"spelling-0.9.3-py3-none-any.whl" 是一个针对Python的特定版本(Py3)设计的库,名为"spelling",版本为0.9.3。该库通常包含了一系列预编译的Python模块,用户下载后可以直接安装到自己的Python环境中,无需手动...