最详细NER实战讲解-bilstm+crf(3)获取标签

import os

import pandas as pd

from collections import Counter

from data_process import split_text

from tqdm import tqdm

import jieba.posseg as psg # 结巴的词性标注



train_dir = '自己写'
def process_text(idx, split_method=None):
    """
    idx:文件的名字 不要扩展名
    split_method:切割文本的方法 是一个函数
    这个函数的目的: 读取文本 切割 然后打上标记 并提取 词边界,词性,偏旁部首,拼音等文本特征
    """
    data = {} # 用来保存我们所有的字的文本特征
    
#————————————————————————————————————获取句子—————————————————————————————————————————————#
    if split_method is None:
        with open(f'../data/{train_dir}/{idx}.txt', 'r', encoding='utf8') as f:   # 可以根据我们每次传进来的idx读取不同的文件
            texts = f.readlines()
    else:
        with open(f'../data/{train_dir}/{idx}.txt', 'r', encoding='utf8') as f:
            texts = f.read()
            texts = split_method(texts)
    data['word'] = texts   # 将提取出来的句子 赋值给字典data的word键!!!!

获取标签

怎么打标签 先给拿到的每一个字都打上O标记  获取到的数据是一个很长的列表 列表里面很多字符串 那么就给列表里的每一个元素标上O

tag_list = ['O' for s in texts for x in s]  #先遍历texts里的每一句话 再遍历每一句话里的每一                                                            
return tag_list                                                                     # 个字
                                                                      

读取这个文件对应的ann文件 然后拿到ann文件的 实体类别 和起始位置终止位置  找到下标为[1845, 1850]的 把下标改成Disease

tag = pd.read_csv(f'datas/{train_dir}/{idx}.ann',header=None, seq='\t')  #没有表头 分隔符用的\t
for i in range(tag.shape[0]):  # 行遍历
    
    tag_item = tag.iloc[i][1].split(' ')   # 取行下标为i 列下表为1的 也就是Disease 1845 1850  然后按 空格隔开
    cls, start, end = tag_item[0], int(tag_item[1]), int(tag_item[-1])
    # print(tag_item)
    tag_list[start] = 'B-' + cls                # 要终止位置减一才是实体的最后位置
    for j in range(start+1, end):
        tag_list[j] = 'I-' + cls
assert len([x for s in texts for x in s]) == len(tag_list)  #双重for s是texts里的句子 先把句子遍历出来 x是一个句子里有多少个字 再把字遍历出来 返回的是x
    
return tag_list    # 看标签打好了没有
        

打上标签这部分是非常重要的 也是经常用到的

统计一下 texts里面有多少个字

for s in texts:
    l = len(s)
    end += 1 
    tags.append(tag_list[start:end])
    start += 1
data['label'] = tags
return texts, tags

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lyttonkeepgoing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值