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完全開源,但因受限于我們的資源,目前對使用頻率有一定限制。
本著極簡的設計原則原則,我們提供了最簡單的接口接受固定參數,并以文本格式返回結果。
通過網絡瀏覽器可以直接訪問www.deepnlp.org的web API (需要驗證登錄),同時也可以通過編程環境程序化調用。
| 參數 | 含義 | 說明 |
|---|---|---|
| lang | 語言代碼,包括:zh(中文)和en(英文) | lang=zh |
| text | 分析文本 | text=今天天氣不錯 |
| annotators | 定義pipeline API中需要調用的模塊,用逗號分隔,包括:segment(分詞), pos(詞性標注)和ner(命名實體識別) | annotators=segment,pos,ner |
| 模塊 | 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開始。 |

圖1 瀏覽器調用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 deepnlpfrom deepnlp import api_servicelogin = api_service.init() # registration, if failed, load default login with limited accessusername = login['username']password = login['password']代碼2 新建API的連接
#coding:utf-8from __future__ import unicode_literalsimport jsonimport requestsimport sys, osif (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 accessconn = 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 Settingbase_url = 'www.deepnlp.org'lang = 'zh' # Segmentationurl_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 listPRint ("Segmentation API")print (" ".join(wordsList)) # POS taggingurl_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 stringprint ("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 modulepos_str = tuples['pos_str'] # pos modulener_str = tuples['ner_str'] # ner modulener_json = tuples['ner_json'] # ner result in jsonprint ("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 | 中文數字詞 | 甲、乙、丙、丁等…… |
| 標簽 | 名稱 | 解釋 |
|---|---|---|
| nt | 非實體 | |
| n | 人名 | 如"劉伯承", "鄧小平"等。 |
| p | 地名 | 如"北京", "上海", "美國"等。 |
| o | 機構名 | 如"工業部", "德國隊", "新華社" 等。 |
| nz | 影視作品 | 如"老九門", "我去上學啦"等。 |
| nbz | 商業品牌 | 如"微博", "愛奇藝", "百度"等。 |
新聞熱點
疑難解答