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)))
相关推荐
火山引擎开发者社区15 小时前
火山AgentPlan/CodingPlan同步上线GLM-5.2
人工智能
冬奇Lab16 小时前
Skill 系列(05):Skill 工作流串联——4 种模式实测,并发加速 1.5x
人工智能·开源
冬奇Lab16 小时前
每日一个开源项目(第141篇):hiring-agent - HackerRank 开源了他们的简历评分系统,你的简历能得几分?
人工智能·面试·开源
甲维斯17 小时前
又升级咯!坦克大战2026,科技与复古并存!
前端·人工智能·游戏开发
姗姗来迟了19 小时前
用React Hook封装AI对话状态
人工智能
Goodbye19 小时前
从 Token 到 Embedding:LLM 核心基础深度解析
javascript·人工智能
阿瑞IT19 小时前
AI Agent 在甘特计划变更场景中的动态响应工程实践
人工智能
用户9385156350719 小时前
工具调用背后:LLM 如何突破“缸中大脑”,操控真实世界?
javascript·人工智能