自然语言处理之中文分词技术与算法

article/2025/9/23 0:46:25

1 正向最大匹配法

1.1 正向最大匹配(Maximum Match Method, MM法)的基本思想:
假定分词词典中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典。若字典中存在这样的一个i字词,则匹配成功,匹配字段被作为一个词切分出来。如果词典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字串重新进行匹配处理。如此进行下去,直到匹配成功,即切分出一个词或剩余字串的长度为零为止。这样就完成了一轮匹配,然后取下一个i字字串进行匹配处理,直到文档被扫描完为止。

其算法描述如下:
1)从左向右取待切分汉语句的m个字符作为匹配字段,m为机器词典中最长词条的字符数。
2)查找机器词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切分出所有词为止。

1.2 代码实现:

# !/usr/bin/python3
# -*- coding:utf-8 -*-
# @Time : 2019/10/13 11:48
# @Author : Huang Shiquan
# @Email : 1357626165@qq.com
# @File : MM.py
# @Project : Unit3_SplitWords
# @algorithm : 正向最大匹配法
class MM(object):def __init__(self):self.window_size = 3def cut(self,text):result = []index  = 0text_length = len(text)dic = ['研究','研究生','生命','命','的','起源']piece = ''while text_length > index:for size in range(self.window_size+index, index, -1):piece = text[index:size]if piece in dic:index = size - 1breakindex = index + 1result.append(piece)return resultif __name__ == '__main__':text = '研究生命的起源'tokenizer = MM()print(tokenizer.cut(text))

1.3 程序运行结果为:
在这里插入图片描述
2 逆向最大匹配法

2.1 逆向最大匹配(Reverse Maximum Match Method, RMM法)的基本思想:
与MM法相同,不同的是分词切分的方向与MM法相反。逆向最大匹配法从被处理文档的末端开始匹配扫描,每次取最末端的i个字符(i为词典中最长词数)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应地,它使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。

2.2 代码实现:

# !/usr/bin/python3
# -*- coding:utf-8 -*-
# @Time : 2019/10/13 16:56
# @Author : Huang Shiquan
# @Email : 1357626165@qq.com
# @File : RMM.py
# @Project : Unit3_SplitWords
# @algorithm : 逆向最大匹配法
class RMM(object):def __init__(self):self.window_size = 3def cut(self,text):result = []index = len(text)dic = ['研究','研究生','生命','命','的', '起源']piece = ''while index > 0:for size in range(index-self.window_size, index):piece = text[size:index]if piece in dic:index = size + 1breakindex = index - 1result.append(piece)result.reverse()return resultif __name__ == '__main__':text = '研究生命的起源'tokenizer = RMM()print(tokenizer.cut(text))

2.3 程序运行结果为:
在这里插入图片描述
3 双向最大匹配法

3.1 双向最大匹配法(Bi-directction Matching method)的基本思想:
双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,然后按照最大匹配原则,选取词数切分最少的作为结果。

3.2 代码实现:

# !/usr/bin/python3
# -*- coding:utf-8 -*-
# @Time : 2019/10/13 17:28
# @Author : Huang Shiquan
# @Email : 1357626165@qq.com
# @File : BDMM.py
# @Project : Unit3_SplitWords
# @algorithm : 双向最大匹配法
class BDMM(object):def __init__(self):self.window_size = 3# 正向最大匹配法切分def cut_MM(self,text):result = []index = 0text_length = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']piece = ''while text_length > index:for size in range(self.window_size + index, index, -1):piece = text[index:size]if piece in dic:index = size - 1breakindex = index + 1result.append(piece)return result# 逆向最大匹配法切分def cut_RMM(self,text):result = []index = len(text)dic = ['研究', '研究生', '生命', '命', '的', '起源']piece = ''while index > 0:for size in range(index - self.window_size, index):piece = text[size:index]if piece in dic:index = size + 1breakindex = index - 1result.append(piece)result.reverse()return result# 单字较少的listdef min_single(self, result1, result2):count1 = 0count2 = 0for res1 in result1:if(len(res1) == 1):count1 = count1 + 1for res2 in result2:if(len(res2) == 1):count2 = count2 + 1return result1 if count1 < count2 else result2# 双向最大匹配法切分def cut_BDMM(self,text):"""双向最大匹配的规则:(1) 如果正反向分词结果次数不同,则取分词数量较少的那个(2) 如果分词结果次数相同:1) 分词结果相同,就说明没有歧义,可返回任意一个;2) 分词结果不同,返回单字较少的那个。"""result_MM = self.cut_MM(text)result_RMM = self.cut_RMM(text)if len(result_MM) != len(result_RMM):return result_MM if len(result_MM) < len(result_RMM) else result_RMMelif result_RMM == result_MM:return result_MMelse:return self.min_single(result_MM, result_RMM)if __name__ == '__main__':text = '研究生命的起源'tokenizer = BDMM()print(tokenizer.cut_BDMM(text))

