# lac
|模型名称|lac|
| :--- | :---: |
|类别|文本-词法分析|
|网络|BiGRU+CRF|
|数据集|百度自建数据集|
|是否支持Fine-tuning|否|
|模型大小|35MB|
|最新更新日期|2021-02-26|
|数据指标|Precision=88.0%,Recall=88.7%,F1-Score=88.4%|
## 一、模型基本信息
- ### 模型介绍
- Lexical Analysis of Chinese,简称 LAC,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。在百度自建数据集上评测,LAC效果:Precision=88.0%,Recall=88.7%,F1-Score=88.4%。该PaddleHub Module支持预测。
- 更多详情请参考:[LAC论文](https://arxiv.org/abs/1807.01882)
## 二、安装
- ### 1、环境依赖
- paddlepaddle >= 1.6.2
- paddlehub >= 1.6.0 | [如何安装PaddleHub](../../../../docs/docs_ch/get_start/installation.rst)
- 若使用词典干预功能,额外依赖第三方库 pyahocorasick
- ```shell
$ pip install pyahocorasick
```
- ### 2、安装
- ```shell
$ hub install lac
```
- 如您安装时遇到问题,可参考:[零基础windows安装](../../../../docs/docs_ch/get_start/windows_quickstart.md)
| [零基础Linux安装](../../../../docs/docs_ch/get_start/linux_quickstart.md) | [零基础MacOS安装](../../../../docs/docs_ch/get_start/mac_quickstart.md)
## 三、模型API预测
- ### 1、命令行预测
- ```shell
$ hub run lac --input_text "今天是个好日子"
```
- 或者
- ```shell
$ hub run lac --input_file test.txt --user_dict user.dict
```
- test.txt 存放待分词文本, 如:
- ```shell
今天是个好日子
今天天气晴朗
```
- user.dict 为用户自定义词典,可以不指定,当指定自定义词典时,可以干预默认分词结果。如:
- ```shell
春天/SEASON
花/n 开/v
秋天的风
落 阳
```
- 词典文件每行表示一个定制化的item,由一个单词或多个连续的单词组成,每个单词后使用'/'表示标签,如果没有'/'标签则会使用模型默认的标签。每个item单词数越多,干预效果会越精准。
- Note:该PaddleHub Module使用词典干预功能时,依赖于第三方库pyahocorasick,请自行安装
- 通过命令行方式实现文字识别模型的调用,更多请见 [PaddleHub命令行指令](../../../../docs/docs_ch/tutorial/cmd_usage.rst)
- ### 2、预测代码示例
- ```python
import paddlehub as hub
lac = hub.Module(name="lac")
test_text = ["今天是个好日子", "天气预报说今天要下雨", "下一班地铁马上就要到了"]
results = lac.cut(text=test_text, use_gpu=False, batch_size=1, return_tag=True)
for result in results:
print(result['word'])
print(result['tag'])
# ['今天', '是', '个', '好日子']
# ['TIME', 'v', 'q', 'n']
# ['天气预报', '说', '今天', '要', '下雨']
# ['n', 'v', 'TIME', 'v', 'v']
# ['下', '一班', '地铁', '马上', '就要', '到', '了']
# ['f', 'm', 'n', 'd', 'v', 'v', 'xc']
```
- ### 3、API
- ```python
def __init__(user_dict=None)
```
- 构造LAC对象
- **参数**
- user_dict(str): 自定义词典路径。如果需要使用自定义词典,则可通过该参数设置,否则不用传入该参数。
- ```python
def cut(text, use_gpu=False, batch_size=1, return_tag=True)
```
- lac预测接口,预测输入句子的分词结果
- **参数**
- text(str or list): 待预测数据,单句预测数据(str类型)或者批量预测(list,每个元素为str
- use_gpu(bool): 是否使用GPU预测,如果使用GPU预测,则在预测之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置
- batch_size(int): 批处理大小
- return_tag(bool): 预测结果是否需要返回分词标签结果
- ```python
def lexical_analysis(texts=[], data={}, use_gpu=False, batch_size=1, user_dict=None, return_tag=True)
```
- **该接口将会在未来版本被废弃,如有需要,请使用cut接口预测**
- lac预测接口,预测输入句子的分词结果
- **参数**
- texts(list): 待预测数据,如果使用texts参数,则不用传入data参数,二选一即可
- data(dict): 预测数据,key必须为text,value是带预测数据。如果使用data参数,则不用传入texts参数,二选一即可。建议使用texts参数,data参数后续会废弃
- use_gpu(bool): 是否使用GPU预测,如果使用GPU预测,则在预测之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置
- batch_size(int): 批处理大小
- return_tag(bool): 预测结果是否需要返回分词标签结果
- **返回**
- results(list): 分词结果
- ```python
def set_user_dict(dict_path)
```
- 加载用户自定义词典
- **参数**
- dict_path(str ): 自定义词典路径
- ```python
def del_user_dict()
```
- 删除自定义词典
- ```python
def get_tags()
```
- 获取lac的标签
- **返回**
- tag_name_dict(dict): lac的标签
## 四、服务部署
- PaddleHub Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。
- ### 第一步:启动PaddleHub Serving
- 运行启动命令:
- ```shell
$ hub serving start -c serving_config.json
```
`serving_config.json`的内容如下:
```json
{
"modules_info": {
"lac": {
"init_args": {
"version": "2.1.0",
"user_dict": "./test_dict.txt"
},
"predict_args": {}
}
},
"port": 8866,
"use_singleprocess": false,
"workers": 2
}
```
- 其中user_dict含义为自定义词典路径,如果不使用lac自定义词典功能,则可以不填入。
- 这样就完成了一个词法分析服务化API的部署,默认端口号为8866。
- **NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。
- ### 第二步:发送预测请求
- 配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
- ```python
import requests
import json
# 待预测数据
text = ["今天是个好日子", "天气预报说今天要下雨"]
# 设置运行配置
# 对应本地预测lac.analysis_lexical(texts=text, batch_size=1, use_gpu=True)
data = {"texts": text, "batch_size": 1, "use_gpu":True}
# 指定预测方法为lac并发送post请求,content-type类型应指定json方式
# HOST_IP为服务器IP
url = "http://HOST_IP:8866/predict/lac"
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))
```
- 关于PaddleHub Serving更多信息参考:[服务部署](../../../../docs/docs_ch/tutorial/serving.md)
- ### Gradio APP 支持
从 PaddleHub 2.3.1 开始支持使用链接 http://127.0.0.1:8866/gradio/lac 在浏览器中访问 lac 的 Gradio APP。
## 五、更新历史
* 1.0.0
初始发布
* 1.0.1
修复python2中编码问题
* 1.1.0
支持词典干预,通过配置自定义词典可以对LAC默认分词结果进行干预
* 1.1.1
修复输入文本中带有/字符时,使用词典干预会崩溃的问题
* 2.0.0
修复输入文本为空、“ ”或者“\n”,使用LAC会崩溃的问题
更新embedding_size, hidden_size为128,压缩模型,性能提升
* 2.1.0
lac预测性能大幅提升
支持是否返回分词标签tag,同时简化预测接口使用
* 2.1.1
当输入文本为空字符串“”,返回切词后结果为空字符串“”,分词tag也为“”
* 2.2.0
升级自定义词典功能,支持增加不属于lac默认提供的词性
* 2.3.0
移除 fluid api
* 2.4.0
添加 Gradio APP 支持
- ```shell
$ hub install lac==2.4.0
```