README.md 5.4 KB
Newer Older
1
```shell
L
linjieccc 已提交
2
$ hub install bert-large-uncased==2.0.2
3
```
K
KP 已提交
4

5 6 7 8 9 10 11 12 13 14 15 16
<p align="center">
<img src="https://bj.bcebos.com/paddlehub/paddlehub-img/bert_network.png"  hspace='10'/> <br />
</p>

更多详情请参考[BERT论文](https://arxiv.org/abs/1810.04805)

## API

```python
def __init__(
    task=None,
    load_checkpoint=None,
K
KP 已提交
17 18
    label_map=None,
    num_classes=2,
L
linjieccc 已提交
19
    suffix=False,
K
KP 已提交
20 21
    **kwargs,
)
22 23 24 25 26 27
```

创建Module对象(动态图组网版本)。

**参数**

K
KP 已提交
28
* `task`: 任务名称,可为`seq-cls`(文本分类任务,原来的`sequence_classification`在未来会被弃用)或`token-cls`(序列标注任务)。
29 30
* `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。
* `label_map`:预测时的类别映射表。
K
KP 已提交
31
* `num_classes`:分类任务的类别数,如果指定了`label_map`,此参数可不传,默认2分类。
L
linjieccc 已提交
32
* `suffix`: 序列标注任务的标签格式,如果设定为`True`,标签以'-B', '-I', '-E' 或者 '-S'为结尾,此参数默认为`False`
K
KP 已提交
33
* `**kwargs`:用户额外指定的关键字字典类型的参数。
L
linjieccc 已提交
34

35 36 37 38 39
```python
def predict(
    data,
    max_seq_len=128,
    batch_size=1,
K
KP 已提交
40 41
    use_gpu=False
)
42 43 44 45
```

**参数**

46
* `data`: 待预测数据,格式为\[\[sample\_a\_text\_a, sample\_a\_text\_b\], \[sample\_b\_text\_a, sample\_b\_text\_b\],…,\],其中每个元素都是一个样例,每个样例可以包含text\_a与text\_b。每个样例文本数量(1个或者2个)需和训练时保持一致。
47 48 49 50 51 52
* `max_seq_len`:模型处理文本的最大长度
* `batch_size`:模型批处理大小
* `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。

**返回**

53 54 55 56
* `results`:list类型,不同任务类型的返回结果如下
  * 文本分类:列表里包含每个句子的预测标签,格式为\[label\_1, label\_2, …,\]
  * 序列标注:列表里包含每个句子每个token的预测标签,格式为\[\[token\_1, token\_2, …,\], \[token\_1, token\_2, …,\], …,\]

57 58
```python
def get_embedding(
K
KP 已提交
59
    data,
60 61 62 63 64 65 66 67
    use_gpu=False
)
```

用于获取输入文本的句子粒度特征与字粒度特征

**参数**

K
KP 已提交
68
* `data`:输入文本列表,格式为\[\[sample\_a\_text\_a, sample\_a\_text\_b\], \[sample\_b\_text\_a, sample\_b\_text\_b\],…,\],其中每个元素都是一个样例,每个样例可以包含text\_a与text\_b。
69 70 71 72 73 74 75 76 77 78 79 80 81
* `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。

**返回**

* `results`:list类型,格式为\[\[sample\_a\_pooled\_feature, sample\_a\_seq\_feature\], \[sample\_b\_pooled\_feature, sample\_b\_seq\_feature\],…,\],其中每个元素都是对应样例的特征输出,每个样例都有句子粒度特征pooled\_feature与字粒度特征seq\_feature。


**代码示例**

```python
import paddlehub as hub

data = [
K
KP 已提交
82 83 84
    ['这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般'],
    ['怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片'],
    ['作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。'],
85 86 87 88
]
label_map = {0: 'negative', 1: 'positive'}

model = hub.Module(
K
KP 已提交
89
    name='bert-large-uncased',
L
linjieccc 已提交
90
    version='2.0.2',
K
KP 已提交
91
    task='seq-cls',
92 93 94 95 96 97 98
    load_checkpoint='/path/to/parameters',
    label_map=label_map)
results = model.predict(data, max_seq_len=50, batch_size=1, use_gpu=False)
for idx, text in enumerate(data):
    print('Data: {} \t Lable: {}'.format(text, results[idx]))
```

K
KP 已提交
99 100 101
详情可参考PaddleHub示例:
- [文本分类](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0.0-beta/demo/text_classification)
- [序列标注](https://github.com/PaddlePaddle/PaddleHub/tree/release/v2.0.0-beta/demo/sequence_labeling)
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

## 服务部署

PaddleHub Serving可以部署一个在线获取预训练词向量。

### Step1: 启动PaddleHub Serving

运行启动命令:

```shell
$ hub serving start -m bert-large-uncased
```

这样就完成了一个获取预训练词向量服务化API的部署,默认端口号为8866。

**NOTE:** 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。

### Step2: 发送预测请求

配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果

```python
import requests
import json

K
KP 已提交
127 128 129 130 131 132
# 指定用于获取embedding的文本[[text_1], [text_2], ... ]}
text = [["今天是个好日子"], ["天气预报说今天要下雨"]]
# 以key的方式指定text传入预测方法的时的参数,此例中为"data"
# 对应本地部署,则为module.get_embedding(data=text)
data = {"data": text}
# 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip
133
url = "http://127.0.0.1:8866/predict/bert-large-uncased"
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
# 指定post请求的headers为application/json方式
headers = {"Content-Type": "application/json"}

r = requests.post(url=url, headers=headers, data=json.dumps(data))
print(r.json())
```

##   查看代码

https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP/pretrain_langauge_models/BERT


## 依赖

paddlepaddle >= 2.0.0

paddlehub >= 2.0.0

## 更新历史

* 1.0.0

  初始发布

* 1.1.0

  支持get_embedding与get_params_layer

* 2.0.0

  全面升级动态图,接口有所变化。
K
KP 已提交
165 166 167 168

* 2.0.1

  任务名称调整,增加序列标注任务`token-cls`
169 170 171

* 2.0.2

W
wuzewu 已提交
172
  增加文本匹配任务`text-matching`