3.3 程序运行结果为:
在这里插入图片描述
*【注】如果你觉得此文不错,可以考虑打赏我哦,您的打赏将是我更新的最大动力,非常感谢。(打赏也是基于自愿原则的哦( ̄︶ ̄))

在这里插入图片描述


http://chatgpt.dhexx.cn/article/R1gkd4Gy.shtml

相关文章

列举:中文分词算法你知道几种?

列举&#xff1a;中文分词算法你知道几种&#xff1f; 摘要&#xff1a;看似普通的一句话&#xff0c;甚至几个词&#xff0c;在机器眼里都要经过好几道“程序”。这个过程主要靠中文分词算法&#xff0c;这个算法分为三大类&#xff1a;机械分词算法、基于n元语法的分词算法、…

(转)Linux下管道的原理

7.1.1 Linux管道的实现机制 在Linux中&#xff0c;管道是一种使用非常频繁的通信机制。从本质上说&#xff0c;管道也是一种文件&#xff0c;但它又和一般的文件有所不同&#xff0c;管道可以克服使用文件进行通信的两个问题&#xff0c;具体表现为&#xff1a; 限制管…

Linux之进程间通信——管道

文章目录 前言一、进程间通信1.概念2.目的3.进程间通信分类 二、管道1.管道介绍2.管道分类1.匿名管道pipi创建管道文件&#xff0c;打开读写端fork子进程关闭父进程的写入端&#xff0c;关闭子进程的读取端读写特征管道特征 2.命名管道mkfifo创建管道文件删除管道文件通信 三、…

Linux系统中的管道通信

目录 管道如何通信 管道的访问控制机制&#xff1a; 匿名管道 匿名管道数据传输的原理 如何使用&#xff08;代码案例&#xff09; 用C/C代码编译实现父子进程间通信案例 &#xff1a; 思路 实现 命名管道 为什么要有命名管道 回归进程间通信的本质 匿名管道的短板…

linux 管道 (单管道与双管道)

管道的局限性&#xff1a; ①数据不能进程自己写&#xff0c;自己读。 ②管道中数据不可反复读取。-旦读走, 管道中不再存在。 ③采用半双工通信方式&#xff0c;数据只能在单方向上流动。 ④只能在有公共祖先的进程间使用管道 单通道将小写字母改为大写例程&#xff1a; #in…

Linux 管道文件

管道分为无名管道和有名管道两种管道&#xff0c;管道文件是建立在内存之上可以同时被两个进程访问的文件。 先来说说有名管道&#xff1a; mkfifo函数创建有名管道&#xff0c;属于系统调用。 在linux操作系统中为实现下述功能&#xff0c; 先创建一个有名管道文件fifo。 …

【Linux】Linux 管道命令Cut、sort、wc、uniq、tee、tr【一】

目录 &#x1f40b;Cut— 根据条件 从命令结果中 提取 对应内容 &#x1f40b;sort—可针对文本文件的内容&#xff0c;以行为单位来排序。 &#x1f40b;wc命令— 显示/统计 指定文件 字节数, 单词数, 行数 信息. &#x1f40b; uniq— 用于检查及删除文本文件中重复出现的…

Linux管道命令(pipe)全

目录 选取命令&#xff1a;cut、grep 传送门 排序命令&#xff1a;sort、wc、uniq 传送门 双向重定向&#xff1a;tee 字符转换命令&#xff1a;tr、col、join、paste、expand 传送门 划分命令&#xff1a;split 传送门 参数代换&#xff1a;xargs 传送门 关于减号…

Linux中管道命令的用法

