从CRF测试结果中提取出连续的标注行

现在在处理一批CRF标注的语料,需要将测试结果中标为B、I的行提取出来,对于连续的B、I标注行,要在一起抽出。如有以下测试语料标注结果(片断):
a a1 a2 O
b b1 b2 B
c c1 c2 I
d d1 d2 I
e e1 e2 O
f f1 f2 B
从中将b、c两行合在一起抽出,f行要单独抽取,目标结果格式如下:
[[[b,b1,b2,B],[c,c1,c2,I]],[f,f1,f2,B]]

解决思路:
1、利用根据字符切割的方法,将原始标注结果转为列表型数据。
2、设置前后两个游标,遍历列表中的每一句(标注结果中的空行表示句子结果),当发现有BI标注行时,将其抽取出来。

代码如下:

# -*- coding: utf8 -*- 
'''
Created on 2015-7-15

@author: admin
'''
sents=[]  #用于保存结果的列表
tempLine=[] #用于保存当前句的临时列表
for eachLine in open('corpus/0701/testResult.txt','r',encoding='utf8'): #逐行读取标结果文件
    if(eachLine!='\n'): #如果当前行不为空
        colList=eachLine[0:-1].split('\t'); #根据制表符进行分隔,得到当前行的各列数据
        tempLine.append(colList); # 将其追加到临时列表中
    else: #如果当前为空行
        sents.append(tempLine); #说明一句读完了,则添加到结果列表中
        tempLine=[]; #清空临时列表,等待下一句
# print(sents);

dict=[]; #用于保存最终结果的列表
for sentId in range(len(sents)): #遍历上述代码片断的结果中的句子
    tempDict=[]; #用于保存当前捕捉到的结果的临时列表
    firstWordId=0; #第一个遍历当前句子的游标
    while(firstWordId<len(sents[sentId])-1): # 开始循环
        if(sents[sentId][firstWordId][-1]!='O' ): #如果发现有非O行
            secondWordId=firstWordId+1; #设置第二个遍历当前句子的游标,从第一个游标的下一元素开始
            tempDict.append(sents[sentId][firstWordId]); #将当前行添加到临时表中
            while(secondWordId<len(sents[sentId])): #开始第二个游标的循环
                if(sents[sentId][secondWordId][-1]!='O'): #如果发现非O行
                    tempDict.append(sents[sentId][secondWordId]); #将当前行添加到临时表中

                else: #如果当前行的标注结果是O,说明前面发现的标结果已经捕捉完毕,
                    break; #中断第二个游标的循环
                secondWordId+=1; #改变内层循环变量
            dict.append(tempDict);#当内层循环结束时,说明已经发现了一组标注结果了,将他们整体添加到最终结果列表中
            tempDict=[]; #清空临时列表
        firstWordId+=1; #改变外层循环变量
print(dict) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值