zoukankan      html  css  js  c++  java
  • 最大匹配算法

    最大匹配算法_百度百科 https://baike.baidu.com/item/%E6%9C%80%E5%A4%A7%E5%8C%B9%E9%85%8D%E7%AE%97%E6%B3%95/10967757

    最大匹配算法主要包括正向最大匹配算法、逆向最大匹配算法、双向匹配算法等。 其主要原理都是切分出单字串,然后和词库进行比对,如果是一个词就记录下来, 否则通过增加或者减少一个单字,继续比较,一直还剩下一个单字则终止,如果该单字串无法切分,则作为未登录处理。
     
    中文名
    最大匹配算法
    外文名
    Maximum Matching
    应用学科
    数学,计算机,数据结构
    适用领域范围
    分词,语义理解
    算    法
    MM,RMM,BMM
    简    称
    RMM法

    简介

    编辑
    逆向最大匹配法通常简称为RMM法。RMM法的基本原理与MM法相同 ,不同的是分词切分的方向与MM法相反,而且使用的分词辞典也不同。逆向最大匹配法从被处理文档的末端开始匹配扫描,每次取最末端的2i个字符(i字字串)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。相应地,它使用的分词词典是逆序词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒排处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。
      例子:’我一个人吃饭’
      反向最大匹配方式,最大长度为5
    个人吃饭
    人吃饭
      吃饭 ====》得到一个词– 吃饭
      我一个人
      一个人
      个人 ====》得到一个词– 个人
      我一
      一 ====》得到一个词– 一
      我 ====》得到一个词– 我
    最后反向最大匹配的结果是:
    /我/一/个人/吃饭/
     

    正向最大匹配算法思想

    编辑
    正向最大匹配算法:从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词。但这里有一个问题:要做到最大匹配,并不是第一次匹配到就可以切分的 。我们来举个例子:
    待分词文本: sentence[]={"计","算","语","言","学","课","程","有","意","思"}
    词表: dict[]={"计算", "计算语言学", "课程", "有", "意思"} (真实的词表中会有成千上万个已经平时我们使用的分好的词语)
    (1) 从sentence[1]开始,当扫描到sentence[2]的时候,发现"计算"已经在词表dict[]中了。但还不能切分出来,因为我们不知道后面的词语能不能组成更长的词(最大匹配)。
    (2) 继续扫描content[3],发现"计算语"并不是dict[]中的词。但是我们还不能确定是否前面找到的"计算语"已经是最大的词了。因为"计算语"是dict[2]的前缀
    (3) 扫描content[4],发现"计算语言"并不是dict[]中的词。但是是dict[2]的前缀。继续扫描:
    (3) 扫描content[5],发现"计算语言学"是dict[]中的词。继续扫描下去:
    (4) 当扫描content[6]的时候,发现"计算语言学课"并不是词表中的词,也不是词的前缀。因此可以切分出前面最大的词——"计算语言学"。
    由此可见,最大匹配出的词必须保证下一个扫描不是词表中的词或词的前缀才可以结束 [1]  。

    逆向最大匹配算法思想

    编辑
    逆向匹配算法大致思路是从右往左开始切分。我们还是用上面的例子:
    待分词句子: sentence[]={"计算语言学课程有意思"}
    词表: dict[]={"计算", "计算语言学", "课程", "有", "意思"}
    首先我们定义一个最大分割长度5,从右往左开始分割:
    (1)首先取出来的候选词W是 “课程有意思”。
    (2) 查词表,W不在词表中,将W最左边的第一个字去掉,得到W“程有意思”;
    (3) 查词表,W也不在词表中,将W最左边的第一个字去掉,得到W“有意思”;
    (4) 查词表,W也不在词表中,将W最左边的第一个字再去掉,得到W“意思”;
    (5) 查词表,W在词表中,就将W从整个句子中拆分出来,此时原句子为“计算语言学课程有”
    (6)根据分割长度5,截取句子内容,得到候选句W是“语言学课程有”;
    (7) 查词表,W不在词表中,将W最左边的第一个字去掉,得到W“言学课程有”;
    (8) 查词表,W也不在词表中,将W最左边的第一个字去掉,得到W“学课程有”;
    (9) 依次类推,直到W为“有”一个词的时候,这时候将W从整个句子中拆分出来,此时句子为“计算语言学课程”
    (10)根据分割长度5,截取句子内容,得到候选句W是“算语言学课程”;
    (11)查词表,W不在词表中,将W最左边的第一个字去掉,得到W“语言学课程”;
    (12) 依次类推,直到W为“课程”的时候,这时候将W从整个句子中拆分出来,此时句子为“计算语言学”
    (13)根据分割长度5,截取句子内容,得到候选句W是“计算语言学”;
    (14) 查词表,W在词表,分割结束 [2]  。
  • 相关阅读:
    PTA(Basic Level)1012.数字分类
    PTA(Basic Level)1011.A+B和C
    PTA(Basic Level)1008.数组元素循环右移问题
    PTA(Basic Level)1009.说反话
    PTA(Basic Level)1010.一元多项式求导
    Leetcode 38.报数 By Python
    Leetcode 35.搜索插入位置 By Python
    查看Linux的所有线程
    Linux内核模块编程——Hello World模块
    JSP内置对象总结
  • 原文地址:https://www.cnblogs.com/rsapaper/p/9216446.html
Copyright © 2011-2022 走看看