CRF++ 中文NER

news2024/11/18 4:31:27

CLUENER数据准备

data = []
with open("data/train.json", 'r') as f:
    for line in f.readlines():
        data.append(eval(line))
data

在这里插入图片描述

特征提取

import jieba
import jieba.posseg as pseg

def process(text, labels=None):

    words = [i for i in text]

    words_flags = pseg.cut(text)
    flags = []
    BME = []
    for word, tag in words_flags:
        flags += [tag] * len(word)
        word_bme = ['M'] * len(word)
#         word_bme[-1] = 'E'
        word_bme[0] = 'B'
        BME += word_bme
        
    features = list(zip(words, flags, BME))

    text_tag = None
    if labels:
        text_tag = ["O"] * len(text)
        for ent_type in labels:
            entities = labels[ent_type]
            for entity in entities:
                locs = entities[entity]
                for loc in locs:
                    s,e = loc[0], loc[1]
                    for i in range(s+1, e+1):
                        text_tag[i] = "I-" + ent_type
                    text_tag[s] = "B-" + ent_type
    return features, text_tag

process("浙商银行企业信贷部叶老桂博士则从另一个角度对五道门槛进行了解读。")

在这里插入图片描述
特征提取,在单字的基础上,加了结巴分词给出的词性和是否分词起始位置

训练数据文件

from tqdm.notebook import tqdm

output = []
for d in tqdm(data):
    text = d['text']
    labels = d['label']
    features, word_labels = process(text, labels)
    for f, l in zip(features, word_labels):
        output.append('\t'.join(f) + '\t' + l)
    output.append('')

with open('train-crf.txt', 'w') as f:
    for o in output:
        f.write(o)
        f.write('\n')

!head -n 100 train-crf.txt

在这里插入图片描述

CRF++ 模板

template = """# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U001:%x[-1,0]/%x[0,0]
U002:%x[0,0]/%x[1,0]

U10:%x[-2,1]
U11:%x[-1,1]
U12:%x[0,1]
U13:%x[1,1]
U14:%x[2,1]
U111:%x[-2,1]/%x[-1,1]
U112:%x[-1,1]/%x[0,1]
U113:%x[0,1]/%x[1,1]
U114:%x[1,1]/%x[2,1]

U20:%x[-2,2]
U21:%x[-1,2]
U22:%x[0,2]
U23:%x[1,2]
U24:%x[2,2]
U221:%x[-2,2]/%x[-1,2]
U222:%x[-1,2]/%x[0,2]
U223:%x[0,2]/%x[1,2]
U224:%x[1,2]/%x[2,2]

U120:%x[-2,1]/%x[-2,2]
U121:%x[-1,1]/%x[-1,2]
U122:%x[0,1]/%x[0,2]
U123:%x[1,1]/%x[1,2]
U124:%x[2,1]/%x[2,2]
U12121:%x[-2,1]/%x[-2,2]/%x[-1,1]/%x[-1,2]
U12122:%x[-1,1]/%x[-1,2]/%x[0,1]/%x[0,2]
U12123:%x[0,1]/%x[0,2]/%x[1,1]/%x[1,2]
U12124:%x[1,1]/%x[1,2]/%x[2,1]/%x[2,2]

U1110:%x[-2,1]/%x[-1,1]/%x[0,1]
U1111:%x[-1,1]/%x[0,1]/%x[1,1]
U1112:%x[0,1]/%x[1,1]/%x[2,1]
# Bigram
B
"""
with open("crf-template.txt", 'w') as f:
    f.write(template)

crf_learn 参数

>>> crf_learn -h

CRF++: Yet Another CRF Tool Kit
Copyright (C) 2005-2013 Taku Kudo, All rights reserved.

Usage: crf_learn [options] files
 -f, --freq=INT              use features that occuer no less than INT(default 1)
 -m, --maxiter=INT           set INT for max iterations in LBFGS routine(default 10k)
 -c, --cost=FLOAT            set FLOAT for cost parameter(default 1.0)
 -e, --eta=FLOAT             set FLOAT for termination criterion(default 0.0001)
 -C, --convert               convert text model to binary model
 -t, --textmodel             build also text model file for debugging
 -a, --algorithm=(CRF|MIRA)  select training algorithm
 -p, --thread=INT            number of threads (default auto-detect)
 -H, --shrinking-size=INT    set INT for number of iterations variable needs to  be optimal before considered for shrinking. (default 20)
 -v, --version               show the version and exit
 -h, --help                  show this help and exit

开始训练

!crf_learn -f 3 -e 0.001 crf-template.txt train-crf.txt ./crf-model
CRF++: Yet Another CRF Tool Kit
Copyright (C) 2005-2013 Taku Kudo, All rights reserved.

reading training data: 100.. 200.. 300.. 400.. 500.. 600.. 700.. 800.. 900.. 1000.. 1100.. 1200.. 1300.. 1400.. 1500.. 1600.. 1700.. 1800.. 1900.. 2000.. 2100.. 2200.. 2300.. 2400.. 2500.. 2600.. 2700.. 2800.. 2900.. 3000.. 3100.. 3200.. 3300.. 3400.. 3500.. 3600.. 3700.. 3800.. 3900.. 4000.. 4100.. 4200.. 4300.. 4400.. 4500.. 4600.. 4700.. 4800.. 4900.. 5000.. 5100.. 5200.. 5300.. 5400.. 5500.. 5600.. 5700.. 5800.. 5900.. 6000.. 6100.. 6200.. 6300.. 6400.. 6500.. 6600.. 6700.. 6800.. 6900.. 7000.. 7100.. 7200.. 7300.. 7400.. 7500.. 7600.. 7700.. 7800.. 7900.. 8000.. 8100.. 8200.. 8300.. 8400.. 8500.. 8600.. 8700.. 8800.. 8900.. 9000.. 9100.. 9200.. 9300.. 9400.. 9500.. 9600.. 9700.. 9800.. 9900.. 10000.. 10100.. 10200.. 10300.. 10400.. 10500.. 10600.. 10700.. 
Done!4.97 s

Number of sentences: 10748
Number of features:  1912554
Number of thread(s): 40
Freq:                3
eta:                 0.00100
C:                   1.00000
shrinking size:      20
iter=0 terr=0.99280 serr=1.00000 act=1912554 obj=1223179.51267 diff=1.00000
iter=1 terr=0.26686 serr=1.00000 act=1912554 obj=641377.87041 diff=0.47565
iter=2 terr=0.26686 serr=1.00000 act=1912554 obj=662774.14395 diff=0.03336
iter=3 terr=0.26686 serr=1.00000 act=1912554 obj=492583.32670 diff=0.25679
iter=4 terr=0.26686 serr=1.00000 act=1912554 obj=479412.24836 diff=0.02674
iter=5 terr=0.26686 serr=1.00000 act=1912554 obj=441358.40268 diff=0.07938
iter=6 terr=0.26702 serr=1.00000 act=1912554 obj=403504.00220 diff=0.08577
iter=7 terr=0.26450 serr=0.99935 act=1912554 obj=363372.27884 diff=0.09946
iter=8 terr=0.25407 serr=0.99423 act=1912554 obj=319318.95629 diff=0.12123
iter=9 terr=0.25369 serr=0.99181 act=1912554 obj=294240.56337 diff=0.07854
iter=10 terr=0.25344 serr=0.98986 act=1912554 obj=253903.96828 diff=0.13709
iter=11 terr=0.26491 serr=0.97125 act=1912554 obj=234504.88076 diff=0.07640
iter=12 terr=0.24329 serr=0.97144 act=1912554 obj=218156.27505 diff=0.06972
iter=13 terr=0.24345 serr=0.97441 act=1912554 obj=209718.44064 diff=0.03868
iter=14 terr=0.24626 serr=0.97274 act=1912554 obj=198188.60816 diff=0.05498
iter=15 terr=0.24575 serr=0.97609 act=1912554 obj=184293.09969 diff=0.07011
...
iter=321 terr=0.02049 serr=0.22079 act=1912554 obj=14981.64606 diff=0.00024
iter=322 terr=0.02009 serr=0.22041 act=1912554 obj=14957.42015 diff=0.00162
iter=323 terr=0.01992 serr=0.21920 act=1912554 obj=14933.93002 diff=0.00157
iter=324 terr=0.01971 serr=0.21706 act=1912554 obj=14918.42218 diff=0.00104
iter=325 terr=0.02012 serr=0.21948 act=1912554 obj=14914.71563 diff=0.00025
iter=326 terr=0.01983 serr=0.21809 act=1912554 obj=14903.42455 diff=0.00076
iter=327 terr=0.01968 serr=0.21706 act=1912554 obj=14894.01060 diff=0.00063

Done!11985.11 s

验证集

datadev = []
with open("data/dev.json", 'r') as f:
    for line in f.readlines():
        datadev.append(eval(line))

output = []
for d in tqdm(datadev):
    text = d['text']
    labels = d['label']
    features, word_labels = process(text, labels)
    for f, l in zip(features, word_labels):
        output.append('\t'.join(f) + '\t' + l)
    output.append('')

with open('dev-crf.txt', 'w') as f:
    for o in output:
        f.write(o)
        f.write('\n')

!head -n 100 dev-crf.txt

在这里插入图片描述

import os
os.system("crf_test -m crf-model dev-crf.txt > dev_result.txt")

pred, labels = [], []
with open('dev_result.txt', 'r') as f:
    for i in f.readlines():
        if len(i.strip()) > 0:
            elements = i.strip().split('\t')
            pred.append(elements[-1])
            labels.append(elements[-2])

from seqeval.metrics import classification_report
print(classification_report([labels], [pred]))

              precision    recall  f1-score   support

     address       0.53      0.49      0.51       373
        book       0.77      0.60      0.67       154
     company       0.76      0.72      0.74       378
        game       0.79      0.81      0.80       295
  government       0.77      0.76      0.76       247
       movie       0.70      0.66      0.68       151
        name       0.77      0.76      0.76       465
organization       0.79      0.70      0.75       367
    position       0.81      0.71      0.76       433
       scene       0.62      0.46      0.53       209

   micro avg       0.74      0.68      0.71      3072
   macro avg       0.73      0.67      0.70      3072
weighted avg       0.74      0.68      0.71      3072

pipeline

class Pipeline:
    def __init__(self, model, feature_func):
        self.model = model
        self.process = feature_func
        import os
        os.environ['LD_LIBRARY_PATH'] = '/usr/local/lib/'
        
    def __call__(self, text, ):
        features, _ = self.process(text)
        output = []
        for f in features:
            output.append('\t'.join(f))
        output.append('')

        temp_file = 'temp-text.txt'
        with open(temp_file, 'w') as f:
            for o in output:
                f.write(o)
                f.write('\n')

        temp_result = 'predict.txt'
        os.system(f"crf_test -m {self.model} {temp_file} > {temp_result}")
        with open(temp_result, 'r') as f:
            res = f.read()
        res = res.strip().split('\n')
        res = [i.split('\t') for i in res]
        features = [i[-1].split('-')[0] for i in res]
        entities = [i[-1].split('-')[-1] for i in res]
        tags = ''.join(features)
        pattern = re.compile('BI*')
        ne_label = re.finditer(pattern, tags)
        ne_list = []
        for ne in ne_label:
            start, end = int(ne.start()), int(ne.end())
            entity = entities[start]
            ne_list.append({
                "word": ''.join(text[start: end]),
                "start": start,
                "end": end,
                "entity_group": entity

            })
        return ne_list
    
pipe = Pipeline('crf-model', process)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1664328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux进程——进程地址空间

前言:在讲完环境变量后,相信大家对Linux有更进一步的认识,而Linux进程概念到这也快接近尾声了,现在我们了解Linux进程中的地址空间! 本篇主要内容: 了解程序地址空间 理解进程地址空间 探究页表和虚拟地址空…

ChatGPT 即将登陆 iPhone;斯坦福推出 AI 辅助全息成像技术丨 RTE 开发者日报 Vol.202

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品

1.题目 2. 解法⼀(暴⼒解法,会超时): 1.算法思路: 2.图解 3. 代码实现 3. 解法⼆(双指针-对撞指针): 1.算法思路: 2.图解 3.代码实现 1.C语言 2…

4G,5G执法记录仪人脸识别、人脸比对使用说明

4G/5G执法记录仪或4G/5G智能安全帽,做前端人脸识别、人脸比对,采用了上市公司的成熟的人脸识别算法,需要支付LICENSE给算法公司,理论上前端设备支持30K的人脸库(受设备运行内存限制)。 4G/5G执法记录仪侧要…

1.前端环境搭建

1.安装nodejs 因为我们开发Vue项目需要使用npm命令来创建和启动,安装node.js是为了获得这个命令,目前和使用node.js无关 下载地址:http://nodejs.cn/download/ 下载完之后安装,通过cmd查看是否安装成功 node --version2.创建项目…

使用./build.sh编译ORB_SLAM源码时出现报错:/usr/bin/ld:找不到 -lboost_serialization的解决办法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、/usr/bin/ld:找不到 -lboost_serialization1.问题描述2.解决(1). 下载源码(2) . 编译安装 一、/usr/bin/ld:找不到 -lboost_serialization 1.问题描述 在安装…

KAN核心团队震撼力作!MIT华人用AI首次发现物理学全新方程 | 最新快讯

新智元报道 编辑:Aeneas 好困 刚刚提出了 KAN 的 MIT 物理学家 Max Tegmark 和北大校友刘子鸣,又有一项重磅研究问世了!团队发现,它们用 AI 发现了物理学中的新方程,从此,AI 很可能被引入物理学研究领域&am…

IPv6资产测绘哪家强?揭秘新一代网络空间资产测绘平台的独门秘籍

网络空间资产测绘,即通过一系列技术手段,对网络中的各类资产进行全面的发现、分类和定位,为各类用户提供精准的数据支撑和决策依据。网络空间资产测绘作为一门新兴的交叉学科,融合了计算机网络技术、数据挖掘、人工智能、信息安全…

Docker学习笔记(一)安装Docker、镜像操作、容器操作、数据卷操作

文章目录 1 Docker介绍1.1 Docker的优势1.1.1 应用部署的环境问题1.1.2 Docker解决依赖兼容问题1.1.3 Docker解决操作系统环境差异1.1.4 小结 1.2 Docker和虚拟机的区别1.3 Docker架构1.3.1 镜像和容器1.3.2 DockerHub1.3.3 Docker架构 1.4 安装Docker1.4.1 卸载旧版本Docker&a…

【微信开发】微信支付前期准备工作(申请及配置)

1、申请并配置公众号或微信小程序 1.1 账户申请 通过微信公众平台,根据指引申请微信小程序或公众号,申请时需要微信认证,申请流程不在赘述 1.2 信息配置 申请通过后,需进入小程序和公众号内进行信息配置 1.2.1 小程序信息配置…

小程序地理位置接口申请教程来啦4步学会

小程序地理位置接口有什么功能? 如果我们提审后驳回理由写了“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通,建议完成接口开通后或移除接口相关内容后再进行后续版本提审”,如果你也碰到类似问题&#xff…

任务:单域,域树的搭建

一、单域: 搭建所需的系统:win2016 sever,win10 1.在创建域前,先设置静态ip 先查看win2016 sever的IP, ip:192.168.154.133 网关:192.168.154.2 DNS服务器:192.168.154.2 设置…

FPGA学习笔记(1)——Vivado和HLS

1 Vivado设计 1.1 FPGA基本知识 Xilinx Atrix-7使用6输入LUT结构(0-63)CLB:可配置逻辑块Slice:每个CLB包含2个Slice(包含查找表LUT和8位寄存器REG)布线池:围绕在CLB周围,衔接FPGA的资源调度I/O块&#xf…

conan2 基础入门(02)-安装

conan2 基础入门(02)-安装 文章目录 conan2 基础入门(02)-安装⭐前言⭐安装python安装安装包安装自行操作 ⭐验证配置环境变量命令行验证conan配置文件 END ⭐前言 Conan 2.0: C and C Open Source Package Manager 官方提供三种安装conan的方式。分别为: Recommen…

vuex核心概念-getters

除了state之外,有时我们还需要从state中派生出一些状态,这些状态是依赖state的,此时会用到getters。

鸿蒙内核源码分析(远程登录篇) | 内核如何接待远方的客人

什么是远程登录? 每个人都有上门做客的经历,抖音也一直在教我们做人,做客不要空手去,总得带点东西,而对中国人你就不能送钟,不能送梨,最好也别送鞋,因他们与 终 离 邪 谐音,犯忌讳. 这是人情世故,叫礼仪,是中华文明圈的共识,是相互交流信任的基础. 那互联网圈有没有这种共识呢…

光伏无人机巡检都有哪些功能?

随着光伏产业的快速发展,光伏电站的巡检工作变得越来越重要。然而,传统的人工巡检方式面临着效率低下、安全隐患大等问题。为了应对这些挑战,光伏无人机巡检应运而生,以其独特的优势在光伏巡检领域发挥着越来越重要的作用。本文将…

OpenCv中cv2.subtract(image,blurred)与(image-blurred)的区别

目录 一、cv2.subtract()函数二、cv2.subtract(image,blurred)和(image-blurred)处理效果对比2.1 代码2.2 输出结果 三、总结 一、cv2.subtract()函数 cv2.subtract是OpenCV库中的一个函数,用于进行图像减法运算。它可以很方便地进行两个图像…

力扣刷题--数组--第一天

一、数组 数组特点: 连续内存空间存储得数据元素类型一致数组可以通过下标索引查找数据元素,可以删除、替换、添加元素等 1.1 二分查找 使用二分查找需满足得条件: 数组是有序的;数组中没有重复元素;查找的target…

三层交换机与路由器连通上网实验

三层交换机是一种网络交换机,可以实现基于IP地址的高效数据转发和路由功能,通常用于大型企业、数据中心和校园网络等场景。此外,三层交换机还支持多种路由协议(如OSPF、BGP等),以实现更为复杂的网络拓扑结构…