Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 26a7b04

Browse files
Update README.md
1 parent b8b87dd commit 26a7b04

3 files changed

Lines changed: 60 additions & 40 deletions

File tree

‎docs/model_zoo/taskflow.md‎

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -398,47 +398,47 @@ from paddlenlp import Taskflow
398398
### 信息抽取
399399
<details><summary>&emsp; 适配多场景的开放域通用信息抽取工具 </summary><div>
400400

401-
开放域信息抽取(OIE)是信息抽取的一种全新的范式,主要思想是减少人工参与,利用单一模型支持多种类型的开放抽取任务,用户可以使用自然语言自定义抽取目标,在实体、关系类别等未定义的情况下抽取输入文本中的信息片段。
401+
开放域信息抽取(OIE)是信息抽取的一种全新范式,主要思想是减少人工参与,利用单一模型支持多种类型的开放抽取任务,用户可以使用自然语言自定义抽取目标,在实体、关系类别等未定义的情况下抽取输入文本中的信息片段。
402402

403403
#### 支持多场景信息抽取任务
404404

405405
- 命名实体识别
406406

407-
命名实体识别(Named Entity Recognition,简称NER),是指识别文本中具有特定意义的实体。在开放域信息抽取中,用户可以制定任意实体类型作为抽取的目标
407+
命名实体识别(Named Entity Recognition,简称NER),是指识别文本中具有特定意义的实体。在开放域信息抽取中,抽取的类别没有限制,用户可以自己定义
408408

409-
例如抽取的目标实体类型是"出租方"和"承租方", schema构造如下:
409+
例如抽取的目标实体类型是"时间"、"选手"和"赛事名称", schema构造如下:
410410

411411
```text
412-
['出租方', '承租方']
412+
['时间', '选手', '赛事名称']
413413
```
414414

415415
预测:
416416

417417
```python
418418
>>> from paddlenlp import Taskflow
419419

420-
>>> schema = ['出租方', '承租方'] # Define the schema for entity extraction
420+
>>> schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
421421
>>> ie = Taskflow('information_extraction', schema=schema)
422-
>>> ie('出租方:小明 地址:筒子街12号 电话:12345678900 承租方:小红 地址:新华路8号 电话:1234500000')
423-
[{'出租方': [{'text': '小明', 'start': 4, 'end': 6, 'probability': 0.9767557939143963}], '承租方': [{'text': '小红', 'start': 36, 'end': 38, 'probability': 0.9588206726186428}]}]
422+
>>> ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!")
423+
[{'时间': [{'text': '2月8日上午', 'start': 0, 'end': 6, 'probability': 0.9907337794563702}], '选手': [{'text': '谷爱凌', 'start': 28, 'end': 31, 'probability': 0.8914310308098763}], '赛事名称': [{'text': '北京冬奥会自由式滑雪女子大跳台决赛', 'start': 6, 'end': 23, 'probability': 0.8944207860063003}]}]
424424
```
425425

426426
- 关系抽取
427427

428428
关系抽取(Relation Extraction,简称RE),是指从文本中识别实体并抽取实体之间的语义关系,即抽取三元组(entity1,关系类型,entity2)。
429429

430-
例如抽取的目标是"出租方的地址"、"出租方的电话"、"承租方的地址"和"承租方的电话", schema构造如下:
430+
例如抽取的目标是"歌曲名"对应实体词的"歌手"、"所属专辑", schema构造如下:
431431

432432
```text
433-
[{'出租方': ['地址', '电话'], '承租方': ['地址', '电话']}]
433+
{'歌曲名称': ['歌手', '所属专辑']}
434434
```
435435

436436
预测:
437437

438438
```python
439-
>>> schema = [{"歌曲名称":["歌手", "所属专辑"]}] # Define the schema for relation extraction
439+
>>> schema = {'歌曲名称': ['歌手', '所属专辑']} # Define the schema for relation extraction
440440
>>> ie.set_schema(schema) # Reset schema
441-
>>> ie("《告别了》是孙耀威在专辑爱的故事里面的歌曲")
441+
>>> ie('《告别了》是孙耀威在专辑爱的故事里面的歌曲')
442442
[{'歌曲名称': [{'text': '告别了', 'start': 1, 'end': 4, 'probability': 0.7721050787207417, 'relations': {'歌手': [{'text': '孙耀威', 'start': 6, 'end': 9, 'probability': 0.9996328066160487}], '所属专辑': [{'text': '爱的故事', 'start': 12, 'end': 16, 'probability': 0.9981007942846247}]}}]}]
443443
```
444444

@@ -448,18 +448,18 @@ from paddlenlp import Taskflow
448448

449449
事件抽取 (Event Extraction, 简称EE),是指从自然语言文本中抽取事件并识别事件类型和事件论元的技术。UIE所包含的事件抽取任务,是指根据已知事件类型,抽取该事件所包含的事件论元。
450450

451-
例如抽取的目标是"地震""地震强度"、"时间"、"震中位置"和"震源深度",schema构造如下:
451+
例如抽取的目标是"地震"事件的"地震强度"、"时间"、"震中位置"和"震源深度"这些信息,schema构造如下:
452452

