README.md 5.2 KB
Newer Older
W
wuzewu 已提交
1
```shell
K
KP 已提交
2
$ hub install chinese-bert-wwm-ext==2.0.0
W
wuzewu 已提交
3 4 5 6 7 8 9 10 11
```
<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), [Chinese-BERT-wwm技术报告](https://arxiv.org/abs/1906.08101)

## API
```python
K
KP 已提交
12 13 14 15 16 17
def __init__(
    task=None,
    load_checkpoint=None,
    label_map=None,
    num_classes=2,
    **kwargs,
W
wuzewu 已提交
18 19 20
)
```

K
KP 已提交
21
创建Module对象(动态图组网版本)。
W
wuzewu 已提交
22

K
KP 已提交
23
**参数**
W
wuzewu 已提交
24

K
KP 已提交
25 26 27 28 29
* `task`: 任务名称,可为`seq-cls`(文本分类任务,原来的`sequence_classification`在未来会被弃用)或`token-cls`(序列标注任务)。
* `load_checkpoint`:使用PaddleHub Fine-tune api训练保存的模型参数文件路径。
* `label_map`:预测时的类别映射表。
* `num_classes`:分类任务的类别数,如果指定了`label_map`,此参数可不传,默认2分类。
* `**kwargs`:用户额外指定的关键字字典类型的参数。
W
wuzewu 已提交
30
```python
K
KP 已提交
31 32 33 34 35
def predict(
    data,
    max_seq_len=128,
    batch_size=1,
    use_gpu=False
W
wuzewu 已提交
36 37 38 39 40
)
```

**参数**

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

**返回**

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

W
wuzewu 已提交
52
```python
K
KP 已提交
53 54 55 56
def get_embedding(
    data,
    use_gpu=False
)
W
wuzewu 已提交
57 58
```

K
KP 已提交
59
用于获取输入文本的句子粒度特征与字粒度特征
W
wuzewu 已提交
60 61 62

**参数**

K
KP 已提交
63 64
* `data`:输入文本列表,格式为\[\[sample\_a\_text\_a, sample\_a\_text\_b\], \[sample\_b\_text\_a, sample\_b\_text\_b\],…,\],其中每个元素都是一个样例,每个样例可以包含text\_a与text\_b。
* `use_gpu`:是否使用gpu,默认为False。对于GPU用户,建议开启use_gpu。
W
wuzewu 已提交
65 66 67

**返回**

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

W
wuzewu 已提交
70 71 72 73 74 75

**代码示例**

```python
import paddlehub as hub

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

model = hub.Module(
    name='chinese-bert-wwm-ext',
K
KP 已提交
85
    version='2.0.0',
K
KP 已提交
86 87 88 89 90 91 92
    task='seq-cls',
    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]))
```
W
wuzewu 已提交
93

K
KP 已提交
94 95 96
详情可参考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)
W
wuzewu 已提交
97

K
KP 已提交
98
## 服务部署
W
wuzewu 已提交
99

K
KP 已提交
100
PaddleHub Serving可以部署一个在线获取预训练词向量。
W
wuzewu 已提交
101

K
KP 已提交
102
### Step1: 启动PaddleHub Serving
W
wuzewu 已提交
103

K
KP 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
运行启动命令:

```shell
$ hub serving start -m chinese-bert-wwm-ext
```

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

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

### Step2: 发送预测请求

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

```python
import requests
import json

# 指定用于获取embedding的文本[[text_1], [text_2], ... ]}
text = [["今天是个好日子"], ["天气预报说今天要下雨"]]
# 以key的方式指定text传入预测方法的时的参数,此例中为"data"
# 对应本地部署,则为module.get_embedding(data=text)
data = {"data": text}
# 发送post请求,content-type类型应指定json方式,url中的ip地址需改为对应机器的ip
url = "http://10.12.121.132:8866/predict/chinese-bert-wwm-ext"
# 指定post请求的headers为application/json方式
headers = {"Content-Type": "application/json"}

r = requests.post(url=url, headers=headers, data=json.dumps(data))
print(r.json())
W
wuzewu 已提交
134 135 136 137 138 139 140 141 142 143 144 145
```

## 查看代码
https://github.com/ymcui/Chinese-BERT-wwm


## 贡献者

[ymcui](https://github.com/ymcui)

## 依赖

K
KP 已提交
146
paddlepaddle >= 2.0.0
W
wuzewu 已提交
147

K
KP 已提交
148
paddlehub >= 2.0.0
W
wuzewu 已提交
149 150 151 152 153 154

## 更新历史

* 1.0.0

  初始发布
K
KP 已提交
155

K
KP 已提交
156
* 2.0.0
K
KP 已提交
157 158

  全面升级动态图,接口有所变化。任务名称调整,增加序列标注任务`token-cls`