基于 EasyOCR + HanLp 实现图片文字实体(中文姓名、机构名、地域名)识别

一、EasyOCR + HanLp

EasyOCR 是一个python版的文字识别工具。目前支持80中语言的识别。并且支持:图像预处理(去噪、色彩饱和度、尖锐处理)、CRAFT文字检测、中间处理(倾斜处理等)、文字识别、后续处理、输出结果。框架如下:

在这里插入图片描述
HanLP 是一系列模型与算法组成的NLP工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。内部算法经过工业界和学术界考验,配套书籍《自然语言处理入门》已经出版。目前,基于深度学习的HanLP 2.x已正式发布,次世代最先进的NLP技术,支持包括简繁中英日俄法德在内的104种语言上的联合任务。

下面采用 EasyOCR 提取出文本中的文字,利用 HanLP 分析出文本中的 中文姓名、机构名、地域名 等信息。

二、环境准备

python环境:3.6

安装 EasyOCR

pip install easyocr

安装好依赖,执行检测如果模型不存在会自动下载模型,不过下载时间很长容易失败,可以去官方网站中下载文本检测模型和文本分析模型:

https://www.jaided.ai/easyocr/modelhub/

下载文本识别模型:

在这里插入图片描述

下载文本检测模型:

在这里插入图片描述
下载后解压放到项目的 model 目录下:
在这里插入图片描述

安装 HanLp

pip install pyhanlp

HanLp 的模型如果不存在也会自动下载,这个下载速度较快。

三、图片文字实体识别

下面是我准备的图片,其中姓名、机构名、地域名,还有一些干扰文字
请添加图片描述
编写识别程序:

import easyocr
from pyhanlp import HanLP
from PIL import Image, ImageDraw

def recognize():
    # 加载 easyocr 模型,并制定语种
    reader = easyocr.Reader(['ch_sim', 'en'], model_storage_directory='model')
    # 图片位置
    imgPath = 'img/1.jpeg'
    # 识别图片中的文字
    result = reader.readtext(imgPath, detail=1)
    # 使用 PIL 读取图片,画出识别框
    image  = Image.open(imgPath)
    # 对图片绘图
    draw = ImageDraw.Draw(image)
    # 存放识别出所有文字,进行NLP解析
    text = ''
    for item in result:
        text += item[1]+' '
        # 画矩形框
        draw.rectangle((tuple(item[0][0]), tuple(item[0][2])), fill=None, outline=(255, 0, 0), width=2)
        print("提取到文字块:",item)
    print("==================================================")
    print("识别文字文本: ",text)
    # 创建分词器
    segment = HanLP.newSegment().enableNameRecognize(True).enableOrganizationRecognize(True).enablePlaceRecognize(True)
    # 提取实体
    cut_word = segment.seg(text)
    print(cut_word)
    # 存放人名
    name = []
    organization = []
    place = []
    for item in cut_word:
        word = item.word
        nature = item.nature.toString()
        if nature == 'nr':
            name.append(word)
        elif nature == 'ns':
            place.append(word)
        elif nature == 'nt':
            organization.append(word)

    print("识别中文姓名:",name)
    print("识别机构名:",organization)
    print("识别地域名:",place)
    image.show()

if __name__ == '__main__':
    recognize()

运行程序,如果没有 HanLP ,则自动下载:

在这里插入图片描述
识别文字情况:

在这里插入图片描述
可以看到文字都被捕捉到了,下面看词语分析效果:

在这里插入图片描述
已成功提取相关实体信息。

中文信息计算机自动处理的研究已有几十年的 历史 , 但至今仍有许多技术难题没有得到很好解 决 , 中文姓名自动识别问题就是其中的一个。由于 它与中文文本的自动分词一样 , 属于中文信息处理 的基础研究领域 , 因而它的研究成果直接影响到中 文信息的深层次研究。汉语的自身特点使得中文信 息自动处理大多是先对要处理的文本进行自动分词 (加入显式分割符) , 然后再在分词的基础上进行词 法、语法、语义等方面的深入分析。而在分词阶 段 , 文本中的人、地以及其它专有词和生词 大多被切分成单字词 , 在这种情形下如不能很好地 解决汉语文本中专有词生词的识别问题 , 将给其 后的汉语文本的深入分析带来难以逾越的障碍。中 文姓名的自动识别问题就是在这种背景下提出来 的。对这一问题的研究目前采用的技术中主要利用 以下几方面的信息: 姓名用字的频率信息、上下文 信息[1 ,2 ] 、语料库统计信息[2 ] 、词性信息等[3 ] 。本 文的方法是 , 首先对中文的构成、姓名用字的 规律及上下文文本信息特征进行充分分析 , 在此基 础上建立起两组规则集 , 将其作用于测试文本 , 获 得初步识别结果 , 再利用大规模语料库的统计信息 对初步识别结果进行概率筛选 , 设定合适的阈值 , 输出最终识别结果。经对 50 多万字的开放语料测 试 , 系统自动识别出 1781 个中文 , 在不同的 筛选阈值下获得 90 %以上的识别准确率 , 而召回 率高于 91 %。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小毕超

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值