TreeTagger
大家都知道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的更多相关文章
- NLP常用开源/免费工具
一些常见的NLP任务的开源/免费工具, *Computational Linguistics ToolboxCLT http://complingone.georgetown.edu/~linguis ...
随机推荐
- 3.1.1 Spring 简介
1. 概念 Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. IoC : Inversion of Control AOP : Aspect Oriented Program ...
- json to entity in api
using (var client = new HttpClient()) { var WVMId = DB.Vehicles.Where(v => v.Id == new Guid(vehic ...
- autoMapper的介绍
.NET的DTO映射工具AutoMapper 分类: 多层架构 DTO .NET2012-08-11 10:27 2466人阅读 评论(0) 收藏 举报 原文:https://github.com/A ...
- Python学习笔记(1)__name__变量
这是我在网上找到的一篇文章的标题. 本着学会了才是自己的,所以标题不变,自己试着再写一遍. 问题:__name__是什么? 背景:在学习编程规范的时候,我被要求函数的调用只能在__main()函数中使 ...
- mysql优化方案之sql优化
优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先 ...
- https://scrapingclub.com/exercise/basic_login/
遇到的问题:csrftoken cfduid 是在request.headers里面的,一直在找怎么在scrapy里get request.header,从scrapy shell ,then fet ...
- 生成id
package com.develop.web.util; import java.security.MessageDigest; import java.text.SimpleDateFormat; ...
- php 排列组合函数(无重复组合,可重复组合【全排列组合】)
<?php /** * 无重复排列組合 * @Author MAX * @DateTime 2018-09-07T16:28:40+0800 * @param Array $arr 需要排列組合 ...
- saltstack 基本的批量操作
centos 6.5 saltstack 2015.5.10 (Lithium) 基本用法 # salt 'DEV-APP-001' cmd.run 'hostname' #指定被控端 # salt ...
- ukylin 使用deepin-wine
之前一直是使用deepin的,但是自打前阵子更新内核之后,我的显卡就总出问题,这里也顺便f**k下NVIDIA. 在装了十几二十遍系统之后我终于还是妥协了,deepin最近又更新了,不知道解决我的显卡 ...