zoukankan      html  css  js  c++  java
  • 【自然语言处理】分词方法汇总

    一、关于分词

        原则

    • 颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切,如:“公安局长”可以分为“公安 局长”、“公安局 长”、“公安局长”都算对,但是要用于语义分析,则“公安局长”的分词结果最好
    • 切分结果中非词典词越少越好,单字字典词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字字典词”指的是可以独立运用的单字,如“的”、“了”、“和”、“你”、“我”、“他”。例如:“技术和服务”,可以分为“技术 和服 务”以及“技术 和 服务”,但“务”字无法独立成词(即词典中没有),但“和”字可以单独成词(词典中要包含),因此“技术 和服 务”有1个非词典词,而“技术 和 服务”有0个非词典词,因此选用后者
    • 总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。

    二、分词算法

    1、基于词典的方法

    1. 正向最大匹配法

    给定一个词的最大长度,以该长度进行切分,看看切出来的词是否在词典中出现,如果出现的话,该词就是切词的结果,否则缩短词的长度。

    2. 逆向最大匹配法

    同正向一样,只不过是从后往前进行。

    3、双向最大匹配

    先进行一次正向最大匹配,得到正向的分词结果,然后在进行一次反向最大匹配,得到反向的分词结果

    返回长度最小的结果

    2、基于HMM的分词

        关于HMM

        这是一个预测问题,预测隐藏序列。 状态序列集合为 {S, B, M, E}, 观测序列就是待切分的句子,要求就是预测这个句子的每个单词的状态,最后根据状态进行切词。

    • 首先要获取 状态转移矩阵 和 发射矩阵, 这个可以根据训练集统计得到,也就是 每个状态之间转移的概率和每个状态产生该词概率,以及最初的状态(就是每个状态在句首的概率)
    • 然后就可以用Vertibi算法进行预测了

        从最初状态开始,求这四个状态分别可以产生 第一个字符串的概率,并记录每个状态下的概率

        判断第二个字符,首先由上一个时间状态下的状态 转移到当前时间状态, 并且取当前时间下每个状态能得到当前位置字符概率最大的那个,然后在记录一下上一个状态

        一直到最后...

       最后根据 状态序列进行分词

    3、基于N-gram的分词(2-gram)

     2-gram语言模型是对于一个句子‘ABCD‘,他的概率为:P(ABCD) = P(A|S) * P(B|A) * P(C|B) * P(D|C)

        对句子中每一个位置的进行如下操作:

         遍历所有以该位置为结尾的词(词的长度有限制),找到该词之后在往前找到前一个词,这两个词就形成了一个切分结果,然后求所有的切分结果中概率最大值 

    源码:https://github.com/liuhuanyong/WordSegment

  • 相关阅读:
    eureka的fetch-registry属性解释
    数据结构设计
    typescript let和const区别
    JDK8新特性
    Synchronized的内存可见性
    java实现打印功能
    idea单元测试jpa注入失败问题----来自Spring Cloud微服务实战-idea版的 廖师兄的product
    eclipse快速生成接口
    读取 Excel 之 Epplus
    [转][Dapper]参数化查询慢
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/9983464.html
Copyright © 2011-2022 走看看