中文分词——字符串匹配的方法

基于字符串匹配的分词方法:这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词): 1)正向最大匹配法(FMM) 2)逆向最大匹配法 (BMM)

3)双向最大匹配法


     所谓词典正向最大匹配就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子字符串与字典中的词进行匹配,如果匹配成功则进行下一轮匹配,直到所有字符串处理完毕,否则将子字符串从末尾去除一个字,再进行匹配,如此反复。逆向匹配与此类似。


下面以一个例子来说明:要进行分词的字符串:“研究生命的起源”:

 

假定我们的字典中的相关内容如下:


研究

研究生

生命

起源


 首先需要确定一个最大匹配长度。因为我们的字典里最长的词为“研究生”,长度是3,所有我们将最大匹配长度设置为3.

 

正向最大匹配过程:

研究生 #第一个词匹配成功

 

命的起

命的

 #第二个词匹配成功,一个单字

 

的起源

的起

的 #第三个词匹配成功

 

起源 #第四个词匹配成功

 

那么正向最大匹配的结果就是

 

研究生 命 的 起源

 

现在我们来看看逆向最大匹配的过程:

 

的起源

起源 #第一个词匹配成功


生命的

命的

 #第二个词匹配成功

 

究生命

生命 #第三个词匹配成功

 

研究 #第四个词匹配成功

 

所以逆向最大匹配后的结果为

 

研究 生命 的 起源

 

两种分词过程总结:

【正向匹配:从左到右,逐步去掉右部(底部)的字进行新一轮匹配,逆向匹配:从右到左,逐步去掉左部(底部)的字进行新一轮匹配】

 

因为中文比较复杂以及中文的特殊性,逆向最大匹配大多时候往往会比正向要准确。


分词算法设计中的几个基本原则:

1、颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”、“公安局 长”、“公安局长”都算对,但是要用于语义分析,则“公安局长”的分词结果最好(当然前提是所使用的词典中有这个词)

2、切分结果中非词典词越少越好,单字词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字词”指的是可以独立运用的单字,如“的”、“了”、“和”、“你”、“我”、“他”。例如:“技术和服务”,可以分为“技术 和服 务”以及“技术 和 服务”,但“务”字无法独立成词(即词典中没有),但“和”字可以单独成词(词典中要包含),因此“技术 和服 务”有1个非词典词,而“技术 和 服务”有0个非词典词,因此选用后者。

3、总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。

 

3、双向最大匹配法:

正向最大匹配法和逆向最大匹配法,都有其局限性,我举得例子是正向最大匹配法局限性的例子,逆向也同样存在(如:长春药店,逆向切分为“长/春药店”),因此有人又提出了双向最大匹配法,双向最大匹配法。即,两种算法都切一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。

如:“我们在野生动物园玩”

正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,两字词3个,单字字典词为2,非词典词为1。

逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,五字词1个,两字词1个,单字字典词为2,非词典词为0。

非字典词:正向(1)>逆向(0)(越少越好)

单字字典词:正向(2)=逆向(2)(越少越好)

总词数:正向(6)>逆向(4)(越少越好)

因此最终输出为逆向结果。



  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中文分词是将一段中文文本按照语义单元进行切分的过程。通常使用算法实现,比如基于规则的方法和基于统计学习的方法等。正确率、召回率和F1是评估中文分词效果的重要指标。 - 正确率(Precision)是指分词结果中正确分词数占所有分词数的比例,即正确分词数 / 分词器分出的总词数。 - 召回率(Recall)是指分词结果中正确分词数占所有正确词数的比例,即正确分词数 / 应分出的总词数。 - F1值是综合考虑正确率和召回率的指标,其计算公式为:2 * Precision * Recall / (Precision + Recall)。 在Python中,可以使用第三方库如jieba来实现中文分词,并计算正确率、召回率和F1值。需要准备好分词测试集和标准答案,然后通过代码计算这些指标。以下是一个简单的例子: ```python import jieba # 读取测试集和标准答案 with open('test_set.txt', 'r', encoding='utf-8') as f: test_set = f.readlines() with open('standard_answer.txt', 'r', encoding='utf-8') as f: standard_answer = f.readlines() # 分别记录正确分词数、应分出的总词数和所有正确词数 correct_word_count = 0 total_word_count = 0 all_correct_word_count = 0 # 遍历测试集并进行分词,同时统计指标 for i in range(len(test_set)): words = jieba.lcut(test_set[i].strip()) standard_words = standard_answer[i].strip().split() for word in words: if word in standard_words: correct_word_count += 1 all_correct_word_count += 1 total_word_count += len(words) # 计算正确率、召回率和F1值 precision = correct_word_count / total_word_count recall = all_correct_word_count / total_word_count f1 = 2 * precision * recall / (precision + recall) print("Precision:", precision) print("Recall:", recall) print("F1:", f1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值