中文分词和搜索引擎(二)
作者:Winter 工程师
中文分词的算法
中文分词技术的研究,已经有几十年的历史了,在20世纪80年代,我国就有人开始研究如何用计算机来自动分词。如何让机器去识别语言中最小的语意单位,不是一件很容易的事情。
如何进行分词?对于程序员来说,最容易想到的办法是,用一个大词典,把所有的词都存入词典中,扫描输入的文本,查找所有可能的词,然后看哪个词可以做为输出。例如:
输入文本: 我是学生
词: 我/是/学生
其实这样做了以后,可以解决60%的问题。总结起来,分词的算法分为:
1. 基于字符串匹配的分词方法
2. 基于理解的分词方法
3. 基于统计的分词方法
关于这3种算法的详细介绍,可以查看中文分词技术,我这里想介绍的是,如何处理新词。
新词,术语是"未登录词",就是那些没有收入到词典里面的词。新词主要包括:人名、地名、机构名、热点新名词等。例如:2003年之前,没有人知道"非典"。"非典"刚出现的时候,这就是新词。还有"超女", "三个代表","芙蓉姐姐"。识别新词的能力是评估一个分词系统的重要指标。在国际上每年进行的分词大赛中,识别新词的比赛也单独提出。2006年SIGHAN的分词大赛中,就增添了对于机构名识别的比赛。
如何识别新词成为最近几年分词技术研究的重点。总结起来,无非分成两种:
1. 基于规则的方法。
2. 基于统计、机器学习。
拿人名识别为例。你不可能把所有的人名都放入词典中,这决定了人名注定会是新词。从人名构造来说,很有规律:姓+名。张王刘李陈、天下一半人。也就是说可能有一半的人,是这五个姓。名也有一定规律:建华/建国/志强.....等有许多经常用于名字中的汉字;对于地名识别也可以找出很多规则,省/县/村/镇/湾/河等,都是很常用的后缀,如果他们出现,之前出现地名的可能性比较大。如果把这些规律转化成计算机能识别的算法,就是基于规则的算法。这种基于规则的算法简单有效,而且发现规则可很方便加入。
规则总会有例外,规则过多以后,如何去权衡这些规则,会是十分头疼的问题。人们试着告诉计算机目标,让计算机自己去尝试各种方法组合这些规则并得到最优参数,这就机器学习。随着Machine Learning(机器学习)技术的不断进步,其应用范围也越来越广,中文分词算法也从中受益。ANN(人工神经网络), 最大熵模型, HMM(隐马尔可夫模型)等算法都在新词识别中有应用。通过机器学习识别新词的原理并不复杂。一般都是先定义一些特征,然后利用训练语料进行学习,建立模型。还是以人名识别为例,可以定义姓名前面的字、姓、名、姓名后面的字做为特征,通过利用标注好姓名的语料库进行学习训练。
机器学习识别新词的好处在于自动寻找一些识别新词的特征,其准确度和召回率都能达到比较高的水平。但机器学习算法需要有足够多的训练语料,人工准备准确的大规模的训练语料也会十分困难。另外,机器学习算法一般速度会比较慢,优化速度,使之用于海量数据处理,也是使用机器学习的一个关键点。
发表于:2006年07月21日 9:53 | 全文 | | |
网友评论
to urc999,
已经收到,挺好的想法,给你回复mail了,回头详细交流。
thanks
winter
发布者:winter - 2006年12月08日 18:42
Winter,向你的邮箱winter_lb@yahoo.com.cn 发了一篇有关中文新词识别的文章,不知道收到没有?
发布者:urc999 - 2006年12月08日 10:59
网页上‘随便聊聊’分词的很多,但都缺少数据。对我们程序员来说,程序就不好写了。。。
发布者:linuxping - 2006年09月04日 12:39
src大概讲的是"逆文本频率指数"吧!
发布者:老白 - 2006年08月06日 21:12
欢迎讨论,可以加我的雅虎通,winter_lb@yahoo.com.cn msn和雅虎通互连啦。
发布者:winter - 2006年07月28日 18:15
有个奇怪想法,不知道有用没有,或者已经在用了.
就是在蜘蛛抓取海量页面的时候,对所有用双引号,单引号,书名号内的词,尤其是2-6个字的词非常有可能是一个"词",对比现有词库后剩下的就可能是"未登录词",这样对于及时发现新词是相当有帮助的
我在使用中有个想法
就是分词后的相关度问题
在搜索专业材料的时候 经常效果不好
我是这样考虑的
分词后将每个词按一定规则生成一个相关度
最常用的词相关度也就越高
给出搜索结果的时候则按照相关度越底的词权限越高
也就是越专业的词汇就越要出现在搜索结果里
如果只有两个关键词的时候,如果其中一个相关度较高
也就是权限教低,这个时候搜索结果可以只出现相关度低的词
但如果两个词相关度都低,就是说都是非常专业化的词汇
那么搜索结果就必须只给出同时包含两个词的搜索结果
只包含一个的就不要给出了!
我理解是这样的!
而现在的搜索经常无法很好的解决这个问题