453453
```text
454-
[{'地震触发词': ['地震强度', '时间', '震中位置', '震源深度']}]
454+
{'地震触发词': ['地震强度', '时间', '震中位置', '震源深度']}
455455
```
456456

457457
触发词的格式统一为`XX触发词`,`XX`表示具体事件类型,上例中的事件类型是`地震`,则对应触发词为`地震触发词`
458458

459459
预测:
460460

461461
```python
462-
>>> schema = [{'地震触发词': ['地震强度', '时间', '震中位置', '震源深度']}] # Define the schema for event extraction
462+
>>> schema = {'地震触发词': ['地震强度', '时间', '震中位置', '震源深度']} # Define the schema for event extraction
463463
>>> ie.set_schema(schema) # Reset schema
464464
>>> ie('中国地震台网正式测定:5月16日06时08分在云南临沧市凤庆县(北纬24.34度,东经99.98度)发生3.5级地震,震源深度10千米。')
465465
[{'地震触发词': [{'text': '地震', 'start': 56, 'end': 58, 'probability': 0.9987181623528585, 'relation': {'地震强度': [{'text': '3.5级', 'start': 52, 'end': 56, 'probability': 0.9962985320905915}], '时间': [{'text': '5月16日06时08分', 'start': 11, 'end': 22, 'probability': 0.9882578028575182}], '震中位置': [{'text': '云南临沧市凤庆县(北纬24.34度,东经99.98度)', 'start': 23, 'end': 50, 'probability': 0.8551415716584501}], '震源深度': [{'text': '10千米', 'start': 63, 'end': 67, 'probability': 0.999158304648045}]}}]}]
@@ -469,16 +469,18 @@ from paddlenlp import Taskflow
469469

470470
评论观点抽取,是指抽取文本中包含的评价维度、观点词。
471471

472-
例如希望抽取文本中包含的评价维度以及对应的观点词,schema构造如下:
472+
例如抽取的目标是文本中包含的评价维度以及对应的观点词,schema构造如下:
473473

474474
```text
475-
[{'评价维度': ['观点词']}]
475+
{'评价维度': '观点词'}
476476
```
477477

478+
评论观点抽取默认统一使用`评价维度``观点词`作为prompt。
479+
478480
预测:
479481

480482
```python
481-
>>> schema = [{'评价维度': ['观点词']}] # Define the schema for opinion extraction
483+
>>> schema = {'评价维度': '观点词'} # Define the schema for opinion extraction
482484
>>> ie.set_schema(schema) # Reset schema
483485
>>> ie('个人觉得管理太混乱了,票价太高了')
484486
[{'评价维度': [{'text': '管理', 'start': 4, 'end': 6, 'probability': 0.8902373594544031, 'relation': {'观点词': [{'text': '混乱', 'start': 7, 'end': 9, 'probability': 0.9993566520321409}]}}, {'text': '票价', 'start': 11, 'end': 13, 'probability': 0.9856116411308662, 'relation': {'观点词': [{'text': '', 'start': 14, 'end': 15, 'probability': 0.995628420935013}]}}]}]
@@ -489,40 +491,56 @@ from paddlenlp import Taskflow
489491
句子级情感倾向分类,即判断句子的情感倾向是"正向"还是"负向",schema构造如下:
490492

491493
```text
492-
['情感倾向[正向,负向]']
494+
'情感倾向[正向,负向]'
493495
```
494496

495497
预测:
496498

497499
```python
498-
>>> schema = ['情感倾向[正向,负向]'] # Define the schema for sentence-level sentiment classification
500+
>>> schema = '情感倾向[正向,负向]' # Define the schema for sentence-level sentiment classification
499501
>>> ie.set_schema(schema) # Reset schema
500502
>>> ie('这个产品用起来真的很流畅,我非常喜欢')
501503
[{'情感倾向[正向,负向]': [{'text': '正向', 'probability': 0.9990110458312529}]}]
502504
```
503505

504-
#### 多模型选择,满足精度、速度要求
506+
- 跨任务跨领域抽取
505507

