日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务

發布時間:2025/4/14 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于采集省市區鎮數據需要對地名進行拼音轉換,由于第三方高準確度接口對IP進行了限制,處理大量數據變得異常緩慢。

使用了一個折中的辦法,省市區 3級(3千+)用高準確度接口(幾乎沒有拼錯的地名),鎮級(4萬+)用本地HanLP提供的接口(大部分多音字還算是能拼正確)。

Github源碼:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/.pinyin-python-server

另外我提供了一個臨時測試服務器,國內的但域名備案掉了走的海外線路,僅供測試,隨時可能關閉。測試:http://pinyin-test.haozgz.com/pinyin?txt=重慶著陸OK,重力看著沒有異常。

HanLP是一個優秀的開源自然語言處理工具,提供了頗為準確的拼音轉換功能。開始本想使用更為順手的nodejs來處理,但測試了Github上排第一的hotoo/pinyin庫,就是開了分詞,對多音字支持也不太理想。最后決定使用HanLPPython版來進行轉換,但是這個庫對地名的支持還是有限,都字地名很多轉換成dou囧,不過在同類型里面算是最好的。

新手第一次正經寫Python代碼,剛開始電腦上以前裝的Python 2.7.x,就按Python2寫了一個服務,發現字符串編碼需要轉來轉去,夠折騰的,但好歹功能沒問題。后面因為這個編碼問題,越想越覺得不舒服,一個優秀的語言哪有這么折騰的,就改成了3.6.x(Miniconda里面3.7.x環境SSL有問題,pip用不了,不愿折騰了)。最終結果就是僅支持Python3,沒有了奇異的代碼。

http.server的簡單上手

創建服務

網上有很多例子,也都非常簡單,這個玩意也很容易上手。幾行代碼就能創建一個HTTP服務功能。

from http.server import HTTPServer, BaseHTTPRequestHandlerclass HttpHandler(BaseHTTPRequestHandler):def do_GET(self):#服務功能實現def do_POST(self):#服務功能實現httpd = HTTPServer(('127.0.0.1', 9527), HttpHandler) httpd.serve_forever()

和nodejs的 http模塊寫出來的服務一樣簡潔。只監聽127.0.0.1省的配置防火墻,只讓本機訪問。

接收請求參數

一個Web Api不僅僅有path,還要有query string x-www-form-urlencoded請求參數支持。urllib.parse.parse_qs能輕松解析出請求數據。

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={}# 輕松就解析出了請求參數對象

執行實際業務邏輯

有了path和args,就直接可以上業務邏輯了。具體這個請求是要處理什么功能,根據path來判斷一下即可,功能需要的參數從args里面取。

整個拼音服務完整代碼

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={}# ****************************************# ***************頁面開始*****************# ****************************************# ==>if path=="/":rtv["v"]="服務器已準備好"# ==>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# ****************************************# ****************頁面結束****************# ****************************************else:code=404rtv["c"]=404rtv["m"]="路徑"+path+"不存在"except Exception as e:rtv["c"]=1rtv["m"]='服務器錯誤:'+str(e)+"\n"+traceback.format_exc()try:rtv=json.dumps(rtv,ensure_ascii=False)except Exception as e:rtv={'c':2,'m':'服務器返回數據錯誤:'+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是一個java庫,因此使用了pyhanlp這個Python包,底層還是用jpype1來調用HanLP 的java接口。Windows上還是根據wiki來完成的安裝,這庫給予了蠻實用的安裝方法。

本方法只在windows 7 環境下運行過,其他環境自測。

:: 安裝一個有效的版本 > conda create -n python364 python=3.6.4 :: 切換版本 > activate python364 :: 安裝jpype1 > conda install -c conda-forge jpype1 :: 安裝pyhanlp > pip install pyhanlp :: 執行一遍,會提示要下載哪些東西 > hanlp:: 環境都搞定后就可以運行服務了 > python server.py

【1】安裝Miniconda

conda版本隨意,https://conda.io/miniconda.html

【2】安裝pyhanlp

參考:https://github.com/hankcs/pyhanlp/wiki/Windows

這個庫是java庫,需要有java環境,如果沒有裝過,需要先安裝java:下載JDK

測試發現python3.7.1 windows下ssl有問題無法安裝,conda切換成python 3.6.4測試安裝正常

安裝好后運行一下hanlp命令,會提示下載,看第3步

如果出現XXX.dll什么的問題,可能是C++運行庫缺失,安裝微軟常用運行庫合集應該能夠解決,我在Windows Server 2012上使用時出現此問題,裝上就OJBK了。

【3】下載字典和jar

參考半自動配置: 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倉庫/data目錄最新版本(用svn下載速度快很多,無需model數據),一樣的在存儲目錄內放一個data文件夾,releases對bug處理稍微滯后一點。

另外需要修改hanlp.properties,給root賦值為當前目錄完整路徑。

svn: https://github.com/hankcs/HanLP/trunk/data

【4】運行

python server.py

【5】瀏覽器訪問

http://127.0.0.1:9527/pinyin?txt=要拼的文字

比如: 拼音。m 返回結果 {c:0,m:"",v:["pin","yin","F。","Fm"]},c=0時代表正常,其他代表出錯,m為錯誤原因,拼音如果是字母符號會用F打頭。

最后

Github源碼:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/.pinyin-python-server 。

如果這個庫有幫助到您,請 Star 一下。

轉載于:https://www.cnblogs.com/xiangyuecn/p/10612688.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。