NLP(正向,逆向,双向匹配法分词及代码实现)

系列文章目录

第一章 规则和传统NLP之NLP概述
第二章 规则和传统NLP之NLP任务范式
第三章 规则和传统NLP之困难和挑战
第四章 NLP常见语料库


文章目录

  • 系列文章目录
  • [一、 中文分词](#一、 中文分词)
  • 二、地位:核心步骤
  • [三、 正向最大匹配法](#三、 正向最大匹配法)
    • [3.1 匹配规则](#3.1 匹配规则)
    • [3.2 示例](#3.2 示例)
    • [3.3 代码实现](#3.3 代码实现)
  • [四、 其他方法](#四、 其他方法)
    • [4.1 逆向最大匹配法](#4.1 逆向最大匹配法)
    • [4.2 代码实现](#4.2 代码实现)
    • [4.3 双向最大匹配法](#4.3 双向最大匹配法)
    • [4.4 代码实现](#4.4 代码实现)
  • 五、代码运行结果

一、 中文分词

二、地位:核心步骤

中文分词是许多基于机器学习的自然语言处理任务的基础,因为准确的分词能够为后续的任务(如文本分类、情感分析、信息检索等)提供可靠的输入。由于中文文本没有明显的词边界,进行有效的分词对于理解文本的语义至关重要。因此,分词被视为处理中文文本的第一步。

三、 正向最大匹配法

3.1 匹配规则

正向最大匹配法(Forward Maximum Matching,简称FMM)的基本思想是从文本的左侧开始,尽可能长地匹配词典中的词语,直到无法继续匹配为止。以下是正向最大匹配法的基本步骤:

  1. 导入分词词典:首先需要有一个预先构建好的分词词典,该词典包含了所有可能的中文词语,并按照词语的长度从长到短进行排序,设置n为词典中单词的最大长度。
  2. 初始化:设定分词起点为文本的开头,并创建一个空列表用于存储分词结果。
  3. 匹配过程
    • 从分词起点开始,按照长度为n的窗口切词,并与词典进行匹配。
    • 如果匹配成功,则将该词语添加到分词结果列表中,并将分词起点移动到匹配词语的后面。
    • 如果匹配失败,则对切词窗口的长度减一,再次进行匹配。
    • 重复上述过程,直到整个文本被分词完毕。
  4. 输出分词结果:将分词结果列表输出为最终的分词结果。

3.2 示例

python 复制代码
dictionary = ["我们","野生","动物","动物园","玩","野生动物园","在","是","你"]

词典中最长的词为**"野生动物园"(5个汉字),待分词的文本为"我们在野生动物园玩"**。按照正向最大匹配法的步骤进行分词:

  1. 首次尝试匹配"我们在野生",未成功。
  2. 尝试匹配"我们在野",未成功。
  3. ......
  4. 尝试匹配"我们",成功,将"我们"作为第一个分词结果。
  5. 剩余文本为"在野生动物园玩",重复上述步骤进行分词。
  6. 最终分词结果为:我们/在/野生动物园/玩

3.3 代码实现

python 复制代码
# 定义词典
dictionary = ["我们", "野生", "动物", "动物园", "玩", "野生动物园", "在", "是", "你"]
# 将词典转换为集合以提高查找效率
dictionary_set = set(dictionary)

# 待分词的文本
sentence = "我们在野生动物园玩"

# 正向最大匹配分词函数
def forward_maximum_matching(sentence, dictionary_set):
    result = []
    i = 0
    while i < len(sentence):
        longest_word = ""
        for j in range(i, len(sentence)):
            word = sentence[i:j+1]
            if word in dictionary_set and len(word) > len(longest_word):
                longest_word = word
        result.append(longest_word)
        i += len(longest_word)
    return result

四、 其他方法

4.1 逆向最大匹配法

逆向最大匹配法(Reverse Maximum Matching,RMM)基本原理与FMM基本相同,不同的是分词的方向与FMM相反。RMM是从待分词句子的末端开始,也就是从右向左开始匹配扫描,每次取末端m个字作为匹配字段,匹配失败,则去掉匹配字段前面的一个字,继续匹配。

4.2 代码实现

python 复制代码
# 逆向最大匹配分词函数
def backward_maximum_matching(sentence, dictionary_set):
    result = []
    i = len(sentence)
    while i > 0:
        longest_word = ""
        for j in range(0, i):
            word = sentence[j:i]
            if word in dictionary_set and len(word) > len(longest_word):
                longest_word = word
        result.insert(0, longest_word)  # 插入到结果列表的开头
        i -= len(longest_word)
    return result

4.3 双向最大匹配法

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

  1. 如果正反向分词结果词数不同,则取分词数量少的那个;
  2. 分词结果相同,没有歧义,返回任意一个;分词结果不同,返回其中单字数量较少的那个。

4.4 代码实现

python 复制代码
# 双向最大匹配分词函数(这里简单选择正向和逆向结果中词数更少的那个)
def bidirectional_maximum_matching(sentence, dictionary_set):
    forward_result = forward_maximum_matching(sentence, dictionary_set)
    backward_result = backward_maximum_matching(sentence, dictionary_set)
    # 选择词数更少的那个作为最终结果(也可以根据其他标准选择)
    return forward_result if len(forward_result) <= len(backward_result) else backward_result

五、代码运行结果

python 复制代码
# 测试分词函数
print("正向最大匹配分词结果:", "/".join(forward_maximum_matching(sentence,dictionary_set)))
print("逆向最大匹配分词结果:", "/".join(backward_maximum_matching(sentence,dictionary_set)))
print("双向最大匹配分词结果:", "/".join(bidirectional_maximum_matching(sentence , dictionary_set)))
相关推荐
民乐团扒谱机14 分钟前
【AI笔记】短时纯音时长对音高感知偏移效应研究综述
人工智能·笔记
侃谈科技圈25 分钟前
破除数据中台落地困境:2026数据治理平台差异化能力与选型决策指南
大数据·人工智能
大象说38 分钟前
Python多进程共享队列无报错僵死 120G Nginx访问日志清洗踩坑全记录
人工智能·自然语言处理
Cosolar44 分钟前
AutoGen 精通教程:从零到企业级多 Agent 系统架构师
人工智能·后端·面试
甲维斯1 小时前
Claude Code 省钱小妙招!200K和自动压缩
人工智能
DO_Community1 小时前
DigitalOcean 的 AI 推理路由器是如何构建的
人工智能·开源·agent·claude·deepseek
Elastic 中国社区官方博客1 小时前
Elasticsearch DiskBBQ:使用原生 SIMD Blocks 实现快 40% 的向量评分计算
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·diskbbq
Axis tech1 小时前
爱迪斯通携手智元机器人亮相COMPUTEX 2026大会
人工智能·机器人
AI刀刀1 小时前
智谱清言保存 pdf 显示该页的尺寸超出范围,AI 导出鸭智能适配页面尺寸稳定导出 PDF
人工智能·pdf·ai导出鸭
程序员佳佳2 小时前
连续使用三个月向量 API 中转站,它真的适配向量落地场景吗?
人工智能·gpt·aigc·ai编程·agi