正向最大匹配(Forward Maximum Matching)

简介: 正向最大匹配(Forward Maximum Matching)是一种查找文本字符串中词语的算法。

正向最大匹配(Forward Maximum Matching)是一种查找文本字符串中词语的算法。

原理
正向最大匹配的原理如下:

从字符串开头开始查找
查找最长的可以匹配的词语
匹配到最长的词语后,将其移除,并重复第一步,直到字符串结束
举个例子:

字符串: good goodes going goodness

匹配 good (最长匹配)
去除 good , 字符串为: goodes going goodness
匹配 goodes (最长匹配)
去除 goodes , 字符串为: going goodness
匹配 going (最长匹配)
...
最终匹配到的词语序列为:good goodes going goodness

应用
分词。正向最大匹配可用于进行中文/英文分词
信息检索。评估查询词与文本的相关性
文本挖掘。提取文本的关键词
示例代码
用 Python 实现正向最大匹配分词:

python
Copy
def forward_max_matching(text):
words = []
while text:
for i in range(len(text), 0, -1):
word = text[:i]
if word in dictionary:
words.append(word)
text = text[i:]
break
return words
它通过不断查找最长的存在于字典中的词语,来进行分词。


'''
(分词算法)正向最大匹配算法 positive_max_matching(max_length, words, ch_dict)
max_length 为最大匹配词语长度
words 为待分词文本
ch_dict 为词典
'''
def positive_max_matching(max_length, words, ch_dict):
    word_list = []  # 存放分词后的分词词组
    while len(words) >= 1: # words不为空时,循环地进行分词操作
        max_match_len = max_length # 取出最大匹配单词长度为循环判断做准备
        while max_match_len > 1: # 当匹配单词长度大于1时,循环判断分词
            sample_word = words[0 : max_match_len] # 判断 words 前 max_length 个字符是否存在于字典
            print("截取的词:", sample_word)
            if sample_word in ch_dict: # 判断取出的字符序列是否在词典ch_dict中
                word_list.append(sample_word)  # 追加到分词词组中
                words = words[max_match_len : len(words)]  # 将符合的词语从原例句中截取
                break  # 退出循环,重新从max_length最长匹配数开始匹配截取
            max_match_len -= 1 # max_length减小1个单位

        # 当 max_length 为 1 时代表只剩下一个汉字,直接截取词组中最后的汉字作为词组
        if max_match_len == 1:
            sample_word = words[0 : 1]
            word_list.append(sample_word)  # 追加单个汉字词语
            print("截取的词:", sample_word)
            words = words[1 : len(words)]  # 截取例句
    return word_list

if __name__ == '__main__':
    dict_words = ["生活", "研究", "家居", "美好", "手机", "强大", "功能", "喜欢", "智能", "本质", "铭铭", "人工", "研究生"] # 词典
    words = "铭铭喜欢研究生活的本质" # 待分词的文本
    contents = positive_max_matching(4, words, dict_words) # 调用算法分词,备注:最大匹配词语长度设为4,实际上因为词典中最大词语长度为3,可以设置为3
    print("分词的结果:", contents)  
    print("分词后的例句:", "/".join(contents))

以下是学习和使用正向最大匹配法的一些推荐资料:

《中文分词技术与系统实现》这本书详细描述了正向最大匹配法在中文分词中的应用。

《自然语言处理:原理方法与应用》也有正向最大匹配的介绍,并讲解了相关算法。

有关机器学习的在线课程如:

Andrew Ng的机器学习课程,在第9课介绍了正向最大匹配在贝叶斯垃圾邮件过滤中的应用

Stanford的自然语言处理课程

斯坦福NLP课程也有正向最大匹配的介绍。

可以学习的内容主要包括:
正向最大匹配的原理和实现
其在中文分词和信息检索中的应用
使用编程实现正向最大匹配算法
正向最大匹配的优缺点与其他算法的对比
除此之外,您还可以:

查看Kaggle和GitHub上的正向最大匹配项目源码
在Kaggle上找到相关数据集实现一个正向最大匹配模型
查看更多文章和博客,解决常见问题
总而言之,您可以通过:

理论学习
算法实现
实际应用
案例分析
来有效理解和使用正向最大匹配。

目录
相关文章
|
6月前
|
存储 算法
【洛谷 P1102】A-B 数对 题解(向量+lower_bound+upper_bound)
这是一个编程题目,要求计算给定正整数序列中满足 \( A - B = C \) 的数对个数。输入包含两行:正整数 \( N \) 和 \( C \),以及一串正整数。输出是满足条件的数对数量。使用排序和二分查找优化算法,代码中给出了 AC 解决方案。样例输入为 \( N=4, C=1 \),序列 \( 1, 1, 2, 3 \),输出为 \( 3 \)。数据范围:\( 1 \leq N \leq 2 \times 10^5 \),\( 0 \leq a_i < 2^{30} \),\( 1 \leq C < 2^{30} \)。
39 0
|
机器学习/深度学习 自然语言处理 算法
逆向最大匹配(Backward Maximum Matching)
逆向最大匹配(Backward Maximum Matching)是一种分词算法。它的工作原理与正向最大匹配相反,即从字符串结尾开始查找。
257 1
CF1272 E.Nearest Opposite Parity(反向建图+BFS)
CF1272 E.Nearest Opposite Parity(反向建图+BFS)
107 0
CF1272 E.Nearest Opposite Parity(反向建图+BFS)
CF507E Breaking Good (多关键字最短路 路径还原)
CF507E Breaking Good (多关键字最短路 路径还原)
77 0
CF1567D. Expression Evaluation Error(思维 贪心)
CF1567D. Expression Evaluation Error(思维 贪心)
60 0
|
算法 Python
动态规划法(三)子集和问题(Subset sum problem)
  继续讲故事~~   上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定。之后,他就决心去大城市闯荡了,看一看外面更大的世界。
2463 1
|
计算机视觉
轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)
http://www.cnblogs.com/xrwang/archive/2010/02/09/HowToUseContour.html   作者:王先荣 前言    轮廓是构成任何一个形状的边界或外形线。
1917 0