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)))
相关推荐
2601_949499948 小时前
400G组网低功耗优选!芯瑞科技400G VR4 QSFP112光模块赋能智算中心高速互联
大数据·人工智能·科技
GoAI8 小时前
# AI Agent 记忆框架横向对比报告总结
人工智能·大模型·llm·多模态
李昊哲小课9 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
万邦科技Lafite9 小时前
天猫商品评论API:评价内容中的用户情感倾向分析
人工智能·api·电商开放平台·淘宝开放平台·api开放接口
遇码9 小时前
认识 LakeMind:一款本地优先的开源 AI 数据探索工作台
人工智能·开源
格林威9 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
三江番长 陀舍古帝9 小时前
AI 相关概念之(基础层级):AI、ANI、AGI、ASI
人工智能·agi
加速财经10 小时前
PocketBay探索AI应用部署新方式
人工智能
IT_陈寒10 小时前
Redis缓存击穿把我坑惨了,原来这样设过期时间才靠谱
前端·人工智能·后端
AKAMAI10 小时前
优化AI推理:针对AI工作负载的实时Node Balancers指标
人工智能·云计算