您的位置:首页 > 其它

基于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 抽取式自动摘要等。我们会在API
v1.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返回结果说明
分词segmentwww.deepnlp.org/api/v1.0/segment/?lang=zh&text=我爱吃北京烤鸭{"words": ["我","爱","吃","北京","烤鸭"]}{"words": list}
词性标注poswww.deepnlp.org/api/v1.0/pos/?lang=zh&text=我爱吃北京烤鸭{"pos_str": "我/r 爱/v 吃/v 北京/ns 烤鸭/n"}{"pos_str": string}
命名实体nerwww.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 地点;
模块整合pipelinewww.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}
文本摘要textrankwww.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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: