forked from PaddlePaddle/PaddleHub
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
176 additions
and
2 deletions.
There are no files selected for viewing
149 changes: 149 additions & 0 deletions
149
demo/serving/module_serving/lexical_analysis_lac/README.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
# 部署词法分析服务-以lac为例 | ||
## 简介 | ||
`Lexical Analysis of Chinese`,简称`LAC`,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。关于`LAC`的具体信息请参见[LAC](https://paddlepaddle.org.cn/hubdetail?name=lac&en_category=LexicalAnalysis)。 | ||
|
||
使用PaddleHub Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。 | ||
|
||
这里就带领大家使用PaddleHub Serving,通过简单几步部署一个词法分析在线服务。 | ||
|
||
## Step1:启动PaddleHub Serving | ||
启动命令如下 | ||
```shell | ||
$ hub serving start -m lac | ||
``` | ||
启动时会显示加载模型过程,启动成功后显示 | ||
```shell | ||
Loading lac successful. | ||
``` | ||
这样就完成了一个词法分析服务化API的部署,默认端口号为8866。 | ||
|
||
## Step2:测试语言模型在线API | ||
### 不使用自定义词典 | ||
在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子`和`天气预报说今天要下雨`。 | ||
首先指定编码格式及引入需要的包: | ||
```python | ||
>>> # coding: utf8 | ||
>>> import requests | ||
>>> import json | ||
``` | ||
准备的数据格式为: | ||
```python | ||
{"text": [text_1, text_2, ...]} | ||
``` | ||
**NOTE:** 字典的key为"text"。 | ||
|
||
根据文本和数据格式,代码如下: | ||
```python | ||
>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} | ||
>>> text_list = ["今天是个好日子", "天气预报说今天要下雨"] | ||
>>> text = {"text": text_list} | ||
``` | ||
|
||
## Step3:获取并验证结果 | ||
接下来发送请求到词法分析API,并得到结果,代码如下: | ||
```python | ||
# 指定预测方法为lac并发送post请求 | ||
>>> url = "http://127.0.0.1:8866/predict/text/lac" | ||
>>> r = requests.post(url=url, data=text) | ||
``` | ||
`LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果: | ||
```python | ||
# 打印预测结果 | ||
>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) | ||
{ | ||
"msg": "", | ||
"results": [ | ||
{ | ||
"tag": [ | ||
"TIME", "v", "q", "n" | ||
], | ||
"word": [ | ||
"今天", "是", "个", "好日子" | ||
] | ||
}, | ||
{ | ||
"tag": [ | ||
"n", "v", "TIME", "v", "v" | ||
], | ||
"word": [ | ||
"天气预报", "说", "今天", "要", "下雨" | ||
] | ||
} | ||
], | ||
"status": "0" | ||
} | ||
``` | ||
这样我们就完成了对词法分析的预测服务化部署和测试。 | ||
|
||
完整的测试代码见[lac_serving_demo.py](./lac_serving_demo.py)。 | ||
|
||
### 使用自定义词典 | ||
`LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下: | ||
```python | ||
{"user_dict": user_dict.txt} | ||
``` | ||
根据数据格式,具体代码如下: | ||
```python | ||
>>> # 指定自定义词典{"user_dict": dict.txt} | ||
>>> file = {"user_dict": open("dict.txt", "rb")} | ||
>>> # 请求接口时以文件的形式附加自定义词典,其余和不使用自定义词典的请求方式相同,此处不再赘述 | ||
>>> url = "http://127.0.0.1:8866/predict/text/lac" | ||
>>> r = requests.post(url=url, files=file, data=text) | ||
``` | ||
|
||
完整的测试代码见[lac_with_dict_serving_demo.py](./lac_with_dict_serving_demo.py)。 | ||
|
||
### 客户端请求新版模型的方式 | ||
对某些新版模型,客户端请求方式有所变化,更接近本地预测的请求方式,以降低学习成本。 | ||
以lac(2.1.0)为例,使用上述方法进行请求将提示: | ||
```python | ||
{ | ||
"Warnning": "This usage is out of date, please use 'application/json' as content-type to post to /predict/lac. See 'https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.6/docs/tutorial/serving.md' for more details." | ||
} | ||
``` | ||
对于lac(2.1.0),请求的方式如下: | ||
```python | ||
# coding: utf8 | ||
import requests | ||
import json | ||
|
||
if __name__ == "__main__": | ||
# 指定用于预测的文本并生成字典[text_1, text_2, ... ] | ||
text = ["今天是个好日子", "天气预报说今天要下雨"] | ||
# 以key的方式指定text传入预测方法的时的参数,此例中为"texts" | ||
# 对应本地部署,则为lac.analysis_lexical(text=[text1, text2]) | ||
data = {"texts": text, "batch_size": 1} | ||
# 指定预测方法为lac并发送post请求 | ||
url = "http://127.0.0.1:8866/predict/lac" | ||
# 指定post请求的headers为application/json方式 | ||
headers = {"Content-Type": "application/json"} | ||
|
||
r = requests.post(url=url, headers=headers, data=json.dumps(data)) | ||
|
||
# 打印预测结果 | ||
print(json.dumps(r.json(), indent=4, ensure_ascii=False)) | ||
``` | ||
对结果的解析等与前种方式一致,显示如下: | ||
```python | ||
{ | ||
"results": [ | ||
{ | ||
"tag": [ | ||
"TIME", "v", "q", "n" | ||
], | ||
"word": [ | ||
"今天", "是", "个", "好日子" | ||
] | ||
}, | ||
{ | ||
"tag": [ | ||
"n", "v", "TIME", "v", "v" | ||
], | ||
"word": [ | ||
"天气预报", "说", "今天", "要", "下雨" | ||
] | ||
} | ||
] | ||
} | ||
``` | ||
此Demo的具体信息和代码请参见[LAC Serving_2.1.0](./lac_2.1.0_serving_demo.py)。 |
20 changes: 20 additions & 0 deletions
20
demo/serving/module_serving/lexical_analysis_lac/lac_serving_demo.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# coding: utf8 | ||
import requests | ||
import json | ||
|
||
if __name__ == "__main__": | ||
# 指定用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} | ||
text = ["今天是个好日子", "天气预报说今天要下雨"] | ||
# 以key的方式指定text传入预测方法的时的参数,此例中为"data" | ||
# 对应本地部署,则为lac.analysis_lexical(data=text, batch_size=1) | ||
# 若使用lac版本低于2.2.0,需要将`text`参数改为`texts` | ||
data = {"text": text, "batch_size": 1} | ||
# 指定预测方法为lac并发送post请求,content-type类型应指定json方式 | ||
url = "http://127.0.0.1:8866/predict/lac" | ||
# 指定post请求的headers为application/json方式 | ||
headers = {"Content-Type": "application/json"} | ||
|
||
r = requests.post(url=url, headers=headers, data=json.dumps(data)) | ||
|
||
# 打印预测结果 | ||
print(json.dumps(r.json(), indent=4, ensure_ascii=False)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters