转:CRF++词性标注

CRF++词性标注

2016-02-28 分类:NLP 阅读(5558) 评论(19)

训练和测试的语料都是人民日报98年标注语料,训练和测试比例是10:1,直接通过CRF++标注词性的准确率:0.933882。特征有一千多万个,训练时间比较长。机器cpu是48核,通过crf++,指定并线数量 -p为40,训练了大概七个小时才结束。

语料库、生成训练数据的python脚本、训练日志、模型、计算准确率脚本都上传到网盘,可以直接下载:戳我下载 CRF++词性标注,程序在centos6.5+python2.7下面运行通过,如果在win下或者ubuntu下可能会有异常,通常都是编码、路径规范等小问题,通过逐行debug脚本应该很容易找到问题,同时要确定crf++在自己机器本身编译没有问题,下面说一下每一步的过程。

文章目录 [展开]

生成训练和测试数据

生成训练和测试数据脚本:get_post_train_test_data.py,执行过程中会打印出来一些调试信息。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

#coding=utf8

import sys

#home_dir = "D:/source/NLP/people_daily//"

home_dir = "./"

def saveDataFile(trainobj,testobj,isTest,word,handle):

if isTest:

saveTrainFile(testobj,word,handle)

else:

saveTrainFile(trainobj,word,handle)

def saveTrainFile(fiobj,word,handle):

if len(word) > 0 and  word != "。" and word != ",":

fiobj.write(word + ‘\t‘ + handle  + ‘\n‘)

else:

fiobj.write(‘\n‘)

def convertTag():

fiobj    = open( home_dir + ‘people-daily.txt‘,‘r‘)

trainobj = open( home_dir +‘train.data‘,‘w‘ )

testobj  = open( home_dir  +‘test.data‘,‘w‘)

arr = fiobj.readlines()

i = 0

for a in sys.stdin:

i += 1

a = a.strip(‘\r\n\t ‘)

if a=="":continue

words = a.split(" ")

test = False

if i % 10 == 0:

test = True

for word in words[1:]:

print "---->", word

word = word.strip(‘\t ‘)

if len(word) > 0:

i1 = word.find(‘[‘)

if i1 >= 0:

word = word[i1+1:]

i2 = word.find(‘]‘)

if i2 > 0:

w = word[:i2]

word_hand = word.split(‘/‘)

print "----",word

w,h = word_hand

#print w,h

if h == ‘nr‘:    #ren min

#print ‘NR‘,w

if w.find(‘·‘) >= 0:

tmpArr = w.split(‘·‘)

for tmp in tmpArr:

saveDataFile(trainobj,testobj,test,tmp,h)

continue

saveDataFile(trainobj,testobj,test,w,h)

saveDataFile(trainobj, testobj, test,"","")

trainobj.flush()

testobj.flush()

if __name__ == ‘__main__‘:

convertTag()

执行训练和测试

设置模板为:

1

2

3

4

5

6

7

8

# Unigram

U00:%x[-2,0]

U01:%x[-1,0]

U02:%x[0,0]

U03:%x[1,0]

U04:%x[2,0]

U05:%x[-1,0]/%x[0,0]

U06:%x[0,0]/%x[1,0]

训练的时候的-p参数根据自己机器情况设置

1

2

crf_learn -f 3 -p 4 -c 4.0 template train.data model > train.rst

crf_test -m model test.data > test.rst

计算准确率

通过命令:python clc_f.py  test.rst 执行python脚本,clc_f.py中的具体程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

#!/usr/bin/python

# -*- coding: utf-8 -*-

import sys

if __name__=="__main__":

try:

file = open(sys.argv[1], "r")

except:

print "result file is not specified, or open failed!"

sys.exit()

wc = 0

wc_of_test = 0

wc_of_gold = 0

wc_of_correct = 0

flag = True

for l in file:

if l==‘\n‘: continue

_, g, r = l.strip().split()

if r != g:

flag = False

wc += 1

if flag:

wc_of_correct +=1

flag = True

print "WordCount from result:", wc

print "WordCount of correct post :", wc_of_correct

#准确率

P = wc_of_correct/float(wc)

print "准确率:%f" % (P)

实验结果

时间: 2024-10-14 10:52:30

转:CRF++词性标注的相关文章

隐马尔可夫(HMM)/感知机/条件随机场(CRF)----词性标注

笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 7. 词性标注 7.1 词性标注概述 什么是词性 在语言学上,词性(Par-Of-Speech, Pos )指的是单词的语法分类,也称为词类.同一个类别的词语具有相似的语法性质,所有词性的集合称为词性标注集.不同的语料库采用了不同的词性标注集,一般都含有形容词.动词.名词等常见词性.下图就是HanLP输出的一个含有词性的结构化句子. 我/r 的/u 希望/n 是/v 希望/v 张

