【中文分词】结构化感知器SP
结构化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出来的,用于解决序列标注的问题。中文分词工具THULAC、LTP所采用的分词模型便是基于此。
1. 结构化感知器
模型
CRF全局化地以最大熵准则建模概率\(P(Y|X)\);其中,\(X\)为输入序列\(x_1^n\),\(Y\)为标注序列\(y_1^n\)。不同于CRF建模概率函数,SP则是以最大熵准则建模score函数:
\]
其中,\(\Phi_s(Y,X)\)为本地特征函数\(\phi_s(h_i,y_i)\)的全局化表示:
\]
那么,SP解决序列标注问题,可视作为:给定\(X\)序列,求解score函数最大值对应的\(Y\)序列:
\]
为了避免模型过拟合,保留每一次更新的权重,然后对其求平均。具体流程如下所示:
因此,结构化感知器也被称为平均感知器(Average Perceptron)。
解码
在将SP应用于中文分词时,除了事先定义的特征模板外,还用用到一个状态转移特征\((y_{t-1}, y_t)\)。记在时刻\(t\)的状态为\(y\)的路径\(y_1^{t}\)所对应的score函数最大值为
\]
则有,在时刻\(t+1\)
\]
其中,\(w_{y',y}\)为转移特征\((y',y)\)所对应的权值,\(F(y_{t+1}=y,X)\)为\(y_{t+1}=y\)所对应的特征模板的特征值的加权之和。
2. 开源实现
张开旭的minitools/cws(THULAC的雏形)给出了SP中文分词的简单实现。首先,来看看定义的特征模板:
def gen_features(self, x): # 枚举得到每个字的特征向量
for i in range(len(x)):
left2 = x[i - 2] if i - 2 >= 0 else '#'
left1 = x[i - 1] if i - 1 >= 0 else '#'
mid = x[i]
right1 = x[i + 1] if i + 1 < len(x) else '#'
right2 = x[i + 2] if i + 2 < len(x) else '#'
features = ['1' + mid, '2' + left1, '3' + right1,
'4' + left2 + left1, '5' + left1 + mid, '6' + mid + right1, '7' + right1 + right2]
yield features
共定义了7个特征:
- \(x_iy_i\)
- \(x_{i-1}y_i\)
- \(x_{i+1}y_i\)
- \(x_{i-2}x_{i-1}y_i\)
- \(x_{i-1}x_{i}y_i\)
- \(x_{i}x_{i+1}y_i\)
- \(x_{i+1}x_{i+2}y_i\)
将状态B、M、E、S分别对应于数字0、1、2、3:
def load_example(words): # 词数组,得到x,y
y = []
for word in words:
if len(word) == 1:
y.append(3)
else:
y.extend([0] + [1] * (len(word) - 2) + [2])
return ''.join(words), y
训练语料则采取的更新权重:
for i in range(args.iteration):
print('第 %i 次迭代' % (i + 1), end=' '), sys.stdout.flush()
evaluator = Evaluator()
for l in open(args.train, 'r', 'utf-8'):
x, y = load_example(l.split())
z = cws.decode(x)
evaluator(dump_example(x, y), dump_example(x, z))
cws.weights._step += 1
if z != y:
cws.update(x, y, 1)
cws.update(x, z, -1)
evaluator.report()
cws.weights.update_all()
cws.weights.average()
Viterbi算法用于解码,与HMM相类似:
def decode(self, x): # 类似隐马模型的动态规划解码算法
# 类似隐马模型中的转移概率
transitions = [[self.weights.get_value(str(i) + ':' + str(j), 0) for j in range(4)]
for i in range(4)]
# 类似隐马模型中的发射概率
emissions = [[sum(self.weights.get_value(str(tag) + feature, 0) for feature in features)
for tag in range(4)] for features in self.gen_features(x)]
# 类似隐马模型中的前向概率
alphas = [[[e, None] for e in emissions[0]]]
for i in range(len(x) - 1):
alphas.append([max([alphas[i][j][0] + transitions[j][k] + emissions[i + 1][k], j]
for j in range(4))
for k in range(4)])
# 根据alphas中的“指针”得到最优序列
alpha = max([alphas[-1][j], j] for j in range(4))
i = len(x)
tags = []
while i:
tags.append(alpha[1])
i -= 1
alpha = alphas[i][alpha[1]]
return list(reversed(tags))
3. 参考资料
[1] Collins, Michael. "Discriminative training methods for hidden markov models: Theory and experiments with perceptron algorithms." Proceedings of the ACL-02 conference on Empirical methods in natural language processing-Volume 10. Association for Computational Linguistics, 2002.
[2] Zhang, Yue, and Stephen Clark. "Chinese segmentation with a word-based perceptron algorithm." Annual Meeting-Association for Computational Linguistics. Vol. 45. No. 1. 2007.
[3] Kai Zhao and Liang Huang, Structured Prediction with Perceptron: Theory and Algorithms.
[4] Michael Collins, Lecture 4, COMS E6998-3: The Structured Perceptron.
【中文分词】结构化感知器SP的更多相关文章
- 自己DIY出来一个JSON结构化展示器
说来也巧,这个玩意,一直都想亲手写一个,因为一直用着各种网上提供的工具,觉得这个还是有些用途,毕竟,后面的实现思路和原理不是太复杂,就是对json的遍历,然后给予不同节点类型以不同的展现风格. 我这次 ...
- 开源中文分词工具探析(五):FNLP
FNLP是由Fudan NLP实验室的邱锡鹏老师开源的一套Java写就的中文NLP工具包,提供诸如分词.词性标注.文本分类.依存句法分析等功能. [开源中文分词工具探析]系列: 中文分词工具探析(一) ...
- 开源中文分词工具探析(四):THULAC
THULAC是一款相当不错的中文分词工具,准确率高.分词速度蛮快的:并且在工程上做了很多优化,比如:用DAT存储训练特征(压缩训练模型),加入了标点符号的特征(提高分词准确率)等. 1. 前言 THU ...
- 开源中文分词工具探析(七):LTP
LTP是哈工大开源的一套中文语言处理系统,涵盖了基本功能:分词.词性标注.命名实体识别.依存句法分析.语义角色标注.语义依存分析等. [开源中文分词工具探析]系列: 开源中文分词工具探析(一):ICT ...
- 感知器(Perception)
感知器是一种早期的神经网络模型,由美国学者F.Rosenblatt于1957年提出.感知器中第一次引入了学习的概念,使人脑所具备的学习功能在基于符号处理的数学到了一定程度模拟,所以引起了广泛的关注. ...
- 基于结构化平均感知机的分词器Java实现
基于结构化平均感知机的分词器Java实现 作者:hankcs 最近高产似母猪,写了个基于AP的中文分词器,在Bakeoff-05的MSR语料上F值有96.11%.最重要的是,只训练了5个迭代:包含语料 ...
- 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较
本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...
- solr4.7中文分词器(ik-analyzer)配置
solr本身对中文分词的处理不是太好,所以中文应用很多时候都需要额外加一个中文分词器对中文进行分词处理,ik-analyzer就是其中一个不错的中文分词器. 一.版本信息 solr版本:4.7.0 需 ...
- Lucene系列四:Lucene提供的分词器、IKAnalyze中文分词器集成、扩展 IKAnalyzer的停用词和新词
一.Lucene提供的分词器StandardAnalyzer和SmartChineseAnalyzer 1.新建一个测试Lucene提供的分词器的maven项目LuceneAnalyzer 2. 在p ...
随机推荐
- 浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)
1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...
- Delphi Math里的基本函数,以及浮点数比较函数(转)
源:Delphi Math里的基本函数,以及浮点数比较函数 Delphi里的好东西太多,多到让人觉得烦.这种感觉就是当年打游戏<英雄无敌3>,改了钱以后,有钱了每天都要造建筑,明明是好事, ...
- STM32 USB 问题汇总(转)
源:STM32 USB 问题汇总 汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下 ...
- Dom编程(二)
document是window对象的一个属性,因为使用window对象成员的时候可以省略window.,所以一般直接写document document的方法: (1)write:向文档中写入内容. ...
- VS2010环境下使用VB开发网络编程(WinHttp)
首先点项目——>添加引用——>COM选项卡——>Microsoft WinHttp Services,version 5.1,然后点确定就可以添加Winhttp到项目引用中. 1.如 ...
- zend framework 1.10项目配置与经典hello world
准备工作 前置条件:PHP>=5.14,Apache开启mod_rewrite支持,开启php的pdo扩展. Zend Framework 要求 PHP版本不低于5.1.4,但强烈建议使用 5. ...
- bzoj2555
开始时间:19:40 完成时间:21:00 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2555 题目大意:(1):在当前字符串的后面插入一 ...
- DPM,DEM,DDPM的区别
此文来自我在CFD中国论坛中的一篇回复:http://www.cfd-china.com/topic/58/dem%E5%92%8Cdpm/21 正好这几天在研究fluent里的DEM,DPM和DDP ...
- 【续】强行在C# Winform中渲染Cocos2d-x 3.6
[前言] 上一篇讲了怎么把Cocos2d-x 3.6渲染进MFC窗体,这里来讲一下怎么在C# Winform中做到同样的功能.如果你不熟悉MFC的使用但对C# Winform比较在行,请往下看. 这一 ...
- HttpURLConnection从网上获取Json数据并解析详解
HttpURLConnection从网上获取Json数据并解析 1.HttpURLConnection请求数据的步骤 (1)构造一个URL接口地址: URL url = new URL("h ...