精华内容
下载资源
问答
  • java中文分词算法
    2022-01-06 17:09:53

    package com.huawei.cloud.phone.platform.app.api.web.controller;

    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.Set;

    public class analyzer {

    /**
     * 最大匹配分词算法
     *
     * @author JYC506
     */
    private Set<String> set = new HashSet<String>();
    private int positiveOver = 0;
    private int reverseOver = 0;
    
    /**
     * 正向最大匹配
     *
     * @param str     要分词的句子
     * @param maxSize 词的最大长度
     * @return
     */
    public String[] positiveSplit(String str, int maxSize) {
        int tem = 0;
        int length = str.length();
        String[] ss = new String[length];
        char[] cc = str.toCharArray();
        for (int i = 0; i < length; i++) {
            positiveOver = 0;
            String sb = this.toStr(cc, i, maxSize);
            ss[tem++] = sb;
            i = i + positiveOver;
        }
        String[] ss2 = new String[tem];
        System.arraycopy(ss, 0, ss2, 0, tem);
        return ss2;
    }
    
    /**
     * 添加词库
     *
     * @param words
     */
    public void addWord(String[] words) {
        for (String st : words) {
            this.set.add(st);
        }
    }
    
    /**
     * 逆向最大匹配
     *
     * @param str
     * @param num
     * @return
     */
    public String[] reverseSplit(String str, int num) {
        int tem = 0;
        int length = str.length();
        String[] ss = new String[length];
        char[] cc = str.toCharArray();
        for (int i = str.length() - 1; i > -1; i--) {
            reverseOver = 0;
            String sb = this.toStr2(cc, i, num);
            tem++;
            ss[--length] = sb;
            i = i - reverseOver;
        }
        String[] ss2 = new String[tem];
        System.arraycopy(ss, str.length() - tem, ss2, 0, tem);
        return ss2;
    }
    
    private String toStr(char[] cs, int start, int num) {
        int num2 = num;
        out:
        for (int j = 0; j < num; j++) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < num2; i++) {
                if (start + i < cs.length) {
                    sb.append(cs[start + i]);
                } else {
                    num2--;
                    j--;
                    continue out;
                }
            }
            if (set.contains(sb.toString())) {
                positiveOver = num2 - 1;
                return sb.toString();
            }
            num2--;
        }
        return String.valueOf(cs[start]);
    }
    
    private String toStr2(char[] cs, int start, int num) {
        int num2 = num;
        for (int j = 0; j < num; j++) {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < num2; i++) {
                int index = start - num2 + i + 1;
                if (index > -1) {
                    sb.append(cs[index]);
                } else {
                    num2--;
                }
            }
            if (set.contains(sb.toString())) {
                reverseOver = num2 - 1;
                return sb.toString();
            }
            num2--;
        }
        return String.valueOf(cs[start]);
    }
    
    public static void main(String[] args) {
        String[] words = new String[]{"我们", "我们五人", "五人一组", "一组"};
        analyzer ss = new analyzer();
        /*添加词到词库*/
        ss.addWord(words);
        String st = "我们五人一组";
        System.out.println("脚本之家测试结果:");
        System.out.println("要分词的句子:" + st);
        /*使用两种方式分词,下面我指定最大词长度为4*/
        String[] ss2 = ss.reverseSplit(st, 4);
        String[] ss1 = ss.positiveSplit(st, 4);
        System.out.println("正向最大匹配分词算法分词结果:" + Arrays.toString(ss1));
        System.out.println("逆向最大匹配分词算法分词结果:" + Arrays.toString(ss2));
    }
    

    }

    更多相关内容
  • 处理中文地址的分词和匹配 采用混合分词算法进行中文地址分词 在中文地址分词基础上采用Double Levenshetin算法进行中文地址相似度进行地址匹配
  • 中文地址分词

    2018-12-10 14:21:09
    处理中文地址的分词和匹配 采用混合分词算法进行中文地址分词 在中文地址分词基础上采用Double Levenshetin算法进行中文地址相似度进行地址匹配
  • MMSEGO这是MMSEG的GO实现,它是中文分词算法。 待办事项清单文档/注释基准测试用法#输入字典格式键\ tFreq每个键占用一个MMSEGO。这是MMSEG的GO实现,它是中文分词算法。 待办事项列表文档/注释基准测试用法#输入...
  • 中文分词一直都是中文自然语言处理领域的基础研究。...本篇文章主要介绍一下中文分词的一个最基础算法:最大匹配算法(Maximum Matching,以下简称MM算法)。MM算法有两种:一种正向最大匹配,一种逆向最...

    中文分词一直都是中文自然语言处理领域的基础研究。目前,网络上流行的很多中文分词软件都可以在付出较少的代价的同时,具备较高的正确率。而且不少中文分词软件支持Lucene扩展。但不管实现如何,目前而言的分词系统绝大多数都是基于中文词典的匹配算法。

    本篇文章主要介绍一下中文分词的一个最基础算法:最大匹配算法(Maximum Matching,以下简称MM算法)。MM算法有两种:一种正向最大匹配,一种逆向最大匹配。

    ● 算法思想

    正向最大匹配算法:从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词。但这里有一个问题:要做到最大匹配,并不是第一次匹配到就可以切分的。我们来举个例子:

    待分词文本:   content[]={"中","华","民","族","从","此","站","起","来","了","。"}

    词表:   dict[]={"中华", "中华民族" , "从此","站起来"}

    (1) 从content[1]开始,当扫描到content[2]的时候,发现"中华"已经在词表dict[]中了。但还不能切分出来,因为我们不知道后面的词语能不能组成更长的词(最大匹配)。

    (2) 继续扫描content[3],发现"中华民"并不是dict[]中的词。但是我们还不能确定是否前面找到的"中华"已经是最大的词了。因为"中华民"是dict[2]的前缀。

    (3) 扫描content[4],发现"中华民族"是dict[]中的词。继续扫描下去:

    (4) 当扫描content[5]的时候,发现"中华民族从"并不是词表中的词,也不是词的前缀。因此可以切分出前面最大的词——"中华民族"。

    由此可见,最大匹配出的词必须保证下一个扫描不是词表中的词或词的前缀才可以结束。

    ● 算法实现

    词表的内存表示:很显然,匹配过程中是需要找词前缀的,因此我们不能将词表简单的存储为Hash结构。在这里我们考虑一种高效的字符串前缀处理结构——Trie树

    下图是我们建立的Trie结构词典的部分,(词语例子:"中华","中华名族","中间","感召","感召力","感受")。

    7e9778f73f1239d25701571c24dc18b6.png

    (1) 每个结点都是词语中的一个汉字。

    (2) 结点中的指针指向了该汉字在某一个词中的下一个汉字。这些指针存放在以汉字为key的hash结构中。

    (3) 结点中的"#"表示当前结点中的汉字是从根结点到该汉字结点所组成的词的最后一个字。

    TrieNode源代码如下:

    importjava.util.HashMap;/*** 构建内存词典的Trie树结点

    *

    *@authorsingle(宋乐)

    *@version1.01, 10/11/2009*/

    public classTrieNode {/**结点关键字,其值为中文词中的一个字*/

    public char key=(char)0;/**如果该字在词语的末尾,则bound=true*/

    public boolean bound=false;/**指向下一个结点的指针结构,用来存放当前字在词中的下一个字的位置*/

    public HashMap childs=new HashMap();publicTrieNode(){

    }public TrieNode(chark){this.key=k;

    }

    }

    这套分词代码的优点是:

    (1) 分词效率高。纯内存分词速度大约240.6ms/M,算上IO读取时间平均1.6s/M。测试环境:Pentium(R)  4 CPU  3.06GHZ、1G内存。

    (2) 传统的最大匹配算法需要实现确定一个切分的最大长度maxLen。如果maxLen过大,则大大影响分词效率。而且超过maxLen的词语将无法分出来。但本算法不需要设置maxLen。只要词表中有的词,不管多长,都能够切分。

    (3) 对非汉字的未登录词具备一定的切分能力。比如英文单词[happy, steven],产品型号[Nokia-7320],网址[http://www.sina.com]等。

    缺点也很明显:

    (1) 暂时无词性标注功能,对中文汉字的未登录词无法识别,比如某个人名。

    (2) 内存占用稍大,目前词表为86725个词。如果继续扩展词表,很有可能内存Trie树将非常庞大。

    展开全文
  • 中文分词算法讲解非常好的一篇paper
  • 最新逆向最大匹配分词算法 盘古分词 分词算法 中文分词 源码
  • 其处理过程就是分词算法。 可以将中文分词方法简单归纳为: 1.基于词表的分词方法 2.基于统计的分词方法 3.基于序列标记的分词方法 其中,基于词表的分词方法最为简单,根据起始匹配位置不同可以分为: 1.前向最大...
  • 主要介绍了python实现中文分词FMM算法,实例分析了Python基于FMM算法进行中文分词的实现方法,涉及Python针对文件、字符串及正则匹配操作的相关技巧,需要的朋友可以参考下
  • 中文分词算法.docx

    2020-04-17 12:56:45
    1、颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”、“公安局 长”、“公安局长”都算对,但是要用于...
  • 中文分词中文文本处理的一个基础性工作,然而长久以来,在Python编程领域,一直缺少高准确率、高...下面这篇文章主要给大家介绍了关于python中文分词教程之前向最大正向匹配算法的相关资料,需要的朋友可以参考下。
  • simhash算法对字符串计算权重时,对中文要做特殊操作,及先分词,请自行下载sanford中文分词jar包及中文分词库
  • word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。 同时提供了Lucene...
  • 中文分词算法研究.doc

    2022-05-07 16:36:37
    中文分词算法研究.doc
  • 中文分词算法

    千次阅读 2019-03-02 22:00:20
    中文分词算法主要分为基于词表的分词算法、基于统计模型的分词算法、基于序列标注的分析算法。下面我们来一一剖析吧 准备好了吗!迎接疾风吧,数学能让人清醒!!! 目录 1.基于词表的分词算法 ...

    写在最前面:

    由于我们chinese language的特殊性,不和英文中有天然空格符一样,我们需要将汉字序列切分成单独的词。

    分词算法是文本挖掘的基础,通常对整个模型的效果起着较大的决定作用。中文分词算法主要分为基于词表的分词算法、基于统计模型的分词算法、基于序列标注的分析算法。下面我们来一一剖析吧

    准备好了吗!迎接疾风吧,数学能让人清醒!!!

    目录

    1.基于词表的分词算法

        1.1正向最大匹配法(FMM)

        1.2逆向最大匹配法(BMM)

        1.3双向最大匹配法

    2.基于统计模型的分析算法

        2.1基于N-gram语言模型的分词方法

    3.基于序列标注的分词算法

        3.1基于HMM的分词方法

        3.2基于MEMM的分词方法

        3.3基于CRF的分词方法

        3.4基于深度学习的端对端的分词方法

    1.基于词表的分词算法

        1.1正向最大匹配法(FMM)

    概念:对于输入的一个文本序列从左至右,以贪心的算法切分出当前位置上长度最大的词

    分词原理:单词的颗粒度越大,所能表示的含义越确切

    分词步骤:

    • 首先我们有一个词库word_dict还一个待分词的字符串s,首先我们计算得到词库中最长词语的长度假设为m,从字符串第一个位置开始,选择一个最大长度的词长片段,如果该字符串的长度不足最大词长,则选择该全部字符串;
    • 判断选择出来的字符串片段是否在词库中,若在,则将此词分离出来,若不在,则从右边开始,逐一减少一个字符,直到这个片段存在在词典中结束,或者以只剩下最后一个字结束;
    • 字符串变为上一步截取分词后剩下的部分序列,直到序列完全被分割。

    哈哈哈,上面肯定看的迷迷糊糊的,大家都这么过来的,文字太多容易视觉疲劳,那我们来举个小小的栗子吧。

    比如说待分割的序列s=‘我爱长沙理工大学’,然后我们的word_dict={'喜欢',‘长沙’,‘长沙理工大学’,...}假设其中最长词语的长度是6,接下来步骤就是

     

    • ‘我爱长沙理工’(不在)-->'我爱长沙理‘(不在)-->'我爱长沙’(不在)-->'我爱长'(不在)-->'我爱'(不在)-->'我' ====剩余一个字,加入词典
    • ‘爱长沙理工大’(不在) -->'爱长沙理工'(不在)-->’爱长沙理‘(不在)-->'爱长沙'(不在)-->'爱长'(不在)-->'爱'====剩余一个字,加入词典
    • '长沙理工大学'====在词典中,加入,遂分割完毕

    于是"我爱长沙理工大学"就分割成了"我/爱/长沙理工大学"

     

        1.2逆向最大匹配法(BMM)

        如果比较深入的理解啦1.1中所说的正向最大匹配,那么只要将正向从左至右筛选的顺序换成从右至左筛选就好了。

        其实90%(这个数字我乱编的,你可以理解成为大部分的意思)的情况下正向最大匹配法和逆向最大匹配法分词的结果都是一样的,但是也存在不一样的哟,比如说'结婚的和尚未结婚的'通过FMM可能会被分割成'结婚/的/和尚/未/结婚的/',但是通过BMM可能就会被分割成'结婚/的/和/尚未/结婚/的'

     

        1.3双向最大匹配法

        双向最大匹配法就是将正向和逆向最大匹配法进行比较得出最后分词结果,在中文信息处理系统中被广泛运用

    启发式规则:

    1. 如果正反向分析结果词数不同,则取分析数较少的那个

    2. 如果分词结果词数相同

    •  分词结果相同,就说明没有歧义,可返回任意一个
    •  分词结果不同,返回其中单字较少的那个

     

    2.基于统计模型的分析算法

        2.1基于N-gram语言模型的分词方法

        wikipedia上有关n-gram的定义: 
        n-gram是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。在应用层面,这些item可以是音素(语音识别应用)、字符(输入法应用)、词(分词应用)或碱基对(基因信息)。一般来讲,可以从大规模文本或音频语料库生成n-gram模型。 习惯上,1-gram叫unigram,2-gram称为bigram,3-gram是trigram。还有four-gram、five-gram等,不过大于n>5的应用很少见。
     

    如何计算一个句子出现的概率

    假设句子s=w1,w2,...wn,那么不妨把s展开表示

                                       p(s) = p(w1,w2,...wn) = p(w1)p(w2|w1)p(w3|w1,w2)***p(wn|w1,...wn-1)

    那么问题来了,计算p(w1)简单,p(w2|w1)也能算,p(wn|w1,w2,..wn-1)就额非常费力了,所以我们要很自然的引出马尔科夫链,假设一个词wi出现的概率只与它前面的wi-1词有关,那么

                                       p(s) = p(w1,w2,...wn) = p(w1)p(w2|w1)p(w3|w2)...p(wn|wn-1)

    常用于搜索引擎

    3.基于序列标注的分词算法

        3.1基于HMM的分词方法

        我要说的第一点就是他是个生成模型,所谓生成模型即是学习得到联合概率分布P(x,y),即特征x和标记y共同出现的概率,然后求条件概率分布。能够学习到数据生成的机制。

        他是将分词问题做个转换,将分词问题转换为对句子中的每个字打标注,标注这个字要么是一个词的开始B(begin),要么是一个词的中间M(middle),要么是一个词的结束(E),要么是单个字S(single),我们将句子标注好了,那么分词结果也就出来了

    X
    YSSBMMMME

     基于HMM的分词方法:属于由字构词的分词方法,由字构词的分词方法思想并不复杂,它是将分词问题转化为字的分类问题(序列标注问题)。从某些层面讲,由字构词的方法并不依赖于事先编制好的词表,但仍然需要分好词的训练预料 。

    它满足两个假设

    • markov链是齐次一阶的
    • 观测独立假设 

    由于HMM是一个生成模型,X为观测序列,Y为隐序列,则X,Y的联合分布为

     

        3.2基于MEMM的分词方法

           猜猜我要说的第一点是什么,没错,它是个判别式模型!!!,它是直接通过P(Y|X)来建模的

    P(i | i',o)通过最大熵分类器建模得到 ,即

    其中Z(o,i')为归一化因子,fa(o,i) 是特征函数,需自己定义,而入a为特征函数的权重,需要通过训练得到 

    求解步骤:

    • 先定义好特征函数fa(o,i)
    • 根据已有数据训练得到入a,即得到模型
    • 用模型得到数据标注或者求概率

    优点:相比于HMM

    • 打破了观测独立假设:克服了HMM输出独立性问题,通过引入特征函数使得模型比HMM拥有更多信息,而且最大熵则从全局角度来建模,它“保留尽可能多的不确定性,在没有更多的信息时,不擅自做假设”

    缺点:Lable Bias Problem(标注偏差问题)

    •  由于MEMM的当前状态只与当前观测以及上一状态有关,导致隐状态中有更少转移的状态拥有的转移概率普遍较高,简单的说就是MEMM中概率最大路径更容易出现在转移少的状态中。
    • 解决方案:引入全局化特征可以解决标注偏置问题,那么就很自然的说到我们的3.3CRF方法啦

        3.3基于CRF的分词方法

           CRF是无向图模型 

    在这里Z(O)是用来归一化的

    P (I|O)表示在给定观测序列O=(O1,O2,...Oi)的情况下,我们用CRF求出的隐序列I = (I1,I2,...Ii)的概率,注意这里I是一个序列,有多个元素

    优点:

    • 克服了HMM的观测独立假设以及MEMM标注偏差问题

    缺点:

    • 全局化特征模型会更复杂,导致训练周期长,计算量较大

        3.4基于深度学习的端对端的分词方法

        最近,基于深度神经网路的序列标注算法在词性标注、命名实体识别问题上取得了优秀的进展。词性标注、命名实体识别都属于序列标注问题,这些端到端方法可以迁移到分词问题上,免去CRF的特征模板配置问题。但与所有深度学习的方法一样,它需要较大的语料库才能体现优势。

     

       BiLSTM-CRF的网络结构如上图所示,输入层是一个embedding层,经过双向LSTM网络编码,输出层是一个CRF层,经过双向LSTM网络输出的实际上是当前位置对于各词性的得分,CRF层的意义是对词性得分加上前一位置的词性概率转移的约束,其好处是引入一些语法规则的先验信息 。

       其实说白了,就是一个深度学习的套路啦,扔进去训练就完事了。

     

    写在后面:其实还有很多细枝末节没有讲清楚,我自己再看也是晕晕的,但是不要怕,多看看,多想想,自然而然也就懂了,各位加油,如有错误,还肯定各大佬批评指正

    参考:各路博客以及各路论文以及各路视频网站,只是小小总结一下,感谢巨人的肩膀。

    展开全文
  • 自然语言处理之中文分词算法

    万次阅读 2018-05-03 22:57:25
    目前有三大主流分词方法:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 1、基于字符串匹配的分词方法 基于字符串匹配的分词方法又称为机械分词方法,它需要有一个初始的充分大的词典,...

    关于分词

    目前有三大主流分词方法:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。

    1、基于字符串匹配的分词方法

    基于字符串匹配的分词方法又称为机械分词方法,它需要有一个初始的充分大的词典,然后将待分词的字符串与词典中的元素进行匹配,若能成功匹配,则将该词切分出来。
    按扫描方向的不同,字符串匹配分词方法可以分为正相匹配和逆向匹配;按照不同长度的匹配优先度可以划分为最大匹配和最小匹配。

    1.1正向最大匹配

    1.从左到右将待切分句子的m个字符作为匹配字符,m为初始词典中最长词条的长度。
    2.将字符与字典中元素进行匹配:
    2.1.若匹配成功,则将这个字符作为一个词切分出来
    2.2.若匹配不成功,则将这个字符的最后一个字去掉,再进行匹配,重复上述过程,知道切分完整个文本为止。
    举个例子吧:
    假设我们要切分的句子为“南京市长江大桥”,字典中最长的元素长度为5,则先取待切分句子的前5个字符“南京市长江”。字典中没有元素与之匹配,长度减一,则变成“南京市长”,匹配成功。
    对剩余三个字“江大桥”再次进行正向最大匹配,会切成“江”、“大桥”;
    整个句子切分完成为:南京市长、江、大桥;

    1.2逆向最大匹配

    逆向最大匹配思想与正向最大匹配基本相同,不同的是将扫描方向变成了从右往左,匹配不成功时,去掉最左边的字符。
    实验表明,逆向最大匹配算法效果要优于正向最大匹配算法。
    “南京市长江大桥”的逆向最大匹配:
    1.取出“南京市长江大桥”的后5个字“市长江大桥”,字典中无匹配元素,将字符“市”去掉,发现词典中有匹配,切割下来;
    2.对剩余的“南京市”进行分词,整体结果为:南京市、长江大桥

    1.3双向最大匹配

    双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,从而决定正确的分词方法。
    还是上面的例子,双向最大匹配的划分结果为:南京市长、南京市、长江大桥、江、大桥。
    这类算法的优点是速度快,时间复杂度为O(n),实现简单;但是对于歧义和未登录词表现不佳。

    2、基于理解的分词方法

    其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。

    3、基于统计的分词方法

    主要思想:每个字都是词的最小单元,如果相连的字在不同的文本中出现的频率越多,这就越有可能是一个词。因此我们可以用相邻字出现的频率来衡量组词的可能性,当频率高于某个阈值时,我们可以认为这些字可能会构成一个词。
    主要统计模型: N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model,HMM),最大熵模型(ME),条件随机场(Conditional Random Fields,CRF)等
    优势:在实际运用中常常将字符串匹配分词和统计分词结合使用,这样既体现了匹配分词速度快、效率高的优点,同时又能运用统计分词识别生词、自动消除歧义等方面的特点。

    3.1 N-gram模型思想

    该模型基于这样一种假设,第n个词出现只与前面n-1个词相关,而与其他词都不相关。整句话的概率就是各个词出现概率的乘积。
    对于一个句子T,假设它由n个词 w1,w2,w3,,wn w 1 , w 2 , w 3 , ⋯ , w n 组成的,则 p(T)=p(w1w2w3wn)=p(w1)p(w2|w1)p(w3|w1w2)p(wn|w1w2wn1) p ( T ) = p ( w 1 w 2 w 3 ⋯ w n ) = p ( w 1 ) p ( w 2 | w 1 ) p ( w 3 | w 1 w 2 ) ⋯ p ( w n | w 1 w 2 ⋯ w n − 1 ) ,计算这个式子很麻烦,我们引入马尔科夫假设:一个词的出现仅依赖于它前面有限的几个词。如果一个词的出现仅依赖于它前面出现的一个词,我们就称之为bigram。则上式变为: p(T)=p(w1)p(w2|w1)p(w3w2)p(wnwn1) p ( T ) = p ( w 1 ) p ( w 2 | w 1 ) p ( w 3 w 2 ) ⋯ p ( w n w n − 1 )
    如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram。
    以此类推,N元模型就是假设当前词的出现概率只同它前面的N-1个词有关。(实际中通常只用到二元模型)

    3.2 隐马尔可夫模型(HMM)

    3.2.1 隐马尔可夫模型简介

    隐马尔可夫模型中的变量有两组。一组为状态变量{y1, y2, …, yn},其中yi表示第i时刻所处的状态,这些状态是隐藏的、不可观测的,因此又称为隐变量,隐变量的取值通常是离散的。第二组是观测变量{x1, x2, …, xn},其中xi表示第i时刻的观测值。
    在任一时刻,观测变量的取值只与该时刻的状态变量有关,即xi由yi决定。而当前状态只与前一时刻的状态有关,与其他状态无关。

    3.2.2 隐马尔可夫模型的三大问题

    一般的,一个HMM可以表示为u=(S, K, A, B, π), 其中S是状态集合,K是输出符号也就是观察集合,A是状态转移概率,B是符号发射概率,π是初始状态的概率分布。HMM主要解决三个基本问题:
    估计问题,给定一个观察序列O=O1,O2,O3,… ,Ot和模型u=(A,B,π),计算观察序列的概率;
    序列问题,给定一个观察序列O=O1,O2,O3… Ot和模型μ=(A, B, π),计算最优的状态序列Q=q1,q2,q3…qt;
    参数估计问题,给定一个观察序列O=O1,O2,O3… Ot,如何调节模型μ=(A,B, π)的参数,使得P(O|μ)最大。
    三类问题的求解在这里略去。

    3.2.3 隐马尔可夫模型分词方法

    隐马尔可夫的三大问题分别对应了分词中的几个步骤。参数估计问题就是分词的学习阶段,通过海量的预料数据来学习归纳出分词模型的各个参数。状态序列问题是分词的执行阶段,通过观测变量(待分词句子的序列)来预测出最优的状态序列(分词结构)。
    设状态集合S=(B.M,E,S),每个状态代表的是这个字在词语中的位置,B代表该字是词语中的起始字,M代表是词语中的中间字,E代表是词语中的结束字,S则代表是单字成词;观察值集合K =(所有的汉字);则中文分词的问题就是通过观察序列来预测出最优的状态序列。
    比如观察序列为:
    O = 南京市长江大桥
    预测的状态序列为:
    Q = BMEBMME
    根据这个状态序列我们可以进行切词:
    BME/BMME/
    所以切词结果如下:
    南京市/长江大桥/
    因为HMM分词算法是基于字的状态(BEMS)来进行分词的,因此很适合用于新词发现,某一个新词只要标记为如“BMME”,就算它没有在历史词典中出现过,HMM分词算法也能将它识别出来。

    中文分词工具介绍

    python常用的分词包有jieba分词、SnowNLP、THULAC、NLPIR 等。

    1、jieba分词

    jieba分词是国内使用人数最多的中文分词工具。

    1.1、jieba分词的三种模式

    (1)精确模式:试图将句子最精确地切分,适合文本分析;
    (2)全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
    (3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

    1.2、jieba分词涉及的算法

    jieba分词过程中主要涉及如下几种算法:
    (1)基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);
    (2)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;
    (3)对于未登录词,采用了基于汉字成词能力的 HMM 模型,采用Viterbi 算法进行计算;
    (4)基于Viterbi算法做词性标注;
    (5)基于tf-idf和textrank模型抽取关键词;
    jieba分词测试如下

    import jieba
    u="我来到北京清华大学"
    #全模式
    test1 = jieba.cut(u, cut_all=True)
    print("全模式: " + "| ".join(test1))
    #精确模式
    test2 = jieba.cut(u, cut_all=False)
    print("精确模式: " + "| ".join(test2))
    #搜索引擎模式
    test3= jieba.cut_for_search(u)  
    print("搜索引擎模式:" + "| ".join(test3))

    全模式: 我| 来到| 北京| 清华| 清华大学| 华大| 大学
    精确模式: 我| 来到| 北京| 清华大学
    搜索引擎模式:我| 来到| 北京| 清华| 华大| 大学| 清华大学

    2、SnowNLP

    SnowNLP可以方便的处理中文文本内容,是受到了TextBlob的启发而写的。SnowNLP主要包括如下几个功能:
    (1)中文分词(Character-Based Generative Model);
    (2)词性标注(3-gram HMM);
    (3)情感分析(简单分析,如评价信息);
    (4)文本分类(Naive Bayes)
    (5)转换成拼音(Trie树实现的最大匹配)
    (6)繁简转换(Trie树实现的最大匹配)
    (7)文本关键词和文本摘要提取(TextRank算法)
    (8)计算文档词频(TF,Term Frequency)和逆向文档频率(IDF,Inverse Document Frequency)
    (9)Tokenization(分割成句子)
    (10)文本相似度计算(BM25)
    SnowNLP的最大特点是特别容易上手,用其处理中文文本时能够得到不少有意思的结果,但不少功能比较简单,还有待进一步完善。

    3、THULAC

    THULAC由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:
    (1)能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
    (2)准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
    (3)速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

    4、NLPIR

    NLPIR分词系统是由北京理工大学张华平博士研发的中文分词系统,经过十余年的不断完善,拥有丰富的功能和强大的性能。NLPIR是一整套对原始文本集进行处理和加工的软件,提供了中间件处理效果的可视化展示,也可以作为小规模数据的处理加工工具。主要功能包括:中文分词,词性标注,命名实体识别,用户词典、新词发现与关键词提取等功能。

    展开全文
  • 大数据处理中文地址的分词和匹配 采用混合分词算法进行中文地址分词 在中文地址分词基础上采用精确算法进行中文地址相似度进行地址匹配
  • 中文自动分词算法

    2014-04-02 22:02:11
    中文自动分词算法
  • 中文分词技术综述,近年来的分词算法
  • 中文分词算法笔记

    2018-08-16 13:02:19
    中文分词基本算法主要分类 基于词典的方法、基于统计的方法、基于规则的方法、(传说中还有基于理解的-神经网络-专家系统,按下不表) 1、基于词典的方法(字符串匹配,机械分词方法) 定义:按照一定策略
  • java 实现的中文分词算法(代码)

    热门讨论 2011-04-14 20:10:38
    java 实现的基于FMM BMM算法的,中文分词算法(代码)
  • 机械分词算法1.1. 正向最大匹配算法 参考链接: https://blog.csdn.net/lcwdzl/article/details/78493637 代码源码地址: https://github.com/lankuohsing/Study_NLP 1. 机械分词算法 1.1. 正向最大匹配算法 # In[]...
  • 基于文本匹配的算法又称之为“机械分词算法”,他是它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功,可识别出一个词。按照扫描方向的不同,...
  • 逆向最大匹配分词中文分词基本算法之一,因为是机械切分,所以它也有分词速度快的优点,且逆向最大匹配分词比起正向最大匹配分词更符合人们的语言习惯。逆向最大匹配分词需要在已有词典的基础上,从被处理文档的...
  • SEO搜索中文分词算法原理实战教程.doc
  • 分别使用了正向最大匹配算法和KNN算法分词速度平均153295词/秒,189100字符/秒。文本分类使用tf-idf计算单词权重进行特征选择,我测试时选择前100个特征词,根据k的不同取值,分类的准确度平均为75%。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,057
精华内容 12,422
关键字:

中文地址分词算法