NLP之CRF分词训练(六)

分三步1.先分词2.做BEMS标注,同时做词性标注3.训练模型 1.对语料进行分词 拿到测试部的语料或者其他渠道的语料,先对语料进行分词,我刚刚开始是用NS分词的,等CRF模型训练好后,可以直接用CRF进行分词,分完词后要人工核对分词结果,将分词分得不正确的地方修改好 2.标注词性,标注BEMS BEMS所说是中科院的提出一种标注,也有说BEIS的,hanlp用的是BEMSB:开始E:结束M/I:中间 S:单独BEMS标注已经写了一个方法generateCRF在SegAndSave.class中

条件随机场(CRF)-基础

条件随机场(conditional random fields,简称 CRF,或CRFs)下文简称CRF,是一种典型的判别模型,相比隐马尔可夫模型可以没有很强的假设存在,在分词.词性标注.命名实体识别等领域有较好的应用.CRF是在马尔可夫随机场的基础上加上了一些观察值(特征),马尔可夫随机场<=>概率无向图模型.本篇将首先介绍CRF的一些基础知识,然后介绍线性链条件随机场模型,关于模型的学习算法将放在第二篇中介绍,第三篇介绍CRF的应用. 1主要概念 1.1概率无向图模型 概率无向图模型是一种

七月算法-12月机器学习在线班--第十八次课笔记-条件随机场CRF

七月算法-12月机器学习在线班--第十八次课笔记-条件随机场CRF 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 1,对数线性模型 一个事件的几率odds,是指该事件发生的概率与该事件不发生的概率的比值. 1.1对数线性模型的一般形式 令x为某样本,y是x的可能标记,将Logistic/ Softmax回归的特征 记做 特征函数的选择:eg: 自然语言处理 1, 特征函数几乎可任意选择,甚至特征函数间重叠: 2, 每个特征之和当前的词

CRF工具包的使用

这里简要介绍一下CRF++使用的命令格式.参数调整.模板制作的基本过程. 百度经验:jingyan.baidu.com 工具/原料 CRF++ 百度经验:jingyan.baidu.com 方法/步骤 1 我下载的是CRF++0.58.zip的版本,解压. doc文件夹:就是官方主页的内容. example文件夹:有四个任务的训练数据.测试数据和模板文件.    sdk文件夹:CRF++的头文件和静态链接库.    crf_learn.exe:CRF++的训练程序.    crf_test.ex

CRF++地名实体识别(特征为词性和词)

http://x-algo.cn/index.php/2016/02/29/crf-name-entity-recognition/ 类似使用CRF实现分词和词性标注,地域识别也是需要生成相应的tag进行标注.这里使用的语料库是1998年1月人民日报语料集.最终学习出来的模型,对复杂的地名识别准确率(F值)非常低,推测是预料中对地名的标注多处是前后矛盾.例如  [华南/ns 地区/n]ns  标为地名实体,但是 东北/f 地区/n 确分开标注,类似错误还有很多.将来有时间可以考虑使用微软的词库 

条件随机场(CRF)原理和实现

版权声明:作者:金良山庄,欲联系请评论博客或私信,个人主页:http://www.jinliangxu.com/,CSDN博客: http://blog.csdn.net/u012176591 目录(?)[+] 作者:金良([email protected]) csdn博客: http://blog.csdn.net/u012176591 对数域操作函数 class Logspace: def __init__(self): self.LOGZERO =np.nan def eexp(self,

条件随机场CRF简介

http://blog.csdn.net/xmdxcsj/article/details/48790317 Crf模型 1.   定义 一阶(只考虑y前面的一个)线性条件随机场: 相比于最大熵模型的输入x和输出y,crf模型的输入输出都是序列化以后的矢量,是对最大熵模型的序列扩展. 相比于最大熵模型的另外一个不同是,crf多出了一个维度j(j表示序列x的位置),即任意一个输出yi,都跟所有的输入x有关. 经过变换,crf概率模型可以转化为: 先求一个位置x的所有特征,再求所有位置x 先求一个维度

条件随机场(CRF) - 1 - 简介(转载)

转载自:http://www.68idc.cn/help/jiabenmake/qita/20160530618222.html 首先我们先弄懂什么是"条件随机场",然后再探索其详细内容. 于是,先介绍几个名词. 马尔可夫链 比如:一个人想从A出发到达目的地F,然后中间必须依次路过B,C, D, E,于是就有这样一个状态: 若想到达B,则必须经过A: 若想到达C,则必须经过A, B: 以此类推,最终 若想到达F,则必须经过A,B,C,D,E. 如果把上面的状态写成一个序列的话,那就是: