自然语言处理(一)规则分词

一、中文分词技术简介

在英语中,单词本身就是词的表达,一篇英语文章就是“单词”加分隔符(空格)来表示的,在汉语中,词以字为基本单位的,但是一篇文章的语义表达却依然是以词来划分的。因此,在处理中文文本时,需要进行分词处理,将句子转化为词的表示。这个切词的过程就是中文分词,它是通过不同的算法利用计算机自动识别出句子的词,在词间加入边界标记符,分割出各个词汇。由于分词的主要困难在于分词的歧义问题,对于同一个句子不同的词划分会导致整个句子所表达的意思完全不一样。其中主要的几种分词方法主要归纳为“规则分词”, “统计分词”, “混合分词(规则+统计)”。

二、规则分词

基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,如果找到该词则进行切分,否则不予切分。按照匹配切分的方式,主要有正向最大匹配法、逆向最大匹配法以及双向最大匹配法三种方法。

三、正向最大匹配法

算法描述
1、从左向右取待切分汉语句的m个字符作为匹配字段,m为机器词典中最长词条的字符数

2、查找机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来,若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切出所有词为止。

代码实现

文章末尾中代码的MM_cut(self, text)函数部分 

四、逆向最大匹配法

算法描述

class rule_participle(object):
    def __init__(self):
        self.window_size = 3

    def MM_cut(self, text):
        result, index, text_length = "", 0, len(text)
        len_num = [0 for i in range(self.window_size + 1)]
        dic = ['研究', '研究生', '生命', '命', '的', '起源']
        while index < text_length:
            for size in range(self.window_size + index, index, -1):
                piece = text[index:size]
                if piece in dic:
                    len_num[size - index] += 1
                    index = size - 1
                    break
            index = index + 1
            result += (piece + r'/')
        return result, len_num

    def RMM_cut(self, text):
        result, index, text_length = "", len(text), len(text)
        len_num = [0 for i in range(self.window_size + 1)]
        dic = ['研究', '研究生', '生命', '命', '的', '起源']
        while index > 0:
            for size in range(index - self.window_size + 1, index, 1):
                piece = text[size:index]
                if piece in dic:
                    len_num[index - size] += 1
                    index = size + 1
                    break
            index = index - 1
            result = (piece + r'/') + result
        return result, len_num

    def BiMM_cut(self, text):
        result1, cnt1 = self.MM_cut(text)
        result2, cnt2 = self.RMM_cut(text)
        len1, len2 = sum(cnt1), sum(cnt2)
        print(len1, len2)
        if result1 == result2 or cnt1 < cnt2:
            return result1
        elif cnt1 > cnt2:
            return result2
        else:
            index = 0
            while index < self.window_size + 1:
                if cnt1[index] < cnt2[index]:
                    return result1
                elif cnt1[index] > cnt2[index]:
                    return result2
                index += 1
            return result1


if __name__ == '__main__':
    text = '研究生命的起源'
    tokenizer = rule_participle()
    tokenizer.MM_cut(text)
    tokenizer.RMM_cut(text)
    print(tokenizer.BiMM_cut(text))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值