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 ...
随机推荐
- JAVA微信公众号网页开发 —— 用户授权获取openid
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 HttpClientUtil.java packa ...
- JAVA:IDEA使用Junit(3)
1.配置 File ——> Project Structure ——> Libraries ——> + ——>搜索Junit类库 确认ok即可 2.编辑项目 选择创建 配置生成 ...
- 原生侧边栏sidebar
创建侧栏导航 html: <a href="#" class="btn">点我啊</a> <div class="sid ...
- UI框架搭建DAY1
分析:UI框架主要是为了用户(使用框架的程序猿)更快捷.方便地开发UI,UI框架的好处还在于解耦,使得程序更具有灵活性. UI框架的核心是窗口的管理,窗口管理的主要任务就是显示窗口和关闭窗口. 因为窗 ...
- python hello 的三种方法
1)直接 print("hello") 2)使用main函数: def main(): print("Helloa你好") if __name__ == &qu ...
- 快速搭建Vue项目
快速搭建Vue项目 第一次安装vue项目Vue推荐开发环境Node.js 6.2.0.npm 3.8.9.webpack 1.13.vue-cli 2.5.1.webstrom2016 安装环境: 安 ...
- UValive4195 Heroes of Money and Magic
斜率优化 想骂人了,马格吉最后调了半小时 TMD造数据的人是SB吧? 我写 while(scanf("%d%d",&n,&m)!=EOF&&n) ...
- myBatis学习之路1-基本功能实现
myBatis也是一个持久型框架,相较于hibernate来说,算是轻量级的. 1.配置mybatis环境 相关jar下载地址:mybatis+mysalJAR包 2.新建一个java project ...
- 【只要有ENA千万别用NCBI】拆分SRA文件,通过SRAtoolkits
只要有ENA千万别用NCBI!!!! 最近开始分析网上Download的数据,一开始用人家现成的GWAS数据,后来觉得反正自己的数据到手该做的也是要做的,出来混早晚是要还的,所以就开始从头分析一些SR ...
- iOS项目之获取WebView的高度
获取高度值的方法: - (void)webViewDidFinishLoad:(UIWebView *)webView { // 获取webView的高度 CGFloat webViewHeight ...