欢迎来到皮皮网网首页

【中医知识网站源码】【aspx源码加密】【空包源码系统】crf源码tensorflow

来源:严明阳筹码指标源码 时间:2024-12-24 04:10:35

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通过一系列特征预测每个词语的标签,这些标签对应着特定场景的实体类型。然而,特征工程成为关键挑战,需要根据场景人工提取特征,如基于词性或特定规则。aspx源码加密深度学习的引入简化了这一过程,通过自动学习特征,显著提高了NER的性能。以下将深入探讨基于深度学习的NER实现。

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

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

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

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

       在近期的项目中,我利用条件随机场(CRF)解决了一个任务,取得了不错的效果,因此决定整理一下我对CRF的dll辅助源码理解和实践经验。本文将从理论出发,介绍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的工作原理,不仅能够解决具体问题,还能够为后续的自然语言处理任务提供坚实的基础。