在上一篇上实现了线索功能模块,在实际使用中除了线索数据除了输入的结构化数据,也有可能是来自非结构化数据,如名片、PDF文档、语音视频等。为方便线索录入,本篇中将以名片为例,实现利用OCR等技术将名片信息自动转成结构化数据自动填充到线索的对应字段中进行存储的功能。

1. OCR技术

OCR,全程Optical Character Recognition,翻译过来是光学字符识别的意思。它是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。简单来说就是将图像中的文字进行识别,并以文本的形式返回。

❝ OCR处理过程可分为图像预处理、文本识别和后处理等步骤。

文字识别在传统技术上采用模板匹配的方式,但这种方式由于缺乏上下文信息识别正确率难以保证,现在多基于深度学习技术进行识别,比如RNN和LSTM等依赖于时序关系的神经网络是最理想的选择。

在本文中将使用pytesseract实现OCR功能。

2. pytesseract的安装使用

pytesseract是对Tesseract的Python封装,pytesseract的安装命令如下:

$ pip install pytesseract

❝ Tesseract(/'tesərækt/) 这个词的意思是"超立方体",Tesseract 已经有 30 年历史,开始它是惠普实验室的一款专利软件,然后在 2005 年开源,自 2006 年后由 Google 赞助进行后续的开发和维护。在现在的免费 OCR 引擎中,其识别精度也仍然是出类拔萃的。

安装完成后就可以在项目中使用了。

3. 在Django中加入OCR功能

先在Django中新创建一个img2text的应用。命令如下:

$ python manage.py startapp img2text

执行完成后按照上一篇中的步骤将这个应用的结构重新整理下。

❝ ...进行下面的操作:

  1. 将目录移动到one_crm目录下面;
  2. 编辑leads下面的apps.py,将其中name改成one_crm.img2text;
  3. 将“one_crm.leads.apps.Img2TextConfig”添加到config/settings/base.py文件的LOCAL_APPS变量中,使这个模块生效。

接下来依次更新视图、模板和路由。

4. 添加视图

这里需要提交名片文件,所以选择一个表单视图来实现。先在forms.py文件中添加一个名为CardForm的表单类,内容如下:

class CardForm(forms.Form):img = forms.FileField(label="请选择名片")def parse_card(self):pass

其中parse_card函数是用来解析名片的。解析过程是将名片用OCR将其中的文本解析出来,然后从解析的文本中抽取名字、电话和邮箱等信息,最后把这些信息保存到线索模型中。

「抽取名字」

这里抽取名字的方式比较简单,基本思路是将名片中提取的信息按行进行分割,然后每行文本就jieba进行分析判断词性,若词性是nr即为人名。实现如下:

def isname(single_word_string):"""判断是否是人名"""pair_word_list = pseg.lcut(single_word_string)for _, cixing in pair_word_list:if cixing == "nr":return Truereturn Falsedef extract_name(s):"""提取人名"""name = "未知"data = s.split("n")for i in data:i = i.replace(" ", "")if isname(i):name = ibreakreturn name

❝ 在自然语言处理过程中,为了能更好地处理句子,往往需要把句子拆开分成一个一个的词语,这样能更好的分析句子的特性,这个过程叫做——分词。jieba是当前最好的 Python 中文分词库之一。

「抽取电话」

抽取电话的方式比较简单,就是用正则表达式进行提取(这里的正则没有对国际号,如+86进行处理),实现如下:

def extract_phone(s):numbers = re.findall("(1d{2}-?d{4}-?d{4})", s)if numbers:return numbers[0]else:return ""

「抽取邮箱」

抽取邮箱的方式和电话类似,也是用正则表达式,实现如下:

def extract_email(s):emails = re.findall(r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+)", s)if emails:return emails[0]else:return ""

完成信息提取函数后更新parse_card函数如下:

    def parse_card(self):img = Image.open(self.cleaned_data["img"])s = pytesseract.image_to_string(img, lang="chi_sim")contact = extract_phone(s)email = extract_email(s)name = extract_name(s)lead = Lead(name=name,contact=contact,email=email,description=s,attachment=self.cleaned_data["img"],)lead.save()return lead.pk

以上就完成了表单的实现,接着是更新视图views.py,实现将提交的名片进行解析,成功后跳转到该线索的更新页面进行人工确认,代码如下:

class CardFormView(FormView):template_name = "img2text/card_form.html"form_class = CardFormdef form_valid(self, form):self.pk = form.parse_card()return super().form_valid(form)def get_success_url(self) -> str:return reverse_lazy("leads:lead-update", kwargs={"pk": self.pk})

5.实现模板

​ 完成了视图后新建一个模板文件,在templates文件夹下创建一个名为img2text子文件夹,并新建一个card_form.html文件,内容如下:

{% block content %}
<form method="POST" enctype="multipart/form-data"><!-- Security token -->{% csrf_token %}<!-- Using the formset -->{{ form|crispy }}<div class="control-group"><div class="controls"><button type="submit" class="btn btn-primary btn-lg btn-block">提交</button></div></div>
</form>
{% endblock content %}

实现的功能就是一个提交文件的表单。

6. 更新路由

最后一步就是将上面实现的视图添加到项目的路由中,更新urls.py内容如下:

from django.urls import pathfrom .views import card_form_viewapp_name = "img2text"urlpatterns = [path("", card_form_view, name="card"),
]

然后更新config文件夹下面的总路由配置文件urls.py即可。

比如这里提交一个名片:

http://weixin.qq.com/r/8SkqMlDEYQ0erRRR93zj (二维码自动识别)

将提取到“张叁”、“139-8888-6666”、“example@qq.com”这几个关键信息,并把解析出来的内容保存到“描述”字段,效果如下:

完整的代码请参考:https://github.com/flingjie/one_crm

python随机抽取人名_用Python打造一个CRM系统(五)相关推荐

  1. python随机抽取人名_python的random

    python的random函数 更多的random用法可参阅: random --- 生成伪随机数 - Python 3.7.4 文档​docs.python.org 以下使用了: 洗牌:random ...

  2. python随机抽取人名_python实现艾宾浩斯背单词功能,实现自动提取单词、邮件发送,再也不用担心背单词啦...

    已经完成了利用python爬虫实现定时QQ邮箱推送英文文章,辅助学习英语的项目,索性就一口气利用python多做一些自动化辅助英语学习的项目,对自己的编程能力和英文水评也有一定的帮助,于是在两天的努 ...

  3. python 小说下载工具_使用tkinter打造一个小说下载器,想看什么小说,就下什么...

    前言 今天教大家用户Python GUI编程--tkinter 打造一个小说下载器,想看什么小说,就下载什么小说 先看下效果图 Tkinter 是使用 python 进行窗口视窗设计的模块.Tkint ...

  4. python写一个crm系统_用Python打造一个CRM系统(四)

    在上一篇中在本地进行初始化,并让项目顺利运行.在本篇中将实现一个线索管理模块,支持线索的增删改查. 新建线索应用模块 进入项目目录,使用django命令创建线索应用模块,命令如下: $ python ...

  5. python 随机种子 时间_关于python中的随机种子——random_state

    random_state是一个随机种子,是在任意带有随机性的类或函数里作为参数来控制随机模式.当random_state取某一个值时,也就确定了一种规则. random_state可以用于很多函数,我 ...

  6. python随机抽号_使用python随机抽取评论roll枪

    from bilibili_api.video import VideoInfo import random import time #导入各种库 #设置一个固定的时间戳作为抽奖随机数的种子,使每次结 ...

  7. python随机抽号_使用python的random编写抽奖程序

    python代码的random模块,常用函数是random.random,random.randint,random.randrange,random.choice,random.shuffle. ① ...

  8. python随机生成红包_自制Python随机红包

    1.部署Python 首先从Python.org下载Python3.9,然后安装就行了 Win10建议在安装一下UWP版的哈,因为命令行里要下载命令行专用的 安装步骤:Windows徽标键+R 打开运 ...

  9. python识别中文人名_使用Python在NLP中的命名实体识别中提取人名

    我有一句话,我需要单独识别人名: 例如: sentence = "Larry Page is an American business magnate and computer scient ...

最新文章

  1. 生日快乐html_生日快乐,我的祖国
  2. CSS3中背景的四个新的属性
  3. vscode android入门,vscode Android调试
  4. python怎么把列表转换成字符串_如何将字节列表(unicode)转换为Python字符串?
  5. C++结构体:默认构造函数,复制构造函数,重载=运算符
  6. B1.Java基础部分二
  7. c语言pta判断字符或数字的昵称,c/c++开发分享『ACM C++』PTA浙大 | 基础题 – 打印沙漏...
  8. Python学习路程day9
  9. 【leetcode】523. Continuous Subarray Sum
  10. java socket php_Web架构(二)PHP Socket与Java ServerSocket交互
  11. 【排序】排序算法之分配排序
  12. 春节没事,看几部黑客电影吧!
  13. 铁大自动选课工具使用说明
  14. 面向对象基础实战——飞机大战
  15. 开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)
  16. 吉他演奏中的速度与节拍
  17. 基于若依框架项目点击登录时出现TypeError: Cannot read properties of undefined (reading ‘user‘)
  18. H264解码器源码(Android 1.6 版)
  19. nginx长连接——keepalive
  20. 钟摆小游戏的开发过程

热门文章

  1. 重新洗牌的网约车,谁在接管下沉市场?
  2. java搜索项目内的异常_java中用Lucene做搜索,在建索引时遇到的2个异常
  3. django网上商城_网上商城开源项目合集
  4. java的默认_java默认包的使用
  5. cpuz北桥频率和内存频率_内存频率怎样计算,一分钟教会你
  6. 基础数据仓库环境搭建(一)数据仓库概述
  7. python字符串中strip() 函数和 split() 函数的详解
  8. python 将文件描述符包装成文件对象
  9. python线程join
  10. linux qt绘框,Qt绘制异形窗体