NLP自然语言处理分词之一元模型

标签:
nlp三叉树一元模型 |
分类: 机器学习 |
一元模型缘由
之前介绍过使用后缀三叉Trie树寻找词典中最长匹配词的方法进行句子分词,当然也说过前缀三叉Trie树,但是因为中文中主体后置所以后缀的效果基本优于前缀。但是通过寻找最长匹配词也存在着弊端,比如:
1、不一定每次分词最长效果就最好的
2、每次分词后面最长匹配词可能不应该是这个句子的分词,这个最长匹配词可能由前一个分词的后半部分,以及后一个分词的前半部分组成
举一个实际的例子,比如有句子:见证大上海银行业间合作。我们有可能通过最长匹配方式拿到分词“上海银行”,事实上这个句子和"上海银行"没有关系。这个就是最长匹配方式导致的歧义问题。
采用什么方式可以优化分词方式,尽量避免歧义问题的发生,这里我们就介绍一元模型的分词方法。
首先,我们将句子转化成切分词图,比如“见证大上海银行业间合作”对应的切分词图,每条边对应这一个权值(也可以叫做成本):
还是以“见证大上海银行业间合作”为例进行完整剖析。
1、获取每个词的出现概率(取log后的值)
2、画出切分词图
3、将切分词图转换成邻接表,因为需要计算每个节点的达到成本,所以邻接表的纵向list是以达到节点进行组织的,而横向则是具有相同达到节点的词语。得到邻接表如下所示:
4、接下来从上往下计算每个节点的最小成本,并将此节点作为那一行的节点。怎么计算最小成本呢?
假设我们已经得到"大"那一行的最小成本为-18.6(只保留一位小数),"上"那一行的最小成本为-24.3,接下来计算"海"->"上海"
这一行的最小成本。
5、从后向前寻找每个切分词
一元模型方法简述
一元模型实现步骤

(1)“海"的成本为:-7.2540 +
(-24.3)=-31.5,其中-24.3就是"海"上一个字"上"的最小成本
(2)"上海"的成本为:-6.9532 + (-18.6) =
-25.6,其中-18.6就是"上海"上一个字“大”的最小成本
比较上面两个数字我们就知道"上海"的成本低于"海",所以我们选择"上海"。其他的计算同理,从而我们就计算出了每一行的最小成本,以及相应的词。我们计算得到的结果是:
第1个是"合作",这个词占了2个坑;
所以第2个是序号9即"间",这个词占了1个坑;
所以第3个是序号8即"银行业",这个词占了3个坑;
所以第4个是序号5即"上海",这个词占了2个坑;
所以第5个是序号3即"大",这个词占了1个坑;
所以第6个是序号2即"见证",这个词占了2个坑;
最后第7个是序号0,不好意思没有这个坑了。
通过以上计算我们得到了切词为:见证/大/上海/银行业/间/合作
一元模型代码实现
(1)标记切分词图中每个节点的具体信息CnToken.java
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package
public } |
(2)节点Node.java
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package
public } |
(3)用于构建邻接表的单向链表TokenLinkedList.java
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
package import import public |