由于采集省市区镇数据需要对地名进行拼音转换,由于第三方高准确度接口对IP进行了限制,处理大量数据变得异常缓慢。

使用了一个折中的办法,省市区 3级(3千+)用高准确度接口(几乎没有拼错的地名),镇级(4万+)用本地HanLP提供的接口(大部分多音字还算是能拼正确)。

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, BaseHTTPRequestHandler

class 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, BaseHTTPRequestHandler

class HttpHandler(BaseHTTPRequestHandler):

def _response(self, path, args):

code=200

rtv={'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=404

rtv["c"]=404

rtv["m"]="路径"+path+"不存在"

except Exception as e:

rtv["c"]=1

rtv["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

这个库是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

字典和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打头。

最后

如果这个库有帮助到您,请 Star 一下。

python实现api server_使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务...相关推荐

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

    由于采集省市区镇数据需要对地名进行拼音转换,由于第三方高准确度接口对IP进行了限制,处理大量数据变得异常缓慢. 使用了一个折中的办法,省市区 3级(3千+)用高准确度接口(几乎没有拼错的地名),镇级( ...

  2. python 拼音地名对应关系,使用Python的http.server实现一个简易的Web Api对外提供HanLP拼音转换服务...

    由于采集省市区镇数据需要对地名进行拼音转换,由于第三方高准确度接口对IP进行了限制,处理大量数据变得异常缓慢. 使用了一个折中的办法,省市区 3级(3千+)用高准确度接口(几乎没有拼错的地名),镇级( ...

  3. python建立一个简单的server_使用Python创建一个简易的Web Server

    Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...

  4. 用python写管理系统局域网_详解用python -m http.server搭一个简易的本地局域网

    工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...

  5. 【Web API系列教程】1.3 — 实战:用ASP.NET Web API和Angular.js创建单页面应用程序(上)

    前言 在传统的web应用程序中,客户端(浏览器)通过请求页面来启动与服务器的通信.然后服务器处理该请求,并发送HTML页面到客户端.在随后页面上的操作中--例如,用户导航到一个链接或提交一个包含数据的 ...

  6. python︱微服务Sanic制作一个简易本地restful API

    文章目录 一.Snaic基本功能 1.Routing路由 1.1 传入参数且参数格式规定 1.2 路由的第二种写法 2.Request 请求 3.Response 3.1 文本格式 3.2 HTML ...

  7. Python写一个简易的web服务器

    Greg Wilson是Software Carpentry(为科学家和工程师提供在计算技能方面的速成课程)的创始人.他已经在学术界和工业界工作了30年,是几本计算方面的书,包括获得2008年jolt ...

  8. 如何在 40 秒内创建一个.Net Core Web API?

    为什么我们需要自己写代码?为什么计算机无法自动为我们生成这些代码呢?很显然,我们应该可以利用这些共同点,从一个给定的数据库自动化构建系统--这就是"我"创建Magic的初衷. 作者 ...

  9. 笔记︱利用python + flask制作一个简易本地restful API

    原版官网:http://flask-restful.readthedocs.io/en/latest/ 中文官网:http://www.pythondoc.com/Flask-RESTful/quic ...

最新文章

  1. rcnn 改进mask_李沐团队提出最强ResNet改进版,多项任务达到SOTA | 已开源
  2. C专家编程--读书笔记十 再论指针
  3. 迭代反投影法代码_程序员的数学笔记3--迭代法
  4. 找不到libmmd.dll无法继续执行代码_300 行代码带你秒懂 Java 多线程!| 原力计划...
  5. 工业相机与民用相机的区别_工业相机和普通相机的区别详解
  6. linux-查找文件夹
  7. 语言 双线性内插_数位语音信号处理概论 Lesson6 语言模型
  8. Windows Server 2008 故障转移群集简介
  9. 接口协作--apipost接口协作工具
  10. LINQ聚合算法解释
  11. 我的世界java 4k_我的世界:原版VS“4K光影”牺牲2块显卡,让你看看差距有多大!...
  12. 新能源汽车入局不易 传第三张牌照花落前途汽车
  13. bugly android sdk,Bugly SDK 集成使用
  14. 计算机语音识别引擎,基于微软语音引擎的语音识别技术的研究
  15. http://localhost:15672无妨访问(两种情况)
  16. Pixelmator Pro 1.7 Mac版下载
  17. 苹果手机内存不够白屏
  18. 正则表达式(Regular Expression)——入门笔记(常用正则表达式符号、正则表达式在线调试工具)
  19. 肺肠轴——看不见的Crosstalk
  20. 【数据库基础】数据库的数据查询

热门文章

  1. truncate报ORA-02266错“唯一/主键被启用的外部关键字引用”解决方法
  2. WebStorm错误--无法显示文件夹目录
  3. Vuejs自定义全局组件--loading
  4. Yii2 获取URL的一些方法
  5. 【Linux】【Basis】文件系统
  6. DbExpressionBinding requires an input expression with a collection ResultType. 参数名: input
  7. MySQL 行锁功过:怎么减少行锁对性能的影响
  8. CAN总线基础(三)
  9. 事务回滚什么意思 try_分布式事务 TCC-Transaction 源码分析——事务恢复
  10. c语言运算程序,C语言运算符