什么是汉语分词
所谓分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。
在英文的行文中,单词之间是以空格作为自然分界符的。例如:I am a student.
当然上面是比较正式的定义。在我看来,汉语分词就是将句子划分为一系列合理的词。有人会觉得这不就相当于什么都没说吗。合理,什么算是合理呢——这就是我认为汉语分词需要研究的地方,如何合理的进行划分,这个合理的根据到底是什么。
算法前先聊聊必要性
汉语自然语言处理的第一步。我觉得这句话足以代表汉语分词有多么重要了。这说明了汉语分词是汉语自然语言处理的最基础的根基,可想而知,如果根基除了问题,那么上层建筑就毫无意义可言。
那么目标是什么呢
这里就说说最重要的吧:
第一自然是准确性,我们认为汉语分词的准确性应到达99.9%以上才能基本满足上层使用的要求。有人会问这是为什么呢。(我特别喜欢回答这个问题,因为我有一个很好的例子,23333)假设我们每句话有10个词组成,然后我们现在又10句话需要我们处理。我们那现在汉语分词能达到的最高的准确率98%来说,那就意味着我100个词会分错2个,也就是说我在这10句话中就会分错2句话。(这么一想是不是很可怕,因为那2%的错误率是的上层的错误率达到了20%)。
第二是我们说的运行速度,目前我们认为一个好的汉语分词系统§每秒钟处理1万字或5千词以上。
让我们看看比较厉害的汉语分词系统
1、清华大学SEGTAG系统
此系统着眼于将各种各类的信息进行综合,以便最大限度地利用这些信息提高切分精度。系统使用有向图来集成各种各样的信息,这些信息包括切分标志、预切分模式、其他切分单位。为了实现有限的全切分,系统对词典中的每一个重要的词都加上了切分标志,即标志"ck"或"qk"。"qk"标志表示该词可进行绝对切分,不必理会它是否产生切分歧义;"ck"标志表示该词有组合歧义,系统将对其进行全切分,即保留其所有可能的切分方式。
系统通过这两种标志并使用几条规则以实现有限的全切分,限制过多的切分和没有必要的搜索。规则包括:
1、无条件切出qk类词;
2、完全切分ck类词(保留所有可能子串);
3、对没有标记(qk或ck)的词,若它与别的词之间存在交叉歧义,则作全切分;
否则将其切出。
为了获得切分结果,系统采用在有向图DAG上搜索最佳路径的方法,使用一个评价函数EVALUATE Path),求此评价函数的极大值而获得最佳路径Pmax。所运用的搜索算法有两种,"动态规划"和"全切分搜索+叶子评价",使用了词频、词类频度、词类共现频度等统计信息。通过实验,该系统的切分精度基本上可达到99%左右,能够处理未登录词比较密集的文本,切分速度约为30字/秒。
2、复旦分词系统
此系统由四个模块构成。
一、预处理模块,利用特殊的标记将输入的文本分割成较短的汉字串,这些标记包括标点符号、数字、字母等非汉字符,还包括文本中常见的一些字体、字号等排版信息。一些特殊的数词短语、时间短语、货币表示等,由于其结构相对简单,即由数词和特征字构成构成,也在本阶段进行处理。为此系统特别增加一次独立的扫描过程来识别这些短语,系统维护一张特征词表,在扫描到特征字以后,即调用这些短语的识别模块,确定这些短语的左、右边界,然后将其完整地切分开;
二、歧义识别模块,使用正向最小匹配和逆向最大匹配对文本进行双向扫描,如果两种扫描结果相同,则认为切分正确,否则就判别其为歧义字段,需要进行歧义处理;
三、歧义字段处理模块,此模块使用构词规则和词频统计信息来进行排歧。构词规则包括前缀、后缀、重叠词等构词情况,以及成语、量词、单字动词切分优先等规则。在使用规则无效的情况下,使用了词频信息,系统取词频的乘积最大的词串作为最后切分结果;最后,此系统还包括一个未登录词识别模块,以解决未登录词造成的分词错误。未登录词和歧义字段构成了降低分词准确率的两大因素,而未登录词造成的切分错误比歧义字段更为严重,实际上绝大多数分词错误都是由未登录词造成的。系统对中文姓氏进行了自动识别,它利用了中文姓名的用字规律、频率,以及姓名的上下文等信息。通过对十万以上的中文姓名进行抽样综合统计,建立了姓氏频率表和名字用字频率表,由此可获得任意相邻的二、三个单字构成姓氏的概率大小和某些规律,再利用这些字串周围的一些称谓、指界动词和特定模式等具有指示意义的上下文信息,对字串是否构成姓名进行辨别。实验过程中,对中文姓氏的自动辨别达到了70%的准确率。系统对文本中的地名和领域专有词汇也进行了一定的识别。
3、哈工大统计分词系统
该系统是一种典型的运用统计方法的纯切词系统,它试图将串频统计和词匹配结合起来。
系统由三个部分构成:
一、预处理模块,利用显式和隐式的切分标记(标点符号、数字、ASCII字符以及出现频率高、构词能力差的单字词、数词+单字常用量词模式)将待分析的文本切分成短的汉字串,这大大地减少了需要统计的(无效)字串的数量和高频单字或量词边界串;
二、串频统计模块,此模块计算各个已分开的短汉字串中所有长度大于1的子串在局部上下文中出现的次数,并根据串频和串长对每个这样的子串进行加权,加权函数为 (F为串频,L为串长,即串中汉字个数)。根据经验,局部上下文中取为200字左右。局部上下文的串频计算使用一个滑动窗口(为一个队列式缓冲区,保存当前待切分汉字串及其前后20个短串),当当前待切分汉字串处理完之后,窗口下移一个短串(中心变为相邻下一个短串)。系统采用一个外散列表来记录窗口中的短串,以加快窗口中串频计数。散列函数取为汉字的GB-80位码(二级汉字共用入口95),每个桶中保存窗口中
每一行(短串)上的汉字位置:(短串的行号,汉字列号),并且对于在窗口中出现多次的汉字位置用一个链指针连接起来,则计算某个字串在窗口中出现的频度时,不必将该字串与窗口中的短串逐个匹配,而只需统计在该字串中的各个汉字所对应的位置链表中能够相邻的位置的序列的个数即可。此外,还需要根据词缀集(前、后缀集合)对字串的权值进行提升,例如"处理器"中"处理"的权值很高,但由于对"处理器"的权值作了提升(达到或超过了"处理"),就不会切成"处理/器"。如果某个汉字串的权值超过某一阈值D(取为40),则将此汉字串作为一个新识别的词,将其存入一临时词库中;
三、切分模块,首先用临时词库对每个短的汉字串进行切分,使用的是逐词遍历算法,再利用一个小型的常用词词典对汉字短串中未切分的子串进行正向最大匹配分词。对于短汉字串中那些仍未切分的子串,则将所有相邻单字作为一个权值很低的生词(例如"玛"、"莉")。其中每个模块都对待分析的文本进行了一次扫描,因而是三遍扫描方法。此系统能够利用上下文识别大部分生词,解决一部分切分歧义,但是统计分词方法对常用词识别精度差的固有缺点仍然存在(例如切出"由/来"、"语/用"、"对/联"等)。
经测试,此系统的分词错误率为1.5%,速度为236字/秒。
下面说说我最喜欢的分词算法
人工智能法—— 神经网络方法
为啥喜欢,首先是机器学习越来越火,然后上完机器学习课之后感觉自己真的对这方面比较感兴趣,所以愿意研究一哈,并不是说这个算法是最好的,其实我觉得挺好的。。。
第一步:数据预处理:将语句中的字、单词进行编码,使得神经网络可以识别
编码方式:直接对字进行固定长度编码、根据词性进行编码
第二步:激励函数的选取:汉语分词问题可以看成在某个词后面时候切分的二分类问题,因此刺激函数可以采用S型函数(Sigmoid函数)
第三步:反向修正形式的确定:在反向回馈修改权值的过程中,我们选择利用梯度下降法来优化是的损失函数最小
第四步:参数的调整:输入层、隐含层、输出层神经元个数的选取,阈值、学习速率的确定,确定合理的训练次数
当然这只是很简单的阐述,详细实现与具体解释见之后说哦~