皮皮网

皮皮网

【天天红包 源码】【https的c源码】【图床源码对接】crf源码tensorflow

时间:2024-12-29 18:35:00 分类:时尚

1.NLP命名体识别bilstm+crf
2.基于深度学习的命名实体识别详解(附Github代码)
3.NLP.TM[19] | 条件随机场知识整理(超长文)

crf源码tensorflow

NLP命名体识别bilstm+crf

        """

        NLP命名体识别bilstm+crf

        1、准备数据:origin_handle_entities()

        读取源数据文件,把人名,地名,机构名合并起来

        2、读取处理后的数据:origin_handle_mark()

        把预处理后的的文本标注成BMO的格式,

        B(begin)、M(middle)、E(end)、O(other)

        3、句子切分:sentence_split()

        按照指定的格式,比如标点等内容对数据完成切分

        4、保存数据

        a.将标注的句子拆分自成列表和对应的标注序列

        b.创建词汇表和标签

        c.文本的向量化表示

        d.划分训练集和测试集

        e.保存成二进制pkl文件

        5、加载数据

        6、训练模型BiLSTM&HMM

        7、保存训练后的模型用于预测

        8、预测

        """

        import codecs

        import re

        import collections

        import pickle

        import TorchCRF as CRF

        import numpy as np

        from tensorflow.keras.preprocessing.sequence import pad_sequences #使用tensorflow的pad_sequences进行数据对齐 tensorflow2.3.1

        from sklearn.model_selection import train_test_split

        def origin_handle_entities():

        with open('renmin.txt','r',encoding='utf-8') as inp,

        open('middle/renmin2.txt','w',encoding='utf-8')

        as outp:

        #读取源文件中的数据

        for line in inp.readlines():

        #按照空格切分

        line = line.split(' ')

        i = 1

        while i < len(line) - 1:

        if line[i][0] == '[':

        outp.write(line[i].split('/')[0][1:])

        i += 1

        while i < len(line) - 1 and line[i].find(']') == -1:

        if line[i] !='':

        #print(line[i].split('/')[0])

        outp.write(line[i].split('/')[0])

        i += 1

        outp.write(line[i].split('/')[0].strip()+'/'+line[i])

        elif line[i].split('/')[1] == 'nr':

        word = line[i].split('/')[0]

        i += 1

        if i < len(line) - 1 and line[i].split('/')[1] == 'nr':

        outp.write(word + line[i].split('/')[0] + 'nr')

        else:

        outp.write(word + '/nr ')

        continue

        else:

        outp.write(line[i] + '/no ')

        i += 1

        outp.write('\n')

        import codecs

        def origin_handle_mark():

        """

        1、读取数据预处理后的renmin2.txt

        2、将标注好的数据写入renmin3.txt

        a.打开输入和输出文件

        b.遍历输入文件renmin2.txt

        :return:

        """

        with codecs.open('middle/renmin2.txt','r',encoding='utf-8') as inp,

        codecs.open('middle/renmin3.txt','w',encoding='utf-8') as outp:

        #########句子切分###################################

        import re

        def sentence_split():

        with codecs.open('middel/renmin3.txt','r',encoding='utf-8') as inp,

        codecs.open('middle/renmin4.txt','w',encoding='utf-8') as outp:

        #文本文件的内容设置为对应的utf-8编码,python3:先encode,再decode

        texts = inp.read().encode('utf-8').decode('utf-8')

        #切分句子

        sentences =

        re.split('[,。!?、''"":]/[0]'.encode('utf-8').decode('utf-8'),

        texts)

        for sentence in sentences:

        if sentence != ' ':

        outp.write(sentence.strip() + '\n')

        def data_to_pkl():

        """

        将文本数据保存成二进制pkl文件

        :return:

        """

        def main():

        # 数据清洗

        origin_handle_entities()

        #数据标注(字)

        origin_handle_mark()

        # 句子切分

        sentence_split()

        # 数据转换

        data_to_pkl()

        if name== 'main':

        main()

        ##################################################################################################

        def load_data():

        pickle_path = '../data_target_pkl/renmindata.pkl'

        with open(pickle_path,'rb') as inp:

        word2id,id2word,tag2id,id2tag,x_train,y_train,x_test,y_test,x_valid,y_valid =pickle.load(inp)

        def main():

        word2id = load_data()

        print(len(word2id))

        if name== 'main':

        main()

        #######################################################################################

        import torch

        import torch.nn as nn

        from torch.utils.data import Dataset # 批量读取数据

        class NERDataSet(Dataset):

        """

        X:表示样本,Y:表示标签

        """

        def init(self,X,Y, args, *kwargs):

        """

        class Config():

        embedding_dim = #词向量的维度

        hidden_dim =

        config = Config()

        class NERLSTM_CRF(nn.Module):

        """

        1、输入层

        2、词映射(Embedding(vocab_size,embedding_dim))

        3、LSTM

        4、全连接层

        """

        def init(self):

        super(NERLSTM_CRF,self).init()

        self.embeding_dim = config.embeding_dim

        self.hidden_dim = config.hidden_dim

        self.vocab_size = config.vocab_size

        self.num_tags = config.num_tags

        ##################################################

        from torch.utils.data import DataLoader #批量加载数据

        import torch

        import torch.optim as op

        def utils_to_train():

        device = torch.device('cpu')

        max_epoch = 1

        batch_size =

        num_workers =4 #开启几个线程取执行程序

        def parse_tags(text,path):

        id2tag = load_data()

        tags = [id2tag[idx] for idx in path]

        ##################################################

        from sklearn.metrics import classification_report,precision_score,recall_score,f1_score

        word2id = load_data()[0]

        max_epoch,device,train_data_loader,valid_data_loader,test_data_loader,model = utils_to_train()

        class ChineseNER(object):

        def train(self):

        for epoch in range(max_epoch):

基于深度学习的命名实体识别详解(附Github代码)

       命名实体识别(NER)作为自然语言处理的基石,广泛应用于人名、地名识别,电商产品命名以及药物名称解析等领域。传统的NER解决方案常采用条件随机场(CRF)模型,它是天天红包 源码一种用于标注或分析序列数据的判别式概率模型。在NER中,CRF通过一系列特征预测每个词语的标签,这些标签对应着特定场景的实体类型。然而,特征工程成为关键挑战,需要根据场景人工提取特征,如基于词性或特定规则。https的c源码深度学习的引入简化了这一过程,通过自动学习特征,显著提高了NER的性能。以下将深入探讨基于深度学习的NER实现。

       在深度学习框架中,如TensorFlow,利用双向循环神经网络(Bi-RNN)与条件随机场(CRF)进行NER任务的解决,展示了其优越性。Bi-RNN能够捕获序列中的前后文信息,而CRF则用于预测序列标签,两者结合能够高效地识别命名实体。深度学习的图床源码对接自动化特征学习特性,使得开发者无需人工提取特征,简化了模型构建过程。

       面对深度学习模型对输入数据类型的要求,通常采用预训练词向量(如gensim word2vec、glove等)将文本转换为数值表示。对于训练数据不足的问题,通过从大型新闻集等资源中获取数据进行预训练词向量,可以有效提升模型泛化能力。对于未见过的词,预训练词向量能够通过词的上下文信息提供一定支持,减少未知词对模型性能的影响。

       整个流程包括数据预处理、燕窝溯源码大展特征向量化、模型训练和评估。实现细节可通过访问github.com/shiyybua/NER获取,该仓库提供有中文注释的代码,实现简单且易于上手。理解深度学习在NER任务中的应用,掌握从数据预处理到模型部署的全过程,将有助于提高命名实体识别的准确性和效率。

NLP.TM[] | 条件随机场知识整理(超长文)

       在近期的项目中,我利用条件随机场(CRF)解决了一个任务,取得了不错的效果,因此决定整理一下我对CRF的火鸟门户源码7.3理解和实践经验。本文将从理论出发,介绍CRF的基本概念、理论框架,以及如何在实际问题中应用CRF。

       ### 理论框架

       条件随机场(CRF)是一种基于概率的序列标注模型,它从概率无向图出发,通过引入条件随机场的概念,定义了在已知特定位置的标签和其相邻标签的条件下,不同标签出现的概率。CRF尤其适用于序列标注问题,如命名实体识别、句子分词等。

       #### 条件随机场定义

       CRF定义的核心是对于给定位置的标签Y,其在已知特征和相邻标签条件下出现的概率,与已知特征但相邻标签不同条件下出现的概率是相同的。这种定义在链式条件随机场中表现得更为清晰。理解这一定义是基础,但还不够,为了进行预测,我们还需要知道P(y|x)的直接关系,这里需要引入图论中的“团”概念来分解问题。

       #### 条件随机场形式

       CRF的参数化形式通过Hammersley-Clifford定理给出,其中的势函数一般采用指数函数形式。通过数学期望的概念,我们可以推导出线性链条件随机场的参数化形式。参数化形式由特征函数和权重组成,权重被抽象为待估参数,最终得到的公式为:

       矩阵形式的CRF参数化表达式为:

       这里的公式展示了CRF如何通过特征函数和权重矩阵来描述概率分布,为后续的模型训练和预测提供了数学基础。

       ### 条件随机场作为判别模型

       虽然CRF在形式上与生成模型相似,但实际上它是一个判别模型。判别模型与生成模型的区别在于训练过程和目标不同。CRF通过最小化损失函数来学习参数,而不需要联合概率分布,这使其成为判别模型。

       判别模型的核心在于直接学习输入特征到输出标签的映射关系,通过优化损失函数实现参数学习。CRF通过损失函数的最小化,学习到特征与标签之间的关系,从而直接进行预测。

       ### 实际应用

       CRF在实际应用中,有多种实现方式,如TensorFlow和CRF++。TensorFlow提供了CRF接口,通过`tf.contrib.crf.crf_log_likelihood`接口计算对数似然值,使用维特比算法进行预测。而CRF++则是一个基于C++的序列标注工具,支持多种编程语言接口,通过构建规则模板来定义CRF结构。

       #### TensorFlow实现

       在TensorFlow中实现CRF主要通过`crf_log_likelihood`接口计算对数似然值,以及使用维特比算法进行预测。关键在于正确设置输入向量和状态转移矩阵。

       #### CRF++实现

       CRF++提供了序列标注功能,通过构建规则模板来定义CRF结构。使用规则模板可以轻松地设置CRF参数,进行训练和测试。CRF++通过命令行工具`crf_learn`和`crf_test`进行模型训练和预测。

       ### 总结

       通过理论学习和实际应用,我们掌握了条件随机场的核心概念和使用方法。无论是TensorFlow还是CRF++,它们都提供了实现序列标注任务的强大工具。理解CRF的工作原理,不仅能够解决具体问题,还能够为后续的自然语言处理任务提供坚实的基础。