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)))
相关推荐
旦莫16 小时前
AI驱动的纯视觉自动化测试:知识库里应该积累什么知识内容
人工智能·python·测试开发·pytest·ai测试
dfsj6601117 小时前
第四章:深度学习革命
人工智能·深度学习
张伯毅17 小时前
如何构建一个生产级 AI Agent CLI —— 以 Claude Code 架构探索
人工智能·架构
知识领航员17 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
cskywit17 小时前
【CVPR2024】用Diffusion“造”遥感分割数据:SatSynth论文解读
人工智能·深度学习·计算机视觉
virtaitech17 小时前
算力浪费与算力饥渴并存,OrionX社区版免费开放能否破解这一困局?
大数据·人工智能·gpu算力
火山引擎开发者社区17 小时前
业务团队也能“手搓”应用?火山 Supabase 助力猿辅导对话式 Agent 落地
人工智能
薛定e的猫咪17 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
happyprince17 小时前
03-FlagEmbedding 推理模块深度分析
人工智能
段一凡-华北理工大学18 小时前
高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章19:项目实战:从0到1搭建系统
人工智能·高炉炼铁·工业智能体·炉温监测·炉温预警