Python-NER-CRF

【学习笔记】model.compile方法中metrics评价函数 关于model.compile方法中metrics评价函数的总结 问题引入   大家会发现我们在做实验的过程中,经常会发现在Model.compile的过程中会需要写一个参数比如:metrics=['accuracy'],那么这个时候一般情况下很少有文章或者代码注释中会提及这个参数选择的原因或者意义,尤其是笔者前期是个小白,一开始接连做的都是几个二分类的神经网络实验,甚至一度以为只要一直写metrics=['accuracy']就不会报什么错。但这种想法其实是错误且荒谬的,这个参数其实在面对不同的数据集 阅读详情

投票模型

import pandas as pd
from sklearn.metrics import classification_report

# 数据
df = pd.read_csv('train.csv').fillna(method='ffill')

X = df.Word.values
y = df.Tag.values

labels = df.Tag.unique().tolist()
labels.remove('O')


# 投票模型
class Majority_vote:
    def fit(self, X, y):
        counter = {}
        for w, t in zip(X, y):
            if w in counter:
                if t in counter[w]:
                    counter[w][t] += 1
                else:
                    counter[w][t] = 1
            else:
                counter[w] = {t: 1}
        self.vote = {}
        for w, t in counter.items():
            self.vote[w] = max(t, key=t.get)
        return self

    def predict(self, X):
        return [self.vote.get(x, 'O') for x in X]

y_pred = Majority_vote().fit(X, y).predict(X)
report = classification_report(y, y_pred, labels)
print(report)

条件随机场


以下为链式CRF算法~

import pandas as pd
from sklearn_crfsuite import CRF
from sklearn_crfsuite.metrics import flat_classification_report

# 数据读取、预处理
data = pd.read_csv('train.csv').fillna(method='ffill')

labels = data.Tag.unique().tolist()
labels.remove('O')

# 按句子分组
f = lambda s: [(w, p, t) for w, p, t in zip(
    s.Word.values, s.POS.values, s.Tag.values)]
sentences = list(data.groupby('Sentence #').apply(f))

# 特征提取
def word2features(sent, i):
    word = sent[i][0]
    postag = sent[i][1]

    features = {
        'bias': 1.0,
        'word.lower()': word.lower(),
        'word[-3:]': word[-3:],
        'word[-2:]': word[-2:],
        'word.isupper()': word.isupper(),
        'word.istitle()': word.istitle(),
        'word.isdigit()': word.isdigit(),
        'postag': postag,
        'postag[:2]': postag[:2],
    }
    if i > 0: # word_prev, word_curr
        word1 = sent[i-1][0]
        postag1 = sent[i-1][1]
        features.update({
            '-1:word.lower()': word1.lower(),
            '-1:word.istitle()': word1.istitle(),
            '-1:word.isupper()': word1.isupper(),
            '-1:postag': postag1,
            '-1:postag[:2]': postag1[:2],
        })
    else:
        features['BOS'] = True

    if i < len(sent)-1:
        word1 = sent[i+1][0]
        postag1 = sent[i+1][1]
        features.update({
            '+1:word.lower()': word1.lower(),
            '+1:word.istitle()': word1.istitle(),
            '+1:word.isupper()': word1.isupper(),
            '+1:postag': postag1,
            '+1:postag[:2]': postag1[:2],
        })
    else:
        features['EOS'] = True

    return features


def tpl2feature(sent):
    return [word2features(sent, i) for i in range(len(sent))]


def tpl2labels(sent):
    return [label for token, postag, label in sent]


X = [tpl2feature(s) for s in sentences]
y = [tpl2labels(s) for s in sentences]

# 建模、训练、预测、汇报
crf = CRF(algorithm='lbfgs', c1=.1, c2=.1, max_iterations=99).fit(X, y)
y_pred = crf.predict(X)
report = flat_classification_report(y, y_pred, labels)
print(report)

BiLSTM-CRF

"""Train CRF and BiLSTM-CRF on CONLL2000 chunking data,
https://arxiv.org/pdf/1508.01991v1.pdf"""
from numpy import asarray
from collections import Counter

from keras.models import Sequential
from keras.layers import Embedding, Bidirectional, LSTM
from keras_contrib.layers import CRF
from keras_contrib.losses import crf_loss
from keras_contrib.metrics import crf_viterbi_accuracy
from keras_contrib.datasets import conll2000

