大家都知道TreeTagger是一个用于词性标注和词型还原的工具,它的返回结果由三部分组成:目标词汇,词性,原形。那该工具是怎样判断目标词汇的词性的呢?又是怎样得到目标词汇的原形的呢?本文就是从这两个问题入手,对TreeTagger的原理进行简单的介绍。

1. 词性的识别判断

这里词性的识别采用的决策树分类方法。如下图所示,首先将目标文本分成三元短语,然后通过判断目标词汇的前两个单词的词性来判断当前词汇的词性,具体思路下图所示:当前一个词的词性为ADJ时,判断前面倒数第二个词的词性,当词性为DET时,我们就可以得出结论:当前词汇的词性70%的可能性是NN,10%的可能性是ADJ。

那具体这棵树是如何构建的呢?

1)从当前词出发,判断其前面第一个相邻词汇的所有可能词性标记,选择特征性最明显的词性标记,将当前节点分成yes, 和no 两个子树。判断特征性明显的公式如下:

这里的C为当前节点的上下文,C+为测试q成功的情况, C-为对应的测试q失败的情况,

为测试q成功(失败)的概率;

为在测试q成功(失败)的条件下,第三个标记为t的概率。

Iq为平均信息量,我们要选择最大信息量等价于与选择最小平均信息量。

其中,各个指标的计算如下:

如果下一个测试产生的三元子集中有一个的大小低于阈值,则停止当前递归。

然后已经通过递归步骤的所有三元词组将被用于估计第三个词性标记的标记概率,并将其保存在当前节点中。

那构建好这棵树后需要进行剪枝工作,那具体是怎样实现的呢?

如果一个节点的两个子节点都是叶子节点,并且该节点上的权重信息增益低于所给的阈值,这该节点的子节点将会被移除,然后当前节点自己变成叶子节点。权重信息增益的计算公式如下:

G为权重信息增益,I0是信息总量,在测试q已知的情况下。与上面的描述不同。

2. 原形

treeTagger中的词汇原形是通过查找词典的方式获得的,该词典是从Penn Treebank 语料库中训练得到的。总共分为三部分: a fullform lexicon,  a suffix lexicon  and a default entry.

当从词典中查找一个单词的时候,首先从fullform lexicon中查找,如果找到了,就直接返回相应的词性标记概率向量(即作为每种词性出现的可能性),如果没有找到,则将其中的大写转换成小写,再次遍历the fullform lexicon,如果还是找不到,就到suffix lexicon中去查找。如果还是没有找到,则一个默认值将会被返回。那该词典的各个部分是怎样被构建的呢?有什么特点呢?

1)the fullform lexicon: 是从Penn Treebank Corpus的200万个词中训练得到的。在该部分中,每个词汇与其对应出现的词性组成对被计算,如果一个单词的某个词性出现的次数很少,低于1,则将会删除对应的词-词性对。因为该种情况的造成大多数是由于标注错误造成的。

2)the suffix lexicon: 被组织成一颗树,树上的每一个节点都用一个特征值进行标记。在叶子节点中,包含了词性标记概率向量。当进行查找操作时,首先从根节点进行。

讲了这麽多,可能大家都有点头昏了,举个例子吧!

假如我们想查找单词tagging 在suffix lexicon中,如下图。 

我们首先会从根节点开始,然后遍历分支,到达节点g,然后往前到达节点n, 最后我们在标记为i的节点处结束搜索。这个节点就是一个叶子节点,与其对应的概率向量将会被返回。

TreeTagger的更多相关文章

  1. NLP常用开源/免费工具

    一些常见的NLP任务的开源/免费工具, *Computational Linguistics ToolboxCLT http://complingone.georgetown.edu/~linguis ...

随机推荐

  1. python队列基本使用

    Python queue队列 作用: 解耦:使程序直接实现松耦合,修改一个函数,不会有串联关系. 提高处理效率:FIFO = 现进先出,LIFO = 后入先出.   队列: 队列可以并发的派多个线程, ...

  2. java Timer 定时每天凌晨0点执行任务

    import java.util.TimerTask; /** * 执行内容 * @author admin_Hzw * */ public class Task extends TimerTask ...

  3. 解救小哈——dfs深搜

    问题描述: 小哈去玩迷宫,结果迷路了,小哼去救小哈.迷宫由n行m列的单元格组成(n和m都小于等于50),每个单元格要么是空地,要么是障碍物. 问题:帮小哼找到一条从迷宫的起点通往小哈所在位置的最短路径 ...

  4. OpenStack-Neutron-安全组

    neutron中目前安全组的实现是使用iptables来实现的 创建安全组 创建安全组的时候默认有两条“出”规则(ipv4和ipv6) “default”安全组不仅有“出”规则,还有“入”规则.默认有 ...

  5. Windbg程序调试系列1-Mex扩展使用总结

    最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...

  6. liunx 常用命令学习笔记

    通过linux 命令pwd:显示当前所在的目录ls:显示当前目录下的文件cd:切换路径 cd..返回上一级路径mkdir:新建目录rmdir:删除目录 touch:新建文件rm:删除文件 gedit: ...

  7. linux中make的有关规则的特性

    我过去认为 makefile 只是一种将一组组的 shell 命令列出来的简便方法:过了一段时间我了解到它们是有多么的强大.灵活以及功能齐全.这篇文章带你领略其中一些有关规则的特性. 规则 规则是指示 ...

  8. Docker Registry V2 with Nginx

    安装 nginx 修改/etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/cen ...

  9. PID算法(c 语言)(来自老外)

    #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; // integer that c ...

  10. nginx-fastcgi 第九章

    CGI全称通用网关接口 Commmon Gateway Interface 用于HTTP服务上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上. 传统CGI接口方式性能较差,由于每次HTT ...