最详细NER实战讲解-bilstm+crf(6)数据增强

为什么要做数据增强?提高模型学习各种长短句子的能力

import pandas as pd
import pickle
import numpy as np
from tqdm import tqdm
import os




# 先把所有的数据 拼接 融合在一起 将所有的字全部换成对应的下标
def get_data_with_windows(name='train'):
    with open (f'data/prepare/dict.pkl', 'rb') as f:
        map_dict = pickle.load(f)
    
    def item2id(data, w2i):
        return  [w2i[x] if x in w2i else w2i['UNK'] for x in data]
    results = []
    root = os.path.join('data/prepare', name)
    files = list(os.listdir(root))
    
    for file in tqdm(files):
        result =[]
        path =  os.path.join(root, file)
        samples = pd.read_csv(path, sep=',')
        num_samples = len(samples)
        sep_index = [-1]+samples[samples['word'] == 'sep'].index.tolist() + [num_samples] # 拿到分割的那些行的下表  # 20 40 50 没有0和最后一个
        
################获取句子并将句子全部转化为id
        for i in range(len(sep_index)):
            start = sep_index[i] + 1
            end = sep_index[i+1]
            data = []
            for feature in samples.columns:  #访问每一列    
                data.append(item2id(list(samples[features])[start:end], map_dict[feature][1]))
            result.append(data)   # 一句话
          
            

怎么做数据增强 要怎么拼接?

两个拼接

# 数据增强
# 两句话两句话拼接  把两个句子的每一个特征都要拼接到一起
two = []
for i in range(len(result)-1):  # -1 10个只能拼接成9个出来
    first=result[i]
    second = result[i+1]
    two.append([first[i]+sencond[k] for k in range(len(first))])
    

三个拼接 道理一样

three = []
for i in range(len(result)-2):
    first = result[i]
    second = result[i+1]
    third = result[i+2]
    three.append([firstp[k] + second[k] + third[k] for k in range(len(first))])

然后把two three result 全部extend到results里面

相当于 把长短句全部放到results里面

    results.extend(result+two+three)
return results

results里面就是我们所有拼接的句子

这里返回之后可以直接写到文件里面去 这样可以避免每次运行都要加载很久的情况 直接读文件就可以了

就改成 

with open(f'data/prepare/' + name +'.pkl', 'wb') as f:
    pickle.dump(results, f)

然后测试一下

if __name__ == '__main__':
    print(get_data_with_windows('train'))

然后 定义batch_manager

class BatchManager(object):
    def __init__(self, batch_size, name='train'):
        with open(f'data/prepare/'+name+'.pkl', 'rb') as f:
            data = pickle.load(f)
        self.batch_data = self.sort_and_pad(data, batch_size)
        self.len_data = len(self.batch_data)
    def sort_and_pad(self, data, batch_size):
        num_batch = int(match.ceil(len(data) /batch_size))  # 总共有多少个批次
        sorted_data = sorted(data, key=lambda x: len(x[0]))  # 按照句子长度排序
        batch_data = list()
        for i in range(num_batch):
            batch_data.append(self.pad_data(sorted_data[i*int(batch_size) : (i+1)*int(batch_size)]))
        return batch_data
    @staticmethod
    def pad_data(data):
        chars = []
        bounds = []
        flags = []
        radicals = []
        pinyins = []
        targets = []
        max_length = max([len(sentence[0]) for sentence in data])
        for line in data:
            char, bound, flag, target, radical, pinyin = line  
            padding = [0] * (max_length - len(char))
            chars.append(char + padding)
            bounds.append(bound + padding)
            flags.append(flag + padding)
            targets.append(target + padding)
            radicals.append(radical + padding)
            pinyins.append(pinyin + padding)
        return [chars, bounds, flags, radicals, pinyins, targets]
    def iter_batch(self, shuffle=False):
        if shuffle:
            random.shuffle(self.batch_data)
        for idx in range(self.len_data):
            yield self.batch_data[idx]   # yield 每次拿一个批次

if __name__ == '__main__':
    # 先把数据写进去
    get_data_with_windows('train')
    # train_data = Batch_Manager(10, 'train')

生成train.pkl之后 再batch_manager

然后对测试集也要处理一下 直接'train' 改'test'就行了  到此 所有的数据准备就完成了 之后只需要构建模型然后训练就行了

Character-level BiLSTM + Word-level BiLSTM + CRF模型是一种用于序列标注任务的神经网络架构,特别适用于命名实体识别(NER)等任务。该模型结合了字符级别的双向长短期记忆网络(BiLSTM)和词级别的BiLSTM,并通过条件随机场(CRF)进行解码,以实现高效的序列标注。 以下是该模型的结构图示: ``` 输入句子 -> [字符嵌入层] -> [字符级别BiLSTM] -> [词向量拼接] -> [词级别BiLSTM] -> [CRF层] -> 输出标签 ``` 具体步骤如下: 1. **字符嵌入层**:将每个字符映射为一个向量,形成字符级别的嵌入表示。 2. **字符级别BiLSTM**:对每个词的字符嵌入序列进行双向LSTM处理,捕捉字符级别的上下文信息。 3. **词向量拼接**:将字符级别BiLSTM的输出与预训练的词向量(如Word2Vec或GloVe)进行拼接,得到每个词的终表示。 4. **词级别BiLSTM**:对词级别的嵌入序列进行双向LSTM处理,捕捉词级别的上下文信息。 5. **CRF层**:使用条件随机场对词级别的BiLSTM输出进行解码,生成终的标签序列。 这种模型的优点在于: 1. **字符级别建模**:通过字符级别的BiLSTM,可以捕捉到词内部的形态学特征,如前缀、后缀等。 2. **词级别建模**:通过词级别的BiLSTM,可以捕捉到词与词之间的依赖关系。 3. **CRF解码**:CRF层能够有效建模标签之间的依赖关系,提高序列标注的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lyttonkeepgoing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值