seg:NLP之前向最大匹配分词

完整代码实现放在我的github上:click me

一、任务要求

  • 实现一个基于词典与规则的汉语自动分词系统。

二、技术路线

  • 采用正向最大匹配(FMM)方法对输入的中文语句进行分词,具体的实现可以分为下面几个步骤:

    1. 对输入的一个中文语句,首先在程序中判断并确保语句中不包含数字或者字母
    2. 在句子中的当前位置开始取与词典dic_ce.txt中最大匹配长度的词作为一个分词段,如果没有在词典中成功匹配到就将句子在当前匹配位置的这个字作为一个分词段并将匹配位置向前挪一个位置
    3. 重复第2步直到匹配位置移到句末
  • 下面是用FMM方法分词的具体实现:
//[email protected]:保存分词段结果的vector
//[email protected]:带分词的中文语句
void segment(vector<string> &seg, string st) {
    int pos = 0;
    int sz = st.length();
    string t;
    int cnt = 0, spos;
    while (pos < sz) {
        cnt = pos;
        spos = pos;
        t = "";
        while (st[cnt]) {
            t += st.substr(cnt, 2);
            if (wordmap.find(t) != wordmap.end())
                pos = cnt + 2;
            cnt += 2;
        }
        if (pos == spos) {
            seg.push_back(st.substr(spos, 2));
            pos += 2;
        }else {
            seg.push_back(st.substr(spos, pos - spos));
        }
    }
    return;
}

三、数据说明

  • 汉英词典dic_ce.txt,读取其中的汉词用于与句中词进行匹配,词典采用GBK编码,下面是给出文件内容示例:
//gbk编码,每行第一个词是汉词,后面是它对应的英译单词,以','分隔
阿弥陀佛,Amitabha
阿米巴,amoeba,amoebae
阿姆斯特丹,Amsterdam
阿斯匹林,aspirin

四、性能分析

  • 假设输入中文语句长度为n,程序时间复杂度最坏情况下是O(n^2),最好情况是O(n),下面是程序分析结果及分词耗时评测的截图:

五、运行环境

  • 将执行文件seg.exe与数据字典dic_ce.txt放在同一个目录下,然后点击seg.exe即可正常运行,进入运行窗口后根据提示进行输入即可得到分词结果。

原文地址:https://www.cnblogs.com/brooksj/p/10765656.html

时间: 2024-08-30 16:58:02

seg:NLP之前向最大匹配分词的相关文章

最大匹配分词算法

全文检索有两个重要的过程: 1分词   2倒排索引 我们先看分词算法 目前对中文分词有两个方向,其中一个是利用概率的思想对文章分词. 也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词.这里可以用一个公式衡量:M(A,B)=P(AB)/P(A)P(B),其中 A表示一个字,B表示一个字,P(AB)表示AB相邻出现的概率,P(A)表示A在这篇文章中的频度,P(B)表示B在这篇文章中的频度.用概率分词的好 处是不需要借助词典的帮助,坏处是算法比较麻烦,效率不高,也存在一定的出错率

双向最大匹配分词算法

#!/usr/bin/python #encoding=gbk import sys dictMaxLength = 5 dctDict = {} encoding='gbk' ''' 初始化字典.初始化最大词长 ''' def initDct(dct): global dctDict global dictMaxLength dctobj = open(dct) for line in dctobj: line = line.strip() word = line.split("\t"

逆向最大匹配分词算法C#

逆向顺序 句子:大家好我叫XX我是一名程序员 程序员 -> 序员 -> 员 名程序 -> 程序 -> 序 一名程 -> 名程 -> 程 是一名 -> 一名 -> 名 我是一 -> 是一 -> 一 X我是 -> 我是 -> 是 XX我  -> X我 -> 我 叫XX  -> XX -> X 我叫X -> 叫X -> X 好我叫 -> 我叫 -> 叫 家好我 -> 好我 -> 我

11大Java开源中文分词器的使用方法和分词效果对比

本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断. 11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: /** * 获取文本的所有分词结果, 对比不同分词器结果 * @author 杨尚川 */ public interface WordSegmenter {

中文分词选取-依概率选取

上一篇文章中介绍了一种中文分词的选取算法,本篇文章将介绍另外一种中文分词选取算法,依概率选取算法. 中文分词分词完成之后,还是上篇文章中的原则,分词结果不唯一,然后我们算法的目的是从几种分词好的算法之后选取一个作为分词的最终结果.算法会统计每个词在所有文档中的概率,该算法的中心思想是计算一个字符串中所有分词的概率之积,选取概率最大的作为分词的最终结果. 算法步骤:第一步,通过上几篇文章的的算法对字符串进行分词:第二步,扫描每一次分词结果:第三步,计算每一次分词结果的所有词的概率之积:第四步,选出

中文分词学习整理

主要分为两大类 1. 字符串匹配(扫描字符串),发现子串与词匹配,就算是匹配 这类分词通常加入一些启发式规则,比如“正向/反向最大匹配”,“长词优先”等策略. 优点:速度快.O(n)时间复杂度. 缺点:歧义和未登陆词处理不好. 歧义的例子很简单"长春市/长春/药店" "长春/市长/春药/店". 未登录词即词典中没有出现的词,当然也就处理不好. ikanalyzer,paoding 等就是基于字符串匹配的分词 2. 基于统计及机器学习 这类分词基于人工标注的词性和统计

【nlp】正向最大匹配算法、逆向最大匹配算法、双向最大匹配算法代码实现

from collections import defaultdict ''' 最大匹配算法 Maximum Match { 正向最大匹配, 逆向最大匹配, 双向最大匹配; 分词算法设计中的几个基本原则: 1.颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大, 即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”.“公安局 长”.“公安局长” 都算对,但是要用于语义分析,则“公安局长”的分词结果最好(当然前提是所使用的词典中有这个词) 2.切分结果中

大数据文本分析:灵玖自然语言中文语义分词系统

自然语言通常是指一种自然地随文化演化的语言.英语.汉语.日语为自然语言的例子,而世界语则为人造语言,即是一种为某些特定目的而创造的语言. 自然语言具备两个属性:语言属性与自然属性."语言"属性表现为公认的某些约定俗成的内在规律性;"自然"属性是说并不存在某个人为制造的.严格的语法规则体系来约定人们的语言表达方式,这是和程序设计语言大相径庭的.自然语言需要遵循一定的内在规律,但更大程度上是"存在即合理". 一个自然语言处理系统必须考虑许多语言自身与

中文分词技术

//正向最大匹配分词算法 ,耗时长,这并不是一个很好的算法,我的这个输出是逆向输入的 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ClusterCharater {     public class SplitChineseCharacter     {         private String[] dictionary = { "今天"