大家都知道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. this inspection detects names that should resolved but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are sup

    输入第一行代码:import logging;logging.basicConfig(level==logging.INFO) 提示:this inspection detects names tha ...

  2. Struts2重要知识点总结

    一.interceptor拦截器的使用 第一种情况(指定action使用该拦截器):struts.xml文件的配置: <interceptors> <interceptor name ...

  3. django-ajax post与get请求

    客户端    访问  服务器  方式:      地址栏          get      a标签           get      form表单     get/post      ajax ...

  4. ACFS-9459: ADVM/ACFS is not supported on this OS version

    环境:RHEL 7.3 + Oracle 12.2.0.1 RAC 现象:acfs资源状态不正常,asmca图形也没有acfs相关内容,无法使用acfs. 1.具体现象 2.定位bug 3.解决问题 ...

  5. [Android] websocket客户端开发

    为了能够在H5和APP都保持同一套长连接接口,因为采用websocket协议作为开发 使用的第三方库是:https://github.com/TakahikoKawasaki/nv-websocket ...

  6. 设置vim支持gbk

    linux下的默认字符集是utf-8,但Windows下默认是GBK,如果我们在linux下打开Windows中的文件就很容乱码,可以通过下面的设置使vim支持GBK编码. 首先,确认你的系统中安装了 ...

  7. PHP5.6 Dockerfile

    FROM centos COPY ["src","/src"] RUN groupadd -g 1000 www \ && useradd -u ...

  8. esp32-micropython

    本来之前买和另一贴子的esp8266一起买了一块esp32. 现在开发esp的大概有乐鑫的ide以及基于乐鑫定制的.arduino.nodemcu.还有就是现在要讲的micropython. 乐鑫的主 ...

  9. 尚硅谷面试第一季-18ES与Solr的区别

    背景:它们都是基于Lucene搜索服务器基础之上开发,一款优秀的,高性能的企业级搜索服务器.[是因为他们都是基于分词技术构建的倒排索引的方式进行查询] 开发语言:Java语言开发 诞生时间:Solr ...

  10. 如何设置openwrt在编译linux内核时不优化内核?

    答:修改openwrwt源码目录下rule.mk文件中的HOST_CFLAGS即可 将HOST_CFLAGS:=-O2 $(HOST_CPPFLAGS)改成: HOST_CFLAGS:=-O1 $(H ...