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)))
相关推荐
拓朗工控1 小时前
视觉革命:独立显卡工控机在医疗领域的深度应用
人工智能·智慧医疗·工控机
victory04311 小时前
2026年4月22日 Malicious Finetuning for LLM via Steganography 解读 复现要点
人工智能
Python私教2 小时前
Hermes Agent 技能系统:让 AI 学会自我进化
人工智能
小饕2 小时前
RAG学习之- RAG 数据导入完整指南
人工智能·python·学习
黑客说2 小时前
白日梦无限世界 各类型副本分析
人工智能·科技·游戏·娱乐
wearegogog1232 小时前
基于和差波束法的单脉冲测角MATLAB实现
人工智能·算法·matlab
陈广亮2 小时前
一个 CLAUDE.md 文件,一周涨了 44K Star:Karpathy 的 AI 编程四原则
人工智能
三秋树2 小时前
豆包 Agent Harness 工程师入门 | 第 5 章 Skills 技能
人工智能·agent·ai编程
一线数智2 小时前
从数字化到数智化: AI 赋能零售/餐饮高效运营
人工智能·零售