Skip to content

Commit 47430dc

Browse files
authored
Merge pull request #1181 from linjieccc/fix_taskflow_senta
Add confidence score for sentiment analysis tasks
2 parents 00ef7de + c43a722 commit 47430dc

File tree

5 files changed

+27
-15
lines changed

5 files changed

+27
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ ddp("百度是一家高科技公司")
7777
# 情感分析
7878
senta = Taskflow("sentiment_analysis")
7979
senta("怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片")
80-
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative'}]
80+
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative', 'score': 0.6691398620605469}]
8181
```
8282
更多使用方法请参考[Taskflow文档](./docs/model_zoo/taskflow.md)
8383

README_en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ ddp("百度是一家高科技公司")
7777
# Sentiment Analysis
7878
senta = Taskflow("sentiment_analysis")
7979
senta("怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片")
80-
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative'}]
80+
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative', 'score': 0.6691398620605469}]
8181
```
8282

8383
For more usage please refer to [Taskflow Docs](./docs/model_zoo/taskflow.md)

docs/model_zoo/taskflow.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,16 +146,16 @@ from paddlenlp import Taskflow
146146

147147
senta = Taskflow("sentiment_analysis")
148148
senta("怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片")
149-
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative'}]
149+
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative', 'score': 0.6691398620605469}]
150150

151151
senta(["怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片",
152152
"作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间"])
153-
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative'}, {'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间', 'label': 'positive'}]
153+
>>> [{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative', 'score': 0.6691398620605469}, {'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间', 'label': 'positive', 'score': 0.9857505559921265}]
154154

155155
# 使用SKEP情感分析预训练模型进行预测
156156
senta = Taskflow("sentiment_analysis", model="skep_ernie_1.0_large_ch")
157157
senta("作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。")
158-
>>> [{'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。', 'label': 'positive'}]
158+
>>> [{'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。', 'label': 'positive', 'score': 0.984320878982544}]
159159
```
160160

161161
### 知识挖掘

paddlenlp/taskflow/models/sentiment_analysis_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def forward(self, text, seq_len):
129129
logits = self.output_layer(fc_out)
130130
probs = F.softmax(logits, axis=1)
131131
idx = paddle.argmax(probs, axis=1).numpy()
132-
return idx
132+
return idx, probs
133133

134134

135135
class SkepSequenceModel(SkepPretrainedModel):
@@ -158,4 +158,4 @@ def forward(self,
158158
logits = self.classifier(pooled_output)
159159
probs = F.softmax(logits, axis=1)
160160
idx = paddle.argmax(probs, axis=1)
161-
return idx
161+
return idx, probs

paddlenlp/taskflow/sentiment_analysis.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,21 @@
4949
senta = Taskflow("sentiment_analysis")
5050
senta("怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片")
5151
'''
52-
[{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative'}]
52+
[{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative', 'score': 0.6691398620605469}]
5353
'''
5454
5555
senta(["怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片",
5656
"作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间"])
5757
'''
58-
[{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative'},
59-
{'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间', 'label': 'positive'}
58+
[{'text': '怀着十分激动的心情放映,可是看着看着发现,在放映完毕后,出现一集米老鼠的动画片', 'label': 'negative', 'score': 0.6691398620605469},
59+
{'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间', 'label': 'positive', 'score': 0.9857505559921265}
6060
]
6161
'''
6262
6363
senta = Taskflow("sentiment_analysis", model="skep_ernie_1.0_large_ch")
6464
senta("作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。")
6565
'''
66-
[{'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。', 'label': 'positive'}]
66+
[{'text': '作为老的四星酒店,房间依然很整洁,相当不错。机场接机服务很好,可以在车上办理入住手续,节省时间。', 'label': 'positive', 'score': 0.984320878982544}]
6767
'''
6868
"""
6969

@@ -115,7 +115,7 @@ def _construct_model(self, model):
115115
padding_idx=pad_token_id,
116116
pooling_type='max')
117117
model_path = download_file(self._task_path, model + ".pdparams",
118-
URLS[model][0], URLS[model][1], model)
118+
URLS[model][0], URLS[model][1])
119119

120120
# Load the model parameter for the predict
121121
state_dict = paddle.load(model_path)
@@ -126,7 +126,7 @@ def _construct_tokenizer(self, model):
126126
"""
127127
Construct the tokenizer for the predictor.
128128
"""
129-
full_name = download_file(self.model, "senta_word_dict.txt",
129+
full_name = download_file(self._task_path, "senta_word_dict.txt",
130130
URLS['bilstm_vocab'][0],
131131
URLS['bilstm_vocab'][1])
132132
vocab = Vocab.load_vocabulary(
@@ -181,28 +181,34 @@ def _run_model(self, inputs):
181181
Run the task model from the outputs of the `_tokenize` function.
182182
"""
183183
results = []
184+
scores = []
184185
with static_mode_guard():
185186
for batch in inputs['data_loader']:
186187
ids, lens = self.batchify_fn(batch)
187188
self.input_handles[0].copy_from_cpu(ids)
188189
self.input_handles[1].copy_from_cpu(lens)
189190
self.predictor.run()
190191
idx = self.output_handle[0].copy_to_cpu().tolist()
192+
probs = self.output_handle[1].copy_to_cpu().tolist()
191193
labels = [self._label_map[i] for i in idx]
194+
score = [max(prob) for prob in probs]
192195
results.extend(labels)
196+
scores.extend(score)
193197

194198
inputs['result'] = results
199+
inputs['score'] = scores
195200
return inputs
196201

197202
def _postprocess(self, inputs):
198203
"""
199204
This function will convert the model output to raw text.
200205
"""
201206
final_results = []
202-
for text, label in zip(inputs['text'], inputs['result']):
207+
for text, label, score in zip(inputs['text'], inputs['result'], inputs['score']):
203208
result = {}
204209
result['text'] = text
205210
result['label'] = label
211+
result['score'] = score
206212
final_results.append(result)
207213
return final_results
208214

@@ -302,27 +308,33 @@ def _run_model(self, inputs):
302308
Run the task model from the outputs of the `_tokenize` function.
303309
"""
304310
results = []
311+
scores = []
305312
with static_mode_guard():
306313
for batch in inputs['data_loader']:
307314
ids, segment_ids = self._batchify_fn(batch)
308315
self.input_handles[0].copy_from_cpu(ids)
309316
self.input_handles[1].copy_from_cpu(segment_ids)
310317
self.predictor.run()
311318
idx = self.output_handle[0].copy_to_cpu().tolist()
319+
probs = self.output_handle[1].copy_to_cpu().tolist()
312320
labels = [self._label_map[i] for i in idx]
321+
score = [max(prob) for prob in probs]
313322
results.extend(labels)
323+
scores.extend(score)
314324

315325
inputs['result'] = results
326+
inputs['score'] = scores
316327
return inputs
317328

318329
def _postprocess(self, inputs):
319330
"""
320331
The model output is tag ids, this function will convert the model output to raw text.
321332
"""
322333
final_results = []
323-
for text, label in zip(inputs['text'], inputs['result']):
334+
for text, label, score in zip(inputs['text'], inputs['result'], inputs['score']):
324335
result = {}
325336
result['text'] = text
326337
result['label'] = label
338+
result['score'] = score
327339
final_results.append(result)
328340
return final_results

0 commit comments

Comments
 (0)