最详细NER实战讲解-bilstm+crf(2)数据预处理

本文介绍了一种文本处理方法,通过细致地过滤特殊字符、识别并决定是否在换行符、数字等情况后断句,确保生成适合作为模型输入的短句,以提高LSTM和RNN处理文本的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.找到分隔符的index

2.过滤特殊字符串 同时也是将文本分割为长短句

3.处理长短句问题


1.找到分隔符的index

我们写个测试一下

输出值为

匹配到的:,有一个span 就是找到的标点符号的起始位置和结束位置

为了展示的更清楚一些span所表示的东西 我们再写个测试

 

 可以看到在第一个输出中span[0]就是,的下标 span[1]是后面的‘预’的下标

后面就表示为m.span[0]  (在循环中)



2.过滤特殊字符串 同时也是将文本分割为长短句

考虑多种不能作为分隔符的特殊情况

 为了判断标点符号前有\t换行符 是否应该断开我们写一个测试

if __name__ == '__main__':
    files = os.listdir(train_dir)
    files = set([file.split('.')[0] for file in files])
    for file in files:
        path=os.path.join(train_dir,file+'.txt')
        with open(path,'r',encoding='utf8') as f:
            text = f.read()
            pattern1 = '。|,|,|;|;|\.|\?'
            for m in re.finditer(pattern1, text):
                idx = m.span()[0]  # 就是标点符号的下标 然后根据各个情况判断是否要断开 就是根据标点符号后面的内容决定的
                if text[idx - 1] == '\n':
                    print(file, text[idx-10:idx+10])  # 如果前面是换行符 就打印出当前文章的file 然后打印出前后的内容 idx+-10

然后就要找到文档中找到对应的文段 判断能不能分 后面也可以依照这个是否断开看对整个模型的性能有没有提升

在我们查看相关文档后判断为 不作为分割点 所以直接continue就行了

同样的 我们继续找特殊情况

files = os.listdir(train_dir)
    files = set([file.split('.')[0] for file in files])
    for file in files:
        path=os.path.join(train_dir,file+'.txt')
        with open(path,'r',encoding='utf8') as f:
            text = f.read()
            pattern1 = '。|,|,|;|;|\.|\?'
            for m in re.finditer(pattern1, text):
                idx = m.span()[0]  # 就是标点符号的下标 然后根据各个情况判断是否要断开 就是根据标点符号后面的内容决定的
                if text[idx-1].isdigit() and text[idx+1].isdigit() :
                    print(file, text[idx-20:idx+20]) 

如果标点符号前后都是数字 再输出一下

 很容易看出 这种情况也不应该split

同样的 数字加空格加数字的类型 也不能断开

完整过滤特殊字符代码:

def split_text(text):
    split_index = []
    pattern1 = '。|,|,|;|;|\.|\?'
    for m in re.finditer(pattern1, text):
        idx = m.span()[0]  # 就是标点符号的下标 然后根据各个情况判断是否要断开 就是根据标点符号后面的内容决定的
        if text[idx-1]=='\n':
            continu
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、付费专栏及课程。

余额充值