使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务
由于采集省市區(qū)鎮(zhèn)數(shù)據(jù)需要對(duì)地名進(jìn)行拼音轉(zhuǎn)換,由于第三方高準(zhǔn)確度接口對(duì)IP進(jìn)行了限制,處理大量數(shù)據(jù)變得異常緩慢。
使用了一個(gè)折中的辦法,省市區(qū) 3級(jí)(3千+)用高準(zhǔn)確度接口(幾乎沒有拼錯(cuò)的地名),鎮(zhèn)級(jí)(4萬+)用本地HanLP提供的接口(大部分多音字還算是能拼正確)。
Github源碼:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/.pinyin-python-server
另外我提供了一個(gè)臨時(shí)測(cè)試服務(wù)器,國(guó)內(nèi)的但域名備案掉了走的海外線路,僅供測(cè)試,隨時(shí)可能關(guān)閉。測(cè)試:http://pinyin-test.haozgz.com/pinyin?txt=重慶著陸OK,重力看著沒有異常。
HanLP是一個(gè)優(yōu)秀的開源自然語言處理工具,提供了頗為準(zhǔn)確的拼音轉(zhuǎn)換功能。開始本想使用更為順手的nodejs來處理,但測(cè)試了Github上排第一的hotoo/pinyin庫(kù),就是開了分詞,對(duì)多音字支持也不太理想。最后決定使用HanLPPython版來進(jìn)行轉(zhuǎn)換,但是這個(gè)庫(kù)對(duì)地名的支持還是有限,都字地名很多轉(zhuǎn)換成dou囧,不過在同類型里面算是最好的。
新手第一次正經(jīng)寫Python代碼,剛開始電腦上以前裝的Python 2.7.x,就按Python2寫了一個(gè)服務(wù),發(fā)現(xiàn)字符串編碼需要轉(zhuǎn)來轉(zhuǎn)去,夠折騰的,但好歹功能沒問題。后面因?yàn)檫@個(gè)編碼問題,越想越覺得不舒服,一個(gè)優(yōu)秀的語言哪有這么折騰的,就改成了3.6.x(Miniconda里面3.7.x環(huán)境SSL有問題,pip用不了,不愿折騰了)。最終結(jié)果就是僅支持Python3,沒有了奇異的代碼。
http.server的簡(jiǎn)單上手
創(chuàng)建服務(wù)
網(wǎng)上有很多例子,也都非常簡(jiǎn)單,這個(gè)玩意也很容易上手。幾行代碼就能創(chuàng)建一個(gè)HTTP服務(wù)功能。
from http.server import HTTPServer, BaseHTTPRequestHandlerclass HttpHandler(BaseHTTPRequestHandler):def do_GET(self):#服務(wù)功能實(shí)現(xiàn)def do_POST(self):#服務(wù)功能實(shí)現(xiàn)httpd = HTTPServer(('127.0.0.1', 9527), HttpHandler) httpd.serve_forever()和nodejs的 http模塊寫出來的服務(wù)一樣簡(jiǎn)潔。只監(jiān)聽127.0.0.1省的配置防火墻,只讓本機(jī)訪問。
接收請(qǐng)求參數(shù)
一個(gè)Web Api不僅僅有path,還要有query string x-www-form-urlencoded請(qǐng)求參數(shù)支持。urllib.parse.parse_qs能輕松解析出請(qǐng)求數(shù)據(jù)。
class HttpHandler(BaseHTTPRequestHandler):def do_GET(self):path,args=urllib.parse.splitquery(self.path)self._response(path, args)def do_POST(self):args = self.rfile.read(int(self.headers['content-length'])).decode("utf-8")self._response(self.path, args)def _response(self, path, args):if args:args=urllib.parse.parse_qs(args).items()args=dict([(k,v[0]) for k,v in args])else:args={}# 輕松就解析出了請(qǐng)求參數(shù)對(duì)象執(zhí)行實(shí)際業(yè)務(wù)邏輯
有了path和args,就直接可以上業(yè)務(wù)邏輯了。具體這個(gè)請(qǐng)求是要處理什么功能,根據(jù)path來判斷一下即可,功能需要的參數(shù)從args里面取。
整個(gè)拼音服務(wù)完整代碼
from pyhanlp import *import traceback import json import urllib from http.server import HTTPServer, BaseHTTPRequestHandlerclass HttpHandler(BaseHTTPRequestHandler):def _response(self, path, args):code=200rtv={'c':0,'m':'','v':''}try:if args:args=urllib.parse.parse_qs(args).items()args=dict([(k,v[0]) for k,v in args])else:args={}# ****************************************# ***************頁(yè)面開始*****************# ****************************************# ==>if path=="/":rtv["v"]="服務(wù)器已準(zhǔn)備好"# ==>elif path=="/pinyin":txt=args.get("txt","")pinyin_list = HanLP.convertToPinyinList(txt)list=[]Pinyin=JClass("com.hankcs.hanlp.dictionary.py.Pinyin")for i in range(pinyin_list.size()):pinyin=pinyin_list[i]if pinyin==Pinyin.none5:list.append('F'+txt[i])else:list.append(pinyin.getPinyinWithoutTone())rtv["v"]=list# ****************************************# ****************頁(yè)面結(jié)束****************# ****************************************else:code=404rtv["c"]=404rtv["m"]="路徑"+path+"不存在"except Exception as e:rtv["c"]=1rtv["m"]='服務(wù)器錯(cuò)誤:'+str(e)+"\n"+traceback.format_exc()try:rtv=json.dumps(rtv,ensure_ascii=False)except Exception as e:rtv={'c':2,'m':'服務(wù)器返回?cái)?shù)據(jù)錯(cuò)誤:'+str(e)+"\n"+traceback.format_exc(),'v':''}rtv=json.dumps(rtv,ensure_ascii=False)self.send_response(code)self.send_header('Content-type', 'text/json; charset=utf-8')self.send_header('Access-Control-Allow-Origin', '*')self.end_headers()self.wfile.write(rtv.encode())def do_GET(self):path,args=urllib.parse.splitquery(self.path)self._response(path, args)def do_POST(self):args = self.rfile.read(int(self.headers['content-length'])).decode("utf-8")self._response(self.path, args)httpd = HTTPServer(('127.0.0.1', 9527), HttpHandler) httpd.serve_forever()HanLP的安裝
由于HanLP是一個(gè)java庫(kù),因此使用了pyhanlp這個(gè)Python包,底層還是用jpype1來調(diào)用HanLP 的java接口。Windows上還是根據(jù)wiki來完成的安裝,這庫(kù)給予了蠻實(shí)用的安裝方法。
本方法只在windows 7 環(huán)境下運(yùn)行過,其他環(huán)境自測(cè)。
:: 安裝一個(gè)有效的版本 > conda create -n python364 python=3.6.4 :: 切換版本 > activate python364 :: 安裝jpype1 > conda install -c conda-forge jpype1 :: 安裝pyhanlp > pip install pyhanlp :: 執(zhí)行一遍,會(huì)提示要下載哪些東西 > hanlp:: 環(huán)境都搞定后就可以運(yùn)行服務(wù)了 > python server.py【1】安裝Miniconda
conda版本隨意,https://conda.io/miniconda.html
【2】安裝pyhanlp
參考:https://github.com/hankcs/pyhanlp/wiki/Windows
這個(gè)庫(kù)是java庫(kù),需要有java環(huán)境,如果沒有裝過,需要先安裝java:下載JDK
測(cè)試發(fā)現(xiàn)python3.7.1 windows下ssl有問題無法安裝,conda切換成python 3.6.4測(cè)試安裝正常
安裝好后運(yùn)行一下hanlp命令,會(huì)提示下載,看第3步
如果出現(xiàn)XXX.dll什么的問題,可能是C++運(yùn)行庫(kù)缺失,安裝微軟常用運(yùn)行庫(kù)合集應(yīng)該能夠解決,我在Windows Server 2012上使用時(shí)出現(xiàn)此問題,裝上就OJBK了。
【3】下載字典和jar
參考半自動(dòng)配置: https://github.com/hankcs/pyhanlp/wiki/%E6%89%8B%E5%8A%A8%E9%85%8D%E7%BD%AE 。
字典和jar存放目錄一般在Miniconda3[\envs\py36]\Lib\site-packages\pyhanlp\static 。
jar直接下載最新releases 。
字典最好直接clone倉(cāng)庫(kù)/data目錄最新版本(用svn下載速度快很多,無需model數(shù)據(jù)),一樣的在存儲(chǔ)目錄內(nèi)放一個(gè)data文件夾,releases對(duì)bug處理稍微滯后一點(diǎn)。
另外需要修改hanlp.properties,給root賦值為當(dāng)前目錄完整路徑。
svn: https://github.com/hankcs/HanLP/trunk/data
【4】運(yùn)行
python server.py
【5】瀏覽器訪問
http://127.0.0.1:9527/pinyin?txt=要拼的文字
比如: 拼音。m 返回結(jié)果 {c:0,m:"",v:["pin","yin","F。","Fm"]},c=0時(shí)代表正常,其他代表出錯(cuò),m為錯(cuò)誤原因,拼音如果是字母符號(hào)會(huì)用F打頭。
最后
Github源碼:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/.pinyin-python-server 。
如果這個(gè)庫(kù)有幫助到您,請(qǐng) Star 一下。
轉(zhuǎn)載于:https://www.cnblogs.com/xiangyuecn/p/10612688.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [UGUI]圆形Image
- 下一篇: Python数据类型方法总结