506-
- 使用`UIE-Tiny`进行预测
507-
```python
508-
>>> from paddlenlp import Taskflow
508+
例如同时对文本进行实体抽取和关系抽取,schema可按照如下方式进行构造:
509509

510-
>>> schema = ['出租方', '承租方']
511-
>>> ie = Taskflow('information_extraction', schema=schema, model="uie-medium")
512-
>>> ie('出租方:小明 地址:筒子街12号 电话:12345678900 承租方:小红 地址:新华路8号 电话:1234500000')
513-
[{'出租方': [{'text': '小明', 'start': 4, 'end': 6, 'probability': 0.9944859053454067}], '承租方': [{'text': '小红', 'start': 36, 'end': 38, 'probability': 0.8872193425652384}]}]
510+
```text
511+
['寺庙', {'丈夫': '妻子'}]
514512
```
515513

516-
- 使用`UIE-Large`进行预测
514+
```python
515+
>>> schema = ['寺庙', {'丈夫': '妻子'}]
516+
>>> ie.set_schema(schema)
517+
>>> ie('李治即位后,让身在感业寺的武则天续起头发,重新纳入后宫。')
518+
[{'寺庙': [{'text': '感业寺', 'start': 9, 'end': 12, 'probability': 0.998334669586864}], '丈夫': [{'text': '李治', 'start': 0, 'end': 2, 'probability': 0.993496447299993, 'relations': {'妻子': [{'text': '武则天', 'start': 13, 'end': 16, 'probability': 0.9994008822614759}]}}]}]
519+
```
520+
521+
522+
#### 多模型选择,满足精度、速度要求
523+
524+
- 模型选择
525+
526+
| 模型 | 结构 |
527+
| :---: | :--------: |
528+
| `uie-tiny`| 6-layers, 768-hidden, 12-heads |
529+
| `uie-base` (默认)| 12-layers, 768-hidden, 12-heads |
530+
| `uie-large`| 24-layers, 1024-hidden, 16-heads |
531+
532+
- 使用`UIE-Tiny`进行预测
533+
517534
```python
518535
>>> from paddlenlp import Taskflow
519536

520-
>>> schema = ['出租方', '承租方']
521-
>>> ie = Taskflow('information_extraction', schema=schema, model="uie-large")
522-
>>> ie('出租方:小明 地址:筒子街12号 电话:12345678900 承租方:小红 地址:新华路8号 电话:1234500000')
523-
[{'出租方': [{'text': '小明', 'start': 4, 'end': 6, 'probability': 0.9979592241500157}], '承租方': [{'text': '小红', 'start': 36, 'end': 38, 'probability': 0.7938207126153785}]}]
537+
>>> schema = ['时间', '选手', '赛事名称']
538+
>>> ie = Taskflow('information_extraction', schema=schema, model="uie-tiny")
539+
>>> ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!")
540+
[{'时间': [{'text': '2月8日上午', 'start': 0, 'end': 6, 'probability': 0.9939956659967066}], '选手': [{'text': '谷爱凌', 'start': 28, 'end': 31, 'probability': 0.8323544377549155}], '赛事名称': [{'text': '北京冬奥会自由式滑雪女子大跳台决赛', 'start': 6, 'end': 23, 'probability': 0.624098394612048}]}]
524541
```
525542

543+
526544
#### 可配置参数说明
527545
* `batch_size`:批处理大小,请结合机器情况进行调整,默认为1。
528546
* `model`:选择任务使用的模型,默认为`uie-base`,可选有`uie-tiny`,`uie-base``uie-large`

‎paddlenlp/taskflow/information_extraction.py‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
2727
from paddlenlp import Taskflow
2828
2929
# Entity Extraction
30-
schema = ['出租方', '承租方'] # Define the schema for entity extraction
30+
schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
3131
ie = Taskflow('information_extraction', schema=schema)
32-
ie('出租方:小明 地址:筒子街12号 电话:12345678900 承租方:小红 地址:新华路8号 电话:1234500000')
32+
ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!")
3333
'''
34-
[{'出租方': [{'text': '小明', 'start': 4, 'end': 6, 'probability': 0.9767557939143963}], '承租方': [{'text': '小红', 'start': 36, 'end': 38, 'probability': 0.9588206726186428}]}]
34+
[{'时间': [{'text': '2月8日上午', 'start': 0, 'end': 6, 'probability': 0.9907337794563702}], '选手': [{'text': '谷爱凌', 'start': 28, 'end': 31, 'probability': 0.8914310308098763}], '赛事名称': [{'text': '北京冬奥会自由式滑雪女子大跳台决赛', 'start': 6, 'end': 23, 'probability': 0.8944207860063003}]}]
3535
'''
3636
3737
# Relation Extraction
@@ -417,8 +417,10 @@ def _convert_ids_to_results(self, examples, sentence_ids, probs):
417417
prompt = example["prompt"]
418418
for i in range(len(sentence_id)):
419419
start, end = sentence_id[i]
420-
if end < 0:
420+
if end <= 0:
421421
# ignore [SEP]
422+
start += len(prompt)
423+
end += len(prompt)
422424
result = {"text": prompt[start:end], "probability": prob[i]}
423425
result_list.append(result)
424426
else:

‎paddlenlp/taskflow/utils.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -860,13 +860,13 @@ def get_id_and_prob(spans, offset_map):
860860
else:
861861
break
862862

863-
for i in range(1, prompt_length):
863+
for i in range(1, prompt_length+1):
864864
offset_map[i][0] -= prompt_length
865865
offset_map[i][1] -= prompt_length
866866

867867
sentence_id = []
868868
prob = []
869-
for s, e in spans:
870-
prob.append(s[1] * e[1])
871-
sentence_id.append((offset_map[s[0]][0], offset_map[e[0]][1]))
869+
for start, end in spans:
870+
prob.append(start[1] * end[1])
871+
sentence_id.append((offset_map[start[0]][0], offset_map[end[0]][1]))
872872
return sentence_id, prob

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /