词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法

Type真是太帅了

于 2018-12-31 13:20:07 发布

1930
 收藏 1
分类专栏: 编程
版权

编程
专栏收录该内容
15 篇文章0 订阅
订阅专栏
Long Time No See...

最近深受痛苦的折磨,这一年来所有的事跌宕起伏,如同一瞬,一个个打击接踵而至,从年初的各种擦边挂,到各种失败,各种放弃,似乎没有发生一个顺心的事,不知道从什么时候起戾气变得越来越重,更无与人说。不管如何,“尽吾志也而不能至者,可以无悔矣,其孰能讥之乎?”……

我决定重拾包袱,从最初开始,从现在开始……

因为考研耽误了好多事,包括友谊,包括学习,在这就边做实验边复习点这学期的知识。

词法分析:把字符串序列转化为单词序列的过程,进行词法分析的函数或程序叫作词法分析器或扫描器。

例如:“XXXXXXXXXXX”->"X/XX/X/XX/X/X/X/X/X"

中文分词技术:把一句话根据词语字典切分为若干个词语。方法大体分为三类:字符匹配法、理解法、统计法,字符匹配法包括正向最大匹配、逆向最大匹配、最少切分、双向最大匹配等。

本次任务:给定字典,[‘研究’,’研究生’, ’生命’,’命’,’的’,‘起源’],使用正向最大匹配(Maximum Match Method,MM)和逆向最大匹配(Reverse Maximum Match Method,RMM)对“研究生命的起源”进行切分。

MM:

Step 1 假定分词词典中的最长词有i个汉字字符,则用被处理的当前字串中的前i个字作为匹配字段,查找字典。

Step 2 若字典中存在这样一个i字词,则匹配成功;否则,失败,将匹配字段中的最后一个字符去掉, 对剩下字串进行匹配。 Step 3 如此进行下去,直到匹配成功,即切分出一个词或剩余字串长度为0。 不停的匹配,直到文档被扫描完为止。

编程思路:第一步求词典中最长分词的长度,设为maxlen。设cobegin为源字符串时匹配的开始字符下标。cobegin初始为0,设coend为字符串的末尾下标的下一个,即coend=len(s)

第二步,设切分的大小为size,初始化为maxlen,如果切下的s[cobegin:cobegin+size]在字典中,则把切下的放在一个列表中,并cogebin=cobegin+size 且size重置为maxlen,否则size减1,重新匹配,当size为0且cobegin<coend 时,则表明无法将切分完毕;当cobegin>=coend时,退出循环。

代码实现 MaxMatch.py

dic=['研究','研究生','生命','命','的','起源']
out=[]
s='研究生命的起源'
maxlen=0 #字典中最大分词长度
for i in dic:
    if maxlen<len(i):
        maxlen=len(i)
cobegin=0 #剩余字符开始
coend=len(s) #剩余字符结束
size=maxlen #开始匹配长度
while cobegin<coend:
    ch=s[cobegin:cobegin+size] 
    if ch in dic:#匹配成功
        cobegin+=size
        out.append(ch)
        size=maxlen
    else: #匹配失败
        size-=1
    if size==0:
        print("error")
        break
最后结果:

好像不太对的样子,我意为自己写错了从网上复制了一个c++的代码(忘了在哪个博客找到的),运行,还是这个结果:

MM.cpp:

#include<iostream>
#include<string>
using namespace std;
 
// 宏,计算数组个数
#define GET_ARRAY_LEN(array,len){len=(sizeof(array)/sizeof(array[0]));}
 
string dict[] = {"研究", "研究生", "生命", "命", "的","起源"};
 
// 是否为词表中的词或者是词表中词的前缀
bool inDict(string str)
{
    bool res = false;
    int i;
    int len = 0;
    
    GET_ARRAY_LEN(dict, len);
 
    for (i = 0; i<len; i++)
    {
        // 是否和词表词相等或者是词表词前缀
        if( str == dict[i].substr(0, str.length()))
        {
            res = true;
        }
    }
    return res;
}
 
 
int main()
{
    string sentence = "研究生命的起源";
    string word = "一";
    int wordlen = word.length();
    
    int i;
    string s1 = "";
    
    for (i = 0; i<sentence.length(); i = i+wordlen)
    {
        string tmp = s1 + sentence.substr(i, wordlen);
 
        if(inDict(tmp))
        {
            s1 = s1 + sentence.substr(i, wordlen);
        }
        else
        {
            cout<<"分词结果:"<<s1<<endl;
            s1 = sentence.substr(i, wordlen);
        }
    }
    cout<<"分词结果:"<<s1<<endl;
}
结果还是一样:

RMM:原理和MM类似,唯一不同的时候匹配是倒着匹配(从字符串的最后开始),然后对最后切分的字段进行逆置即可。

ReMaxMatch.py:

import math
dic=['研究','研究生','生命','命','的','起源']
out=[]
s='研究生命的起源'
maxlen=0 #字典中最大分词长度
for i in dic:
    if maxlen<len(i):
        maxlen=len(i)
cobegin=0 #剩余字符开始
coend=len(s) #剩余字符结束
size=maxlen #开始匹配长度
while cobegin<coend:
    ch=s[coend-size:coend] 
    if ch in dic:#匹配成功
        coend-=size
        out.append(ch)
        size=maxlen
    else: #匹配失败
        size-=1
    if size==0:
        print("error")
        break
i=0
while i<math.floor(len(out)/2): #逆置
    str1=out[i]
    out[i]=out[len(out)-i-1]
    out[len(out)-i-1]=str1
    i+=1
结果:

两者的差异:

正向匹配时会优先选择匹配长度更长的单词,但同一前缀的单词并不是越长就越正确,逆向同理会匹配同一后缀匹配长度更长的单词,两者都有其局限性,需要做出一定的优化,比如使用最小切分法和双向切分等。
————————————————
版权声明:本文为CSDN博主「Type真是太帅了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36614557/article/details/85458057

词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法相关推荐

  1. NLP词法分析(一):中文分词技术

    文分词介绍 中文分词相较于英文分词要难许多,因为英文本身就是由单词与空格组成的,而中文则是由独立的字组成的,但同时语义却是有词来表达的.因此对于中文的分析与研究,首先应寻找合适的方法进行分词.现有的中 ...

  2. NLP|中文分词技术及应用

    摘要:中文分词是中文信息处理的重要基础,本文详细阐述了目前主要的几种中文分词算法的技术原理 .中文分词目前的瓶颈和评价准则,以及中文分词的具体应用. 中文分词指将一个汉字序列切分成一个个单独的词.现有 ...

  3. NLP学习(二)中文分词技术

    运行平台: Windows Python版本: Python3.x IDE: PyCharm 一. 前言 这篇内容主要是讲解的中文分词,词是一个完整语义的最小单位.分词技术是词性标注.命名实体识别.关 ...

  4. NLP学习(二)—中文分词技术

    本次代码的环境: 运行平台: Windows Python版本: Python3.x IDE: PyCharm 一.    前言 这篇内容主要是讲解的中文分词,词是一个完整语义的最小单位.分词技术是词 ...

  5. 【原创】NLP中的中文分词技术

     NLP中的中文分词技术 作者:mjs (360电商技术组) 随着需求的变化和技术的发展,互联网企业对数据的分析越来越深入,尤其是自然语言处理处理领域,近几年,在搜索引擎.数据挖掘.推荐系统等应用方 ...

  6. 中文分词技术之基于规则分词

    中文分词技术之基于规则分词 基于规则分词的基本思想 正向最大匹配法 逆向最大匹配法 双向最大匹配法 总结 词是中文语言理解中最小的能独立运用的语言单位.中文的词与词之间没有明显分隔标志,因此在分词技术 ...

  7. 【Python自然语言处理】中文分词技术——规则分词

    中文分词方法 本文参考自书籍<Python自然语言处理实战:核心技术与算法> 用做个人的学习笔记和分享 1. 规则分词 规则分词是一种机械分词方法,主要通过维护词典,在切分语句时将语句的每 ...

  8. NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)

    摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...

  9. 中文分词技术比较:单字切分 vs 中文分词

    全文信息检索系统中,创建倒排索引时应当使用什么分词方式一直是众说纷纭,毫无定论.    具我所知,已有某某 paper "研究指出"采用二元切分的方式构建索引是"最好的& ...

最新文章

  1. Android 使用ORMLite 操作数据库
  2. Luogu P3830 [SHOI2012]随机树 | 期望 DP
  3. AUTOSAR从入门到精通100讲(三十二)-AutoSar之实时环境RTE
  4. 很遗憾AI还不能审查出儿童性侵录像:沙漠也被当成小黄片
  5. centos7源码编译安装mariadb
  6. Codeforces Gym101205D:Fibonacci Words(KMP+递推)
  7. 轻量级网页安全漏洞扫描工具-Wapiti
  8. Linux批量文件名大小写转换,Linux中批量把文件名大小写转换
  9. c语言身高和标准体重,c语言4-15 输出标准身高体重对照表
  10. ios 设备获取idfa_通过Safari浏览器获取iOS设备UDID(设备唯一标识符)
  11. 扫雷android设计思路,Flash扫雷游戏设计思路与步骤(4)
  12. 阿里云服务器遭ddos攻击防御案例
  13. python的运算符(上)
  14. 后台服务器用户管理模块的解析
  15. Anti_TexturePacker工具
  16. you-get使用方法
  17. 收支系统(超超超简版)1.0
  18. 微型计算机在cad和cam中,CAM CAD考试题
  19. 计算机网络接口 rj45类型,RJ45接口是什么 RJ45接口分类
  20. Android2023暑期实习---网易游戏一面面经

热门文章

  1. java swing 树_Java Swing JTree 树形
  2. Netty详解(六):Netty 编解码技术
  3. 手机4k读写速度测试软件,4K扇区速度测试及读写IOPS_Intel 520_固态硬盘评测-中关村在线...
  4. 代码大全阅读笔记02
  5. Codeup 问题 B: 算法7-16:弗洛伊德最短路径算法
  6. 新手看看如何发布一个网站
  7. apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
  8. *1408素数回文数的个数
  9. Matlab使用技巧:Rapid Code Iteration Using Cells in the Editor
  10. JNI错误记录--JNI程序调用本地库时JVM崩溃