原文地址&#xff1a;http://blog.csdn.net/wirelessqa/article/details/8968381 一. 管道命令 管道命令操作符是&#xff1a;”|”,它只能处理经由前面一个指令传出的正确输出信息&#xff0c;对错误信息信息没有直接处理能力。然后&#xff0c;传递给下一个命令&#xff0c;…

Linux管道符

管道 1、管道符 管道符&#xff1a;| 作用&#xff1a;管道是一种通信机制&#xff0c;通常用于进程间的通信。它表现出来的形式将前面每一个进程的输出&#xff08;stdout&#xff09;直接作为下一个进程的输入&#xff08;stdin&#xff09;。 2、过滤功能 # ls / | gr…

linux管道相关命令

目标 cutsortwcuniqteetrsplitawksedgrep 准备数据 zhangsan 68 99 26 lisi 98 66 96 wangwu 38 33 86 zhaoliu 78 44 36 maq 88 22 66 zhouba 98 44 46以上是成绩表信息 使用 逗号 分割, 第一列 是 姓名, 第二列是 语文成绩, 第三列是 数学成绩, 第四列是 英语成绩 需求1: …

Linux管道到底能有多快?

【CSDN 编者按】本文作者通过一个示例程序&#xff0c;演示了通过Linux管道读写数据的性能优化过程&#xff0c;使吞吐量从最初的 3.5GiB/s&#xff0c;提高到最终的 65GiB/s。即便只是一个小例子&#xff0c;可它涉及的知识点却不少&#xff0c;包括零拷贝操作、环形缓冲区、分…

linux管道pipe详解

管道 管道的概念&#xff1a; 管道是一种最基本的IPC机制&#xff0c;作用于有血缘关系的进程之间&#xff0c;完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质&#xff1a; 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两个文件描述符引用&#xff0c;一个表…

Linux管道符|命令使用详解

1. 作用 “|”是Linux管道命令操作符&#xff0c;简称管道符。使用此管道符“|”可以将两个命令分隔开&#xff0c;“|”左边命令的输出就会作为“|”右边命令的输入&#xff0c;此命令可连续使用&#xff0c;第一个命令的输出会作为第二个命令的输入&#xff0c;第二个命令的…

Linux 管道操作符详解

管道操作符 : | 我们在Linux下经常要用到管道操作符&#xff0c;也就是"|"&#xff0c;即一个竖线。 这个操作符的作用对于经常使用Linux的人来说&#xff0c;看上去十分直观&#xff1a; 不就是将前一个指令的结果交给后一个指令吗&#xff1f; 举个例子&#xff…

linux之管道符详解

linux之管道符 ’ | ’ 操作详解 管道符主要用于多重命令处理&#xff0c;前面命令的打印结果作为后面命令的输入。简单点说就是&#xff0c;就像工厂的流水线一样&#xff0c;进行完一道工序后&#xff0c;继续传送给下一道工序处理… 举个栗子&#xff1a;对hello.sh文件进行…

【Linux】Linux的管道

管道是Linux由Unix那里继承过来的进程间的通信机制&#xff0c;它是Unix早期的一个重要通信机制。其思想是&#xff0c;在内存中创建一个共享文件&#xff0c;从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点&#xff0c;所以这个作为传递消息的…

【Linux】管道

前言 我和前桌上课传纸条&#xff0c;这是一种通信方式。 而我们为什么能过在上课的时候通信? 因为我们通过在纸条上写字进行了数据的传递。 本质上而言&#xff0c;我们两个都能看见一份公共的资源并对其进行读写&#xff0c;那就是小纸条&#xff01; 进程间通信的本质&a…

【嵌入式总复习】Linux管道详解——管道通信、无名管道、有名管道、具体应用示例

目录 管道1. 管道通信1.1 通信模式1.2 管道通信中特殊的名词 2. 无名管道&#xff08;PIPE&#xff09;2.1 无名管道的通信原理2.2 无名管道特点2.3 如何操作无名管道示例1示例2 3. 有名管道&#xff08;FIFO&#xff09;3.1 有名管道的特点3.2 如何操作有名管道 4. 示例4.1 cu…

linux命令管道工作原理与使用方法

一、管道定义 管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性&#xff0c;管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一&#xff0c;具有以下特点&#xff1a; *** 数据只能由一个进程流向另一个进程…