EPOCHS = 10
EMBED_DIM = 200
BiRNN_UNITS = 200


def classification_report(y_true, y_pred, labels):
    """Similar to the one in sklearn.metrics,
    reports per classs recall, precision and F1 score"""
    y_true = asarray(y_true).ravel()
    y_pred = asarray(y_pred).ravel()
    corrects = Counter(yt for yt, yp in zip(y_true, y_pred) if yt == yp)
    y_true_counts = Counter(y_true)
    y_pred_counts = Counter(y_pred)
    report = ((lab,  # label
               corrects[i] / max(1, y_true_counts[i]),  # recall
               corrects[i] / max(1, y_pred_counts[i]),  # precision
               y_true_counts[i]  # support
               ) for i, lab in enumerate(labels))
    report = [(l, r, p, 2 * r * p / max(1e-9, r + p), s) for l, r, p, s in report]

    print('{:<15}{:>10}{:>10}{:>10}{:>10}\n'.format('', 'recall', 'precision', 'f1-score', 'support'))
    formatter = '{:<15}{:>10.2f}{:>10.2f}{:>10.2f}{:>10d}'.format
    for r in report:
        print(formatter(*r))
    print('')
    report2 = list(zip(*[(r * s, p * s, f1 * s) for l, r, p, f1, s in report]))
    N = len(y_true)
    print(formatter('avg / total', sum(report2[0]) / N, sum(report2[1]) / N, sum(report2[2]) / N, N) + '\n')


# conll200 has two different targets, here will only use
# IBO like chunking as an example
train, test, voc = conll2000.load_data()
(train_x, _, train_y) = train
(test_x, _, test_y) = test
(vocab, _, class_labels) = voc

# --------------
# 1. Regular CRF
# --------------

print('==== training CRF ====')

model = Sequential()
model.add(Embedding(len(vocab), EMBED_DIM, mask_zero=True))  # Random embedding
crf = CRF(len(class_labels), sparse_target=True)
model.add(crf)
model.summary()

# The default `crf_loss` for `learn_mode='join'` is negative log likelihood.
model.compile('adam', loss=crf_loss, metrics=[crf_viterbi_accuracy])
model.fit(train_x, train_y, epochs=EPOCHS, validation_data=[test_x, test_y])

test_y_pred = model.predict(test_x).argmax(-1)[test_x > 0]
test_y_true = test_y[test_x > 0]

print('\n---- Result of CRF ----\n')
classification_report(test_y_true, test_y_pred, class_labels)

# -------------
# 2. BiLSTM-CRF
# -------------

print('==== training BiLSTM-CRF ====')

model = Sequential()
model.add(Embedding(len(vocab), EMBED_DIM, mask_zero=True))  # Random embedding
model.add(Bidirectional(LSTM(BiRNN_UNITS // 2, return_sequences=True)))
crf = CRF(len(class_labels), sparse_target=True)
model.add(crf)
model.summary()

model.compile('adam', loss=crf_loss, metrics=[crf_viterbi_accuracy])
model.fit(train_x, train_y, epochs=EPOCHS, validation_data=[test_x, test_y])

test_y_pred = model.predict(test_x).argmax(-1)[test_x > 0]
test_y_true = test_y[test_x > 0]

print('\n---- Result of BiLSTM-CRF ----\n')
classification_report(test_y_true, test_y_pred, class_labels)

附录

?

encn
Named Entity Recognition命名实体识别
Conditional Random Field条件随机场
entity实体;存在;本质
majorityn. 多数
votevi. 选举;vt. 提议
votingadj. 投票的;n. 投票;选举

github地址
https://github.com/AryeYellow/PyProjects/blob/master/NLP/NER_CRF/Python命名实体识别.ipynb

keras.metrics中的accuracy keras.metrics有六种accuracy,其使用的场景如下: accuracy 真实标签和模型预测均为标量,如真实标签为[0,1,1,0,2,0],模型输出的预测为[0,2,1,1,2,0],此时accuracy=4/6 categorical_accuracy ​​​​​​​真实标签为onehot标签,模型预测为向量形式。如真实标签为[[0, 0, 1], [0, 1... 阅读详情

相关推荐

数据分析师养成之路--keras学习中metrics和callbacks笔记

complie中的metrics参数 model.compile(...metrics=['accuracy']) 如上, metrics中有两个arguments,y_true,和y_pred 它所接收的评估指标为,损失函数,(mse等)和准确率(accuracy等),它们都作用于训练集和验证集(eg: loss:..acc..mae .. val_loss:..val_a...

鲁鲁酱的博客 9332

model.compile中metrics的参数accuracy

知乎大佬链接 model.compile(optimizer = tf.keras.optimizers.Adam(0.01), loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False), metrics = ['categorical_accuracy']) 1.简述 Index Parameter Label Feature 1 accura

LLABVIEW的博客 1万+

机器学习算法之命名实体识别(NER)详解

在NLP中,命名实体是文本中具有特定名称或意义的实体。人名(例如:“乔布斯”)地名(例如:“巴黎”)组织机构名(例如:“联合国”)日期和时间(例如:“2023年9月17日”)货币(例如:“美元”)百分比(例如:“50%”)NER的任务是在文本中识别和分类这些命名实体。

DeepViewInsight的博客 4323

浅谈keras中自定义二分类任务评价指标metrics的方法以及代码

浅谈keras中自定义二分类任务评价指标metrics的方法以及代码更多python视频教程请到菜鸟教程https://www.piaodoo.com/ 对于二分类任务,keras现有的评价指标只有binary_accuracy,即二分类准确率,但是评估模型的性能有时需要一些其他的评价指标,例如精确率,召回率,F1-score等等,因此需要使用keras提供的自定义评价函数功能构建出针对二分类任务的各类评价指标。 keras提供的自定义评价函数功能需要以如下两个张量作为输入,并返回一个张量作为输

菜鸟教程 7005

crf graph matlab_模型固化(深度神经网络+crf分词以及NER)

小孔同学推荐了两个基于循环神经网络以及CRF处理nlp问题的算法,分别是中分分词以及命名实体识别,都是github上开源的项目,之前也用过一些开源的分词工具以及产品级分词工具,比如波森nlp,发现github上这两个【BiLSTM+CRF】 【NeuroNER】,效果都非常不错,感谢koth 以及 Franck Dernoncourt。在这不分析模型,只说下把两个模型frozen一下,然后一块封装...

weixin_36068796的博客 320

NLP实战:Python实现命名实体识别模型训练

使用Python实现NER任务并不是太难,只需要熟练掌握相关技术和工具,就可以快速构建一个高效的NER模型。在NLP中,NER任务是指识别文本中具有特定含义的实体,并把它们分类到预定义的类型中。通过对F1-score的评估,我们可以了解模型的性能表现,并进行必要的调整。在本例中,我们使用了Kaggle上的一个公开数据集,包含了英文新闻文章及其对应的命名实体标注。在完成NER模型的搭建后,我们就可以开始训练模型了。在训练NER模型之前,需要对数据进行预处理,使其能够适应模型的输入要求。一、NER的背景知识。

code_welike的博客 879

pytorch-bert-crf-ner 的安装和配置教程

pytorch-bert-crf-ner 的安装和配置教程 1. 项目基础介绍和主要编程语言 pytorch-bert-crf-ner 是一个基于 PyTorch 深度学习框架的开源项目,用于实现命名实体识别(Named Entity Recognition,NER)。该项目利用 BERT 模型进行特征提取,结合 CRF(Conditional Random Field)模型进行实体识别。主要编程...

gitblog_00992的博客 958

Python实现的BiLSTMCRF模型及其在中文NER中的应用

随机场(Markov Random Field,MRF)是概率图模型的一种,它描述了一组随机场变量之间的依赖关系。MRF一般用于无向图中,其中每个节点代表一个变量,节点间的边表示变量间的相互作用。在自然语言处理(NLP)中,随机场可以用于图像分割、语音识别和词性标注等任务。条件随机场(Conditional Random Field,CRF)是一种特殊的概率图模型,属于判别式模型,与生成式模型不同,它直接对条件概率P(Y|X)建模,而不是像生成式模型那样对联合概率分布P(X,Y)建模。

weixin_31715353的博客 904

探索 Easy_NER_biLSTM_CRF:轻松实现命名实体识别

探索 Easy_NER_biLSTM_CRF:轻松实现命名实体识别 在自然语言处理(NLP)领域,命名实体识别(NER)是一项核心任务,它涉及到从文本中自动提取出如人名、地名、组织名等特定类型的实体。 是一个简洁而高效的Python库,专为初学者和开发者提供便利的NER解决方案。让我们深入了解一下这个项目的技术特性,应用场景,以及如何开始使用它。 项目简介 Easy_NER_biLSTM_CRF...

gitblog_00072的博客 949

宇树开源人形机器人基座模型UnifoLM-WLA-1.0:从VLA到真机部署的完整解读

人形机器人正在从传统控制栈走向具身智能时代,而视觉-语言-动作(VLA)模型作为连接语言指令、视觉感知与运动执行的关键技术,成为实现通用操作的核心。传统方法依赖人工规则,难以应对开放世界的泛化需求;基座模型则通过海量真实数据学习跨模态映射,大幅提升指令跟随、开放式词汇操作与跨环境迁移能力。开源评测SOTA不仅意味着可复现的先进基线,更代表着硬件厂商开放生态、赋能开发者的战略转向。本文从模型架构原理出发,分析基座模型与底层运动控制的协作关系,并结合真机部署的算力要求、标准推理流程、数据采集与微调实践,以及仿真

weixin_29056701的博客 296

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 413

python 命名实体识别_使用Python和Keras的有关命名实体识别(NER)的完整教程

假设您是报纸行业的编辑,每天都会收到数千个故事。您将如何找到与体育,政治等特定领域相关的故事?您会讲完所有这些故事吗?无权利?一个可以帮助您划分为不同类别的系统怎么样?该系统还可以执行复杂的任务,例如按城市划分故事,识别故事中涉及的人员姓名,组织等。在这篇文章中,我将向您介绍一个名为命名实体识别(NER)的东西。NER的任务是在文本中查找单词的类型。简介:在自然语言处理(NLP)中,实体识别是常见...

weixin_39517054的博客 1048

Matlab Robotics Toolbox实战:四自由度机械臂建模与仿真全流程(附代码)

本文详细介绍了使用Matlab Robotics Toolbox进行四自由度机械臂建模与仿真的全流程,包括DH参数定义、模型构建、可视化、运动学仿真及交互控制。通过实战案例和代码示例,帮助读者快速掌握机械臂建模技巧,提升机器人学习效率。

weixin_42538752的博客 415

命名实体识别(NER)入门知识梳理

进阶学习 精读word2vec内部的实现原理,CBOW和Skip-gram两种方法的实现及内部优化细节等; 学习下attention机制,self-attention机制,transformer,他们比LSTM好在哪,这里要花很大一部分精力,这部分相当于是目前NLP中最核心的技术了; 预训练模型:GPT、ELMo、BERT、ERNIE论文精读,了解下其他预训练模型的改进idea; 调试并精读BERT+BiLSTM+CRF的代码实现,至此当前NER这一块的基础知识和组件基本就攻克完成了,至于提升精度及...

tiancanucas的博客 936

如何利用DeepSeek自动生成PLC程序?

在工业自动化领域,PLC是核心控制设备,其编程效率和质量直接影响生产线的运行效果。 然而,传统PLC编程依赖工程师手动编写代码,不仅耗时耗力,还容易出错。通过自动生成PLC程序,DeepSeek不仅大幅提升了编程效率,还优化了代码质量。 那么DeepSeek到底能否自动生成PLC程序呢? 有位电气工程师就尝试让DeepSeek设计一套五层电梯控制系统的PLC程序,下面就让我们看看吧。 技术原理:DeepSeek如何实现自动编程DeepSeek利用自然语言处理技术,将工程师输入的文本指令转换为PLC代码。例

Qinmingyue13的博客 6181

数字IC后端新手必看:Innovus从安装到跑通第一个设计的完整流程(附常用命令清单)

本文为数字IC后端设计新手提供了Cadence Innovus工具的完整实战指南。详细介绍了从环境搭建、软件安装与许可证配置,到加载网表、库文件和约束,并逐步完成布局规划、单元布局、时钟树综合、布线及物理验证的核心使用流程。文章最后附有常用Tcl命令清单,帮助初学者快速上手并跑通第一个设计。

vscode5coder的博客 1240

传统的序列模型CRF与HMM区别

传统的序列模型CRF与HMM的区别主要体现在建模方式、对隐含状态的处理和对特征函数的处理上。CRF是一种判别模型,直接对输入输出序列之间的关系进行建模,不对隐藏状态进行建模,而HMM是一种生成模型,通过对隐藏状态和观察序列的联合概率分布进行建模。与HMM不同,CRF没有对隐藏状态进行建模,而是直接对输入序列和输出序列之间的关系进行建模,因此CRF不受HMM中的独立性假设约束。HMM中包含一个隐含的马尔科夫链来描述隐藏状态,而CRF不对隐藏状态进行建模,只对输入输出序列之间的关系进行建模。

互联网知识分享 1919

TexGen模型导出ABAQUS inp文件时纱线材料属性缺失?5分钟快速修复指南

本文针对TexGen模型导出ABAQUS inp文件时纱线材料属性缺失的问题,提供了快速修复指南。通过手动编辑inp文件或使用Python脚本自动补全材料属性,帮助复合材料仿真工程师高效解决问题。文章还介绍了TexGen导出前的预防性设置和ABAQUS中的验证技巧,确保仿真分析的准确性。

qsc901234的博客 250

CRF实战:用Python手把手教你搞定命名实体识别(附完整代码)

本文详细介绍了如何使用Python和条件随机场(CRF)算法实现命名实体识别(NER)。从环境准备、特征工程到模型训练与优化,手把手教你构建一个高效的NER系统,并附完整代码示例。CRF凭借其出色的序列建模能力,在NER任务中表现优异,适合处理人名、地名、机构名等实体识别问题。

egg99的博客 655

SAP Group Reporting入门指南(3)--公司间匹配对账ICMR及合并版本等主数据

S/4HANA CLOUD公司间匹配和对账

bflyfish的博客 965

基于FPGA的最大功率点跟踪(MPPT)系统开发 - MATLAB实现

最大功率点跟踪(Maximum Power Point Tracking,MPPT)是太阳能光伏系统中的重要技术,它通过调整太阳能电池板的工作点,以最大化输出功率。通过FPGA系统设计和硬件验证,我们可以实现太阳能光伏系统中的最大功率点跟踪。这种基于FPGA的MPPT系统具有高性能和灵活性,适用于太阳能光伏系统中的实时最大功率点跟踪。MPPT算法的选择对于系统的性能至关重要。在本文中,我们选择使用Perturb and Observe(P&O)算法,它是一种常用的基于光伏阵列电压和电流测量的迭代算法。

CoderExtra的博客 387

如何使用python-crfsuite构建高效NER模型:从入门到实战

python-crfsuite是一个强大的Python绑定库,为条件随机场(CRF)算法提供了便捷的接口,特别适用于构建高效的命名实体识别(NER)模型。本文将带你从基础概念到实际应用,掌握使用python-crfsuite开发NER系统的完整流程。 ## 一、快速了解python-crfsuite ### 1.1 什么是CRF和NER? 条件随机场(CRF)是一种统计建模方法,非常适合序列

gitblog_00592的博客 1067

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NER-BERT-CRF:基于BERT与CRF的命名实体识别实践

NER-BERT-CRF:基于BERT与CRF的命名实体识别实践 项目介绍 该项目NER-BERT-CRF是由Louis-udm开发,旨在提供一个高效的命名实体识别(Named Entity Recognition, NER)解决方案。它结合了BERT模型的强大预训练能力与条件随机场(Conditional Random Field, CRF)的序列标注优势,从而在多种文本处理场景中实现精确的实体...

gitblog_00515的博客 563

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Miniconda-Python3.9运行命名实体识别NER模型

在命名实体识别任务中,Miniconda结合Python 3.9提供了一套高效、可复现的环境管理方案。通过隔离依赖、精确控制包版本,并支持PyTorch等深度学习框架的一键安装,有效避免了多项目间的版本冲突。配合Hugging Face生态,开发者能快速实现BERT-CRF等模型的微调与部署,极大提升NER项目的开发效率与协作可靠性。

weixin_31688273的博客 830

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python BiLSTM_CRF医学文本标注,医学命名实体识别,NER,双向长短记忆神经网络和条件随机场应用实例,BiLSTM_CRF实现代码

Python BiLSTM_CRF医学文本标注,医学命名实体识别,NER,双向长短记忆神经网络和条件随机场应用实例,BiLSTM_CRF实现代码

L_goodboy的博客 1600
上一篇: TensorFlow【极简】入门代码
下一篇: Centos7深度学习环境配置
小基基o_O
博客等级 码龄9年 4414粉丝 467原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值