基于Tensorflow的自然语言处理Restful API调用实例 www.deepnlp.org
2017-02-19 19:06
603 查看
Github下载完整代码
https://github.com/rockingdingo/deepnlp
简介
www.deepnlp.org提供了免费的基于python和tensorflow深度神经网络模型开发的自然语言处理的服务,提供的REST风格的API不仅包括了NLP任务的基础模块,如分词(segment),词性标注(pos),命名实体识别(ner),句法分析(parsing)等,还提供了更多基于深度语言模型,词向量word embedding,LSTM, Seq2Seq等模型的在线API。此外还提供了多个文章段落应用,如textcnn文本分类,textsum 生成式文本总结和标题生成, textrank 抽取式自动摘要等。我们会在APIv1.0版本之后继续拓展更多的基于深度语言的模型,也欢迎更多的Contributors来使用。做这个项目的出发点是开源和免费提供一项基于深度学习的NLP服务,我们的API完全开源,但因受限于我们的资源,目前对使用频率有一定限制。
本着极简的设计原则原则,我们提供了最简单的接口接受固定参数,并以文本格式返回结果。
API参数
通过网络浏览器可以直接访问www.deepnlp.org的web API (需要验证登录),同时也可以通过编程环境程序化调用。参数 | 含义 | 说明 |
---|---|---|
lang | 语言代码,包括:zh(中文)和en(英文) | lang=zh |
text | 分析文本 | text=今天天气不错 |
annotators | 定义pipeline API中需要调用的模块,用逗号分隔,包括:segment(分词), pos(词性标注)和ner(命名实体识别) | annotators=segment,pos,ner |
API接口
模块 | URL | 返回结果 | 说明 |
---|---|---|---|
分词segment | www.deepnlp.org/api/v1.0/segment/?lang=zh&text=我爱吃北京烤鸭 | {"words": ["我","爱","吃","北京","烤鸭"]} | {"words": list} |
词性标注pos | www.deepnlp.org/api/v1.0/pos/?lang=zh&text=我爱吃北京烤鸭 | {"pos_str": "我/r 爱/v 吃/v 北京/ns 烤鸭/n"} | {"pos_str": string} |
命名实体ner | www.deepnlp.org/api/v1.0/ner/?lang=zh&text=我爱吃北京烤鸭 | {"ner_json": {"nbz": "","p": "北京","o": "","n": ""}, "ner_str": "我/nt 爱/nt 吃/nt 北京/p 烤鸭/nt"} | {"ner_json": json, ner_str": string} json 包含了nbz品牌,n 人名,o 组织,p 地点; |
模块整合pipeline | www.deepnlp.org/api/v1.0/pipeline/?lang=zh&annotators=segment,pos,ner&text=我爱吃北京烤鸭 | {"ner_json": {"nbz": "","p": "北京","o": "","n": ""}, "ner_str": "我/nt 爱/nt 吃/nt 北京/p 烤鸭/nt", "segment_str": "我 爱 吃 北京 烤鸭", "pos_str": "我/r 爱/v 吃/v 北京/ns 烤鸭/n"} | {"segment_str": string, "pos_str":string, "ner_str":string, "ner_json":json} |
文本摘要textrank | www.deepnlp.org/api/v1.0/textrank/?percent=0.2&text=待分析的文章段落 | {"top": [ [id1, "句子1", [0.0833] ], [id2, "句子2", [0.0812]]]} | percent为压缩比, 如抽取原文数量的0.25的句子作为文章摘要。{"top": [[id, "句子1", [score] ], …} id为该句子在原段落中的序号,从0开始。 |
浏览器中测试API
http://www.deepnlp.org/api/v1.0/segment/?lang=zh&text=我爱吃北京烤鸭http://www.deepnlp.org/api/v1.0/pos/?lang=zh&text=我爱吃北京烤鸭
http://www.deepnlp.org/api/v1.0/ner/?lang=zh&text=我爱吃北京烤鸭
http://www.deepnlp.org/api/v1.0/pipeline/?lang=zh&annotators=segment,pos,ner&text=我爱吃北京烤鸭
图1 浏览器调用API结果
Python中调用API
词法模块
下面我们以一段网剧《老九门》的剧情简介为例,看看如何在python环境中程序化调用deepnlp.org的web API。待分析的文本:text = ”张启山在轨道边来回踱步,听着站长和守夜人描述昨晚火车进站时的情况。张启山身后站着一位年轻的副官,他正指挥士兵们爬上火车进行切割,很快,一节车厢的铁皮被割出了一个洞。”
我们首先引入必要的两个包requests和urllib,
支持python下的URL访问。其次,使用API需要预先保存网站登录的信息,通过用户验证,浏览器已经保存了你登录的cookie信息了。我们可以通过deepnlp package下的api_service新建一个connection的类。使用到的用户名密码通过api_service.init() 函数免费注册,也可以不注册使用pypi默认的一个账户,但是访问频率会受到最大次数限制100次/天。
代码1 创建API的Login
import deepnlp from deepnlp import api_service login = api_service.init() # registration, if failed, load default login with limited access username = login['username'] password = login['password']
代码2 新建API的连接
#coding:utf-8 from __future__ import unicode_literals import json import requests import sys, os if (sys.version_info>(3,0)): from urllib.parse import quote else : from urllib import quote from deepnlp import api_service # use your personal login: # login = {'username': 'your_user_name' , 'password': 'your_password'} login = {} # load default login for pypi with limited access conn = api_service.connect(login) # save the connection with login cookies
我们想要得到这段《老九门》剧情文本的分词Segment和词性标注POS的信息,那么我们可以分别调用两个模块的API,也可以只调用一个pipeline的API,然后通过annotators 来控制需要返回哪几个模块的结果。
定义完整URL,传入待分析文本的信息 通过浏览器访问时的API为: http://www.deepnlp.org/api/v1.0/pipeline/?lang=zh&annotators=segment,pos&text=文本 观察后发现完整URL由以下部分构成:
1.base_url: 即为网站域名www.deepnlp.org;
2.模块的API:即"/api/v1.0/segment/?"这一部分,问号后带传递的参数;
3.输入的参数:需要通过urllib包的quote()函数,将中英文字符串转码传递给URL,类似于浏览器中的对应部分;
通过request包的get方法来访问之前定义的URL,同时传递的参数有保留的cookie信息conn。利用json包把返回的结果转化为字典表,例如通过tuples['words']就能访问到对应的分词,结果保存在一个空格分隔的字符串内。
代码3-1
text = "张启山在轨道边来回踱步,听着站长和守夜人描述昨晚火车进站时的情况。张启山身后站着一位年轻的副官,他正指挥士兵们爬上火车进行切割,很快,一节车厢的铁皮被割出了一个洞。" text = text.encode("utf-8") # convert text from unicode to utf-8 bytes # API Setting base_url = 'www.deepnlp.org' lang = 'zh' # Segmentation url_segment = base_url + "/api/v1.0/segment/?" + "lang=" + quote(lang) + "&text=" + quote(text) web = requests.get(url_segment, cookies = conn) tuples = json.loads(web.text) wordsList = tuples['words'] # segmentation json {'words', [w1, w2,...]} return list print ("Segmentation API") print (" ".join(wordsList)) # POS tagging url_pos = base_url + "/api/v1.0/pos/?"+ "lang=" + quote(lang) + "&text=" + quote(text) web = requests.get(url_pos, cookies = conn) tuples = json.loads(web.text) pos_str = tuples['pos_str'] # POS json {'pos_str', 'w1/t1 w2/t2'} return string print ("POS API") print (pos_str)
代码3-2
annotators = "segment,pos,ner" url_pipeline = base_url + "/api/v1.0/pipeline/?" + "lang=" + quote(lang) + "&text=" + quote(text) + "&annotators=" + quote(annotators) web = requests.get(url_pipeline, cookies = conn) tuples = json.loads(web.text) segment_str = tuples['segment_str'] # segment module pos_str = tuples['pos_str'] # pos module ner_str = tuples['ner_str'] # ner module ner_json = tuples['ner_json'] # ner result in json print ("Pipeline API") print (segment_str) print (pos_str) print (ner_str) print (ner_json)
关于编码
deepnlp.org的基于Tensorflow的NLP API的默认编码是utf-8; Python2的编码通常是ASCII码,无法有效支持中文,所以通过引入 from __future__ import unicode_literals 函数,来和Python3实现统一。统一之后字符串默认保存的编码是unicode,在传递进入URL时, text文本需要encode转化为utf-8码。
附录
1.POS词性标注标记集
代码 | 名称 | 帮助记忆的诠释 |
---|---|---|
Ag | 形语素 | 形容词性语素。形容词代码为a,语素代码g前面置以A。 |
a | 形容词 | 取英语形容词adjective的第1个字母。 |
ad | 副形词 | 直接作状语的形容词。形容词代码a和副词代码d并在一起。 |
an | 名形词 | 具有名词功能的形容词。形容词代码a和名词代码n并在一起。 |
b | 区别词 | 取汉字“别”的声母。 |
c | 连词 | 取英语连词conjunction的第1个字母。 |
Dg | 副语素 | 副词性语素。副词代码为d,语素代码g前面置以D。 |
d | 副词 | 取adverb的第2个字母,因其第1个字母已用于形容词。 |
e | 叹词 | 取英语叹词exclamation的第1个字母。 |
f | 方位词 | 取汉字“方”的声母。 |
g | 语素 | 绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。 |
h | 前接成分 | 取英语head的第1个字母。 |
i | 成语 | 取英语成语idiom的第1个字母。 |
j | 简称略语 | 取汉字“简”的声母。 |
k | 后接成分 | |
l | 习用语 | 习用语尚未成为成语,有点“临时性”,取“临”的声母。 |
m | 数词 | 取英语numeral的第3个字母,n,u已有他用。 |
Ng | 名语素 | 名词性语素。名词代码为n,语素代码g前面置以N。 |
n | 名词 | 取英语名词noun的第1个字母。 |
nr | 人名 | 名词代码n和“人(ren)”的声母并在一起。 |
ns | 地名 | 名词代码n和处所词代码s并在一起。 |
nt | 机构团体 | “团”的声母为t,名词代码n和t并在一起。 |
nz | 其他专名 | “专”的声母的第1个字母为z,名词代码n和z并在一起。 |
o | 拟声词 | 取英语拟声词onomatopoeia的第1个字母。 |
p | 介词 | 取英语介词prepositional的第1个字母。 |
q | 量词 | 取英语quantity的第1个字母。 |
r | 代词 | 取英语代词pronoun的第2个字母,因p已用于介词。 |
s | 处所词 | 取英语space的第1个字母。 |
Tg | 时语素 | 时间词性语素。时间词代码为t,在语素的代码g前面置以T。 |
t | 时间词 | 取英语time的第1个字母。 |
u | 助词 | 取英语助词auxiliary 的第2个字母,因a已用于形容词。 |
Vg | 动语素 | 动词性语素。动词代码为v。在语素的代码g前面置以V。 |
v | 动词 | 取英语动词verb的第一个字母。 |
vd | 副动词 | 直接作状语的动词。动词和副词的代码并在一起。 |
vn | 名动词 | 指具有名词功能的动词。动词和名词的代码并在一起。 |
w | 标点符号 | |
x | 非语素字 | 非语素字只是一个符号,字母x通常用于代表未知数、符号。 |
y | 语气词 | 取汉字“语”的声母。 |
z | 状态词 | 取汉字“状”的声母的前一个字母。 |
nx | 英文词简写字母等(全角) | A,B,NEC,POSTPAID |
Bg | 翠/Bg 橙/Bg | |
Rg | 古文特定词 | 斯/Rg 予/Rg 伊/Rg 胡/Rg |
Mg | 中文数字词 | 甲、乙、丙、丁等…… |
2.NER命名实体识别标记集
标签 | 名称 | 解释 |
---|---|---|
nt | 非实体 | |
n | 人名 | 如"刘伯承", "邓小平"等。 |
p | 地名 | 如"北京", "上海", "美国"等。 |
o | 机构名 | 如"工业部", "德国队", "新华社" 等。 |
nz | 影视作品 | 如"老九门", "我去上学啦"等。 |
nbz | 商业品牌 | 如"微博", "爱奇艺", "百度"等。 |
拓展阅读
deepnlp Python包https://pypi.python.org/pypi/deepnlp
Github源码deepnlp
https://github.com/rockingdingo/deepnlp
www.deepnlp 网站 API demo和接口
http://www.deepnlp.org
http://www.deepnlp.org/api/v1.0/pipeline
http://www.deepnlp.org/blog/tutorial-deepnlp-api/
相关文章推荐
- deep learning in NLP—深度学习在自然语言处理中的应用—入门学习序列
- Java Web 跨平台 - 使用Apache Axis2引擎发布基于Java语言的WebService并跨平台调用实例
- 基于php的银行卡实名认证接口调用代码实例
- Google开源基于Tensorflow的NLP框架重大升级
- JavaScript跨域调用基于JSON的RESTful API
- http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailHashMap#2.1%20一个简单实例
- 基于proteus的51单片机仿真实例四十、C语言的文件调用
- php基于闭包实现函数的自调用(递归)实例分析
- php基于闭包实现函数的自调用(递归)实例分析
- 基于proteus的51单片机仿真实例三十九、C语言的文件调用
- 用Tensorflow基于Deep Q Learning DQN 玩Flappy Bird
- 基于php的基金财务数据接口调用代码实例
- 基于JAVA的货币汇率api调用代码实例
- 基于php的身份证实名认证接口调用代码实例
- 【NLP】基于自然语言处理角度谈谈CRF(二)
- 基于MyBatis的数据库切分框架,可实现数据的水平切分和垂直切分。 http://www.makersoft.org
- 基于JAVA的黄金数据接口调用代码实例
- JavaScript跨域调用基于JSON的RESTful API
- [置顶] DeepNLP的表示学习·词嵌入来龙去脉·深度学习(Deep Learning)·自然语言处理(NLP)·表示(Representation)
- 淺談資料庫設計(关于树的设计等实例)http://www.omama.org/mt-archives/000007.php