zoukankan      html  css  js  c++  java
  • 中文分词:采用二元词图以及viterbi算法(一)

    说明: 本程序为中科院研究生院刘群老师的课程《计算语言学》的一个课程作业。所以,语料库来源于刘群老师,格式是1998年1月人民日报语料库经过编码后的格式。 语料库格式见正向最大匹配。关于二元词图以及Viterbi算法的入门性质介绍见二元词图,Viterbi算法入门简介

     

    下面简单说一下:二元分词的思路。

    1.       建立词图:

     词图上的节点为单字(如果此单字在字典中出现,它的初始概率就由语料库计算,否则赋极小值,1/NN为训练语料库中所有词的总和,如果词重复出现,其重数也要计算在内)以及对于这个句子所有可能出现的词,如果这个词在语料库中出现过,我们就把它加到词图上去。

    2.       如何找到一个句子的所有可能分词?

    采用如下方法:

    首先对单词词典建立一个一级Trie树,即把词语按首字相同进行分组。对于句子中的每个字,我们看看以此字开头的词语的最大长度为多少,然后在句子中以此字为起始节点,每次取两个字,三个字……到最大长度位置,并且看看这些生成的词在词典里是否出现,如果出现则加入词图。

    3.       为刚才生成的词图建立一个拓扑序(Topological order)。我的方法如下:从句首到句尾,没一个汉字表征一个hierachy. 将词图中的词归类到各个hierachy 比如句子为我是一个大好人大大的好人。则词图中以字结尾的词归到Hierachy0,以“是”字结尾的词归到Hierachy1……以此类推。

    4.       维特比算法实现

    为了简单起见,把双字词典也建立成了前缀Trie树。

    维特比算法属于动态规划范畴。一个问题能够用动态规划问题建模,它必须能够满足以下两个条件:子结构最优,子问题交叠。也就是说一:1个问题的最优解是由最优的子问题的最优解构成;2求解此问题最优解的方法过程,对于求解子问题也适用,也就是可递归性。

    建立一个变量  optimalCandidates,保存每个hierachy上的最优节点。

    再用上面的句子举例。“我是一个大好人大大的好人”。第一个好字,属于hierachy5,它的最优解可以由 optimalCandidates[0], optimalCandidates[1], optimalCandidates[2], optimalCandidates[3], optimalCandidates[4],中的某些来生成。

    对属于每个hierachy的词,按照它的长度,找到它的上一个hierachy。例如上面例子中的好字所属的hierchay中有一个词是“大好”。那么这个词就回溯到hierachy3,看看P(大好|optimalCandates[3])的概率值。假设 “好”字hierachy还有一个词是“学习好”这个词可以回溯到hierachy2,但是不做处理,因为“学”字和,不相等。

    综上,就是我的二元分词法梗概。我的方法有一个缺陷,就是非常耗时。首先在建立字典上耗时,然后就是建立词图,需要不断查字典也比较耗时。

     

  • 相关阅读:
    Python--Requests
    Tensorflow2对GPU内存的分配策略
    Mongodb集成LDAP授权
    监听input输入框实时更新数据
    服务器设置laravel 定时任务调度
    postman---post请求数据类型(转自https://www.cnblogs.com/qican/p/11496820.html)
    webpack
    关于前端加密登陆绕过的渗透思路
    若依(Ruoyi)管理系统后台sql注入+任意文件下载漏洞
    【漏洞复现】YApi接口管理平台远程代码执行漏洞(含批量POC)
  • 原文地址:https://www.cnblogs.com/finallyliuyu/p/1782468.html
Copyright © 2011-2022 走看看