python随机抽取人名_用Python打造一个CRM系统(五)
在上一篇上實現(xiàn)了線索功能模塊,在實際使用中除了線索數(shù)據(jù)除了輸入的結(jié)構(gòu)化數(shù)據(jù),也有可能是來自非結(jié)構(gòu)化數(shù)據(jù),如名片、PDF文檔、語音視頻等。為方便線索錄入,本篇中將以名片為例,實現(xiàn)利用OCR等技術(shù)將名片信息自動轉(zhuǎn)成結(jié)構(gòu)化數(shù)據(jù)自動填充到線索的對應(yīng)字段中進行存儲的功能。
1. OCR技術(shù)
OCR,全程Optical Character Recognition,翻譯過來是光學字符識別的意思。它是指對文本資料的圖像文件進行分析識別處理,獲取文字及版面信息的過程。簡單來說就是將圖像中的文字進行識別,并以文本的形式返回。
? OCR處理過程可分為圖像預(yù)處理、文本識別和后處理等步驟。 文字識別在傳統(tǒng)技術(shù)上采用模板匹配的方式,但這種方式由于缺乏上下文信息識別正確率難以保證,現(xiàn)在多基于深度學習技術(shù)進行識別,比如RNN和LSTM等依賴于時序關(guān)系的神經(jīng)網(wǎng)絡(luò)是最理想的選擇。
?
在本文中將使用pytesseract實現(xiàn)OCR功能。
2. pytesseract的安裝使用
pytesseract是對Tesseract的Python封裝,pytesseract的安裝命令如下:
$ pip install pytesseract ? Tesseract(/'tes?r?kt/) 這個詞的意思是"超立方體",Tesseract 已經(jīng)有 30 年歷史,開始它是惠普實驗室的一款專利軟件,然后在 2005 年開源,自 2006 年后由 Google 贊助進行后續(xù)的開發(fā)和維護。在現(xiàn)在的免費 OCR 引擎中,其識別精度也仍然是出類拔萃的。?
安裝完成后就可以在項目中使用了。
3. 在Django中加入OCR功能
先在Django中新創(chuàng)建一個img2text的應(yīng)用。命令如下:
$ python manage.py startapp img2text執(zhí)行完成后按照上一篇中的步驟將這個應(yīng)用的結(jié)構(gòu)重新整理下。
? ...進行下面的操作:?
接下來依次更新視圖、模板和路由。
4. 添加視圖
這里需要提交名片文件,所以選擇一個表單視圖來實現(xiàn)。先在forms.py文件中添加一個名為CardForm的表單類,內(nèi)容如下:
class CardForm(forms.Form):img = forms.FileField(label="請選擇名片")def parse_card(self):pass其中parse_card函數(shù)是用來解析名片的。解析過程是將名片用OCR將其中的文本解析出來,然后從解析的文本中抽取名字、電話和郵箱等信息,最后把這些信息保存到線索模型中。
「抽取名字」
這里抽取名字的方式比較簡單,基本思路是將名片中提取的信息按行進行分割,然后每行文本就jieba進行分析判斷詞性,若詞性是nr即為人名。實現(xiàn)如下:
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進行處理),實現(xiàn)如下:
def extract_phone(s):numbers = re.findall("(1d{2}-?d{4}-?d{4})", s)if numbers:return numbers[0]else:return ""「抽取郵箱」
抽取郵箱的方式和電話類似,也是用正則表達式,實現(xiàn)如下:
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 ""完成信息提取函數(shù)后更新parse_card函數(shù)如下:
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以上就完成了表單的實現(xiàn),接著是更新視圖views.py,實現(xiàn)將提交的名片進行解析,成功后跳轉(zhuǎn)到該線索的更新頁面進行人工確認,代碼如下:
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.實現(xiàn)模板
? 完成了視圖后新建一個模板文件,在templates文件夾下創(chuàng)建一個名為img2text子文件夾,并新建一個card_form.html文件,內(nèi)容如下:
{% 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 %}實現(xiàn)的功能就是一個提交文件的表單。
6. 更新路由
最后一步就是將上面實現(xiàn)的視圖添加到項目的路由中,更新urls.py內(nèi)容如下:
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”這幾個關(guān)鍵信息,并把解析出來的內(nèi)容保存到“描述”字段,效果如下:
完整的代碼請參考:https://github.com/flingjie/one_crm
總結(jié)
以上是生活随笔為你收集整理的python随机抽取人名_用Python打造一个CRM系统(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: plc模拟器软件_关于PLC虚拟化的思考
- 下一篇: 知道python不_为什么自学Pytho