PaddleNLP--UIE(二)--小样本快速提升性能(含doccona标注)
相關文章:
1.快遞單中抽取關鍵信息【一】----基于BiGRU+CR+預訓練的詞向量優化
2.快遞單信息抽取【二】基于ERNIE1.0至ErnieGram + CRF預訓練模型
3.快遞單信息抽取【三】–五條標注數據提高準確率,僅需五條標注樣本,快速完成快遞單信息任務
1)PaddleNLP通用信息抽取技術UIE【一】產業應用實例:信息抽取{實體關系抽取、中文分詞、精準實體標。情感分析等}、文本糾錯、問答系統、閑聊機器人、定制訓練
2)PaddleNLP–UIE(二)–小樣本快速提升性能(含doccona標注)
!強烈推薦:數據標注平臺doccano----簡介、安裝、使用、踩坑記錄
本項目鏈接:
https://aistudio.baidu.com/aistudio/projectdetail/4160689?contributionType=1
項目主頁:
https://aistudio.baidu.com/aistudio/usercenter
0.信息抽取定義以及難點
自動從無結構或半結構的文本中抽取出結構化信息的任務, 主要包含的任務包含了實體識別、關系抽取、事件抽取、情感分析、評論抽取等任務; 同時信息抽取涉及的領域非常廣泛,信息抽取的技術需求高,下面具體展現一些示例
- 需求跨領域跨任務:領域之間知識遷移難度高,如通用領域知識很難遷移到垂類領域,垂類領域之間的知識很難相互遷移;存在實體、關系、事件等不同的信息抽取任務需求。
- 定制化程度高:針對實體、關系、事件等不同的信息抽取任務,需要開發不同的模型,開發成本和機器資源消耗都很大。
- 訓練數據無或很少:部分領域數據稀缺,難以獲取,且領域專業性使得數據標注門檻高。
針對以上難題,中科院軟件所和百度共同提出了一個大一統諸多任務的通用信息抽取技術 UIE(Unified Structure Generation for Universal Information Extraction),發表在ACL‘22。UIE在實體、關系、事件和情感等4個信息抽取任務、13個數據集的全監督、低資源和少樣本設置下,UIE均取得了SOTA性能。
PaddleNLP結合文心大模型中的知識增強NLP大模型ERNIE 3.0,發揮了UIE在中文任務上的強大潛力,開源了首個面向通用信息抽取的產業級技術方案,不需要標注數據(或僅需少量標注數據),即可快速完成各類信息抽取任務。
**鏈接指路:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie )
1.使用PaddleNLP Taskflow工具解決信息抽取難點(中文版本)
1.1安裝PaddleNLP
! pip install --upgrade paddlenlp ! pip show paddlenlp1.2 使用Taskflow UIE任務看看效果
人力資源入職證明信息抽取
from paddlenlp import Taskflow schema = ['姓名', '畢業院校', '職位', '月收入', '身體狀況'] ie = Taskflow('information_extraction', schema=schema) schema = ['姓名', '畢業院校', '職位', '月收入', '身體狀況'] ie.set_schema(schema) ie('茲證明凌霄為本單位職工,已連續在我單位工作5 年。學歷為嘉利頓大學畢業,目前在我單位擔任總經理助理 職位。近一年內該員工在我單位平均月收入(稅后)為 12000 元。該職工身體狀況良好。本單位僅此承諾上述表述是正確的,真實的。') [{'姓名': [{'text': '凌霄','start': 3,'end': 5,'probability': 0.9042383385504706}],'畢業院校': [{'text': '嘉利頓大學','start': 28,'end': 33,'probability': 0.9927952662605009}],'職位': [{'text': '總經理助理','start': 44,'end': 49,'probability': 0.9922470268350594}],'月收入': [{'text': '12000 元','start': 77,'end': 84,'probability': 0.9788556518998917}],'身體狀況': [{'text': '良好','start': 92,'end': 94,'probability': 0.9939678710475306}]}] # Jupyter Notebook默認做了格式化輸出,如果使用其他代碼編輯器,可以使用Python原生包pprint進行格式化輸出from pprint import pprint pprint(ie('茲證明凌霄為本單位職工,已連續在我單位工作5 年。學歷為嘉利頓大學畢業,目前在我單位擔任總經理助理 職位。近一年內該員工在我單位平均月收入(稅后)為 12000 元。該職工身體狀況良好。本單位僅此承諾上述表述是正確的,真實的。'))醫療病理分析
schema = ['腫瘤部位', '腫瘤大小'] ie.set_schema(schema) ie('胃印戒細胞癌,腫瘤主要位于胃竇體部,大小6*2cm,癌組織侵及胃壁漿膜層,并侵犯血管和神經。') [{'腫瘤部位': [{'text': '胃竇體部','start': 13,'end': 17,'probability': 0.9601818899487213}],'腫瘤大小': [{'text': '6*2cm','start': 20,'end': 25,'probability': 0.9670914301489972}]}]1.3使用Taskflow UIE進行實體抽取、關系抽取、事件抽取、情感分類、觀點抽取
# 實體抽取 schema = ['時間', '賽手', '賽事名稱'] ie.set_schema(schema) ie('2月8日上午北京冬奧會自由式滑雪女子大跳臺決賽中中國選手谷愛凌以188.25分獲得金牌!') [{'時間': [{'text': '2月8日上午','start': 0,'end': 6,'probability': 0.9857379716035553}],'賽手': [{'text': '中國選手谷愛凌','start': 24,'end': 31,'probability': 0.7232891682586384}],'賽事名稱': [{'text': '北京冬奧會自由式滑雪女子大跳臺決賽','start': 6,'end': 23,'probability': 0.8503080086948529}]}] # 關系抽取 schema = {'歌曲名稱': ['歌手', '所屬專輯']} ie.set_schema(schema) ie('《告別了》是孫耀威在專輯愛的故事里面的歌曲') [{'歌曲名稱': [{'text': '告別了','start': 1,'end': 4,'probability': 0.629614912348881,'relations': {'歌手': [{'text': '孫耀威','start': 6,'end': 9,'probability': 0.9988381005599081}],'所屬專輯': [{'text': '愛的故事','start': 12,'end': 16,'probability': 0.9968462078543183}]}},{'text': '愛的故事','start': 12,'end': 16,'probability': 0.28168707817316374,'relations': {'歌手': [{'text': '孫耀威','start': 6,'end': 9,'probability': 0.9951415104192272}]}}]}] # 事件抽取 schema = {'地震觸發詞': ['地震強度', '時間', '震中位置', '震源深度']} # 事件需要通過xxx觸發詞來選擇觸發詞 ie.set_schema(schema) ie('中國地震臺網正式測定:5月16日06時08分在云南臨滄市鳳慶縣(北緯24.34度,東經99.98度)發生3.5級地震,震源深度10千米。') [{'地震觸發詞': [{'text': '地震','start': 56,'end': 58,'probability': 0.9977425555988333,'relations': {'地震強度': [{'text': '3.5級','start': 52,'end': 56,'probability': 0.998080217831891}],'時間': [{'text': '5月16日06時08分','start': 11,'end': 22,'probability': 0.9853299772936026}],'震中位置': [{'text': '云南臨滄市鳳慶縣(北緯24.34度,東經99.98度)','start': 23,'end': 50,'probability': 0.7874014521275967}],'震源深度': [{'text': '10千米','start': 63,'end': 67,'probability': 0.9937974422968665}]}}]}] # 情感傾向分類 schema = '情感傾向[正向,負向]' # 分類任務需要[]來設置分類的label ie.set_schema(schema) ie('這個產品用起來真的很流暢,我非常喜歡') [{'情感傾向[正向,負向]': [{'text': '正向', 'probability': 0.9990024058203417}]}] # 評價抽取 schema = {'評價維度': ['觀點詞', '情感傾向[正向,負向]']} # 評價抽取的schema是固定的,后續直接按照這個schema進行觀點抽取 ie.set_schema(schema) # Reset schema ie('地址不錯,服務一般,設施陳舊') [{'評價維度': [{'text': '地址','start': 0,'end': 2,'probability': 0.9888139270606509,'relations': {'觀點詞': [{'text': '不錯','start': 2,'end': 4,'probability': 0.9927845886615216}],'情感傾向[正向,負向]': [{'text': '正向', 'probability': 0.998228967796706}]}},{'text': '設施','start': 10,'end': 12,'probability': 0.9588298547520608,'relations': {'觀點詞': [{'text': '陳舊','start': 12,'end': 14,'probability': 0.928675281256794}],'情感傾向[正向,負向]': [{'text': '負向', 'probability': 0.9949388606013692}]}},{'text': '服務','start': 5,'end': 7,'probability': 0.9592857070501211,'relations': {'觀點詞': [{'text': '一般','start': 7,'end': 9,'probability': 0.9949359182521675}],'情感傾向[正向,負向]': [{'text': '負向', 'probability': 0.9952498258302498}]}}]}] # 跨任務跨領域抽取 schema = ['寺廟', {'丈夫': '妻子'}] # 抽取的任務中包含了實體抽取和關系抽取 ie.set_schema(schema) ie('李治即位后,讓身在感業寺的武則天續起頭發,重新納入后宮。') [{'寺廟': [{'text': '感業寺','start': 9,'end': 12,'probability': 0.9888581774497425}],'丈夫': [{'text': '李治','start': 0,'end': 2,'probability': 0.989690572797457,'relations': {'妻子': [{'text': '武則天','start': 13,'end': 16,'probability': 0.9987625986790256}]}}]}]1.4使用Taskflow UIE一些技巧
1.4.1. 調整batch_size提升預測效率
from paddlenlp import Taskflow schema = ['費用'] ie.set_schema(schema) ie = Taskflow('information_extraction', schema=schema, batch_size=2) #資源不充裕情況,batch_size設置小點,利用率增加。。 ie(['二十號21點49分打車回家46塊錢', '8月3號往返機場交通費110元', '2019年10月17日22點18分回家打車46元', '三月三0號23點10分加班打車21元']) [{'費用': [{'text': '46塊錢','start': 13,'end': 17,'probability': 0.9781786110574338}]},{'費用': [{'text': '110元','start': 11,'end': 15,'probability': 0.9504088995163151}]},{'費用': [{'text': '46元','start': 21,'end': 24,'probability': 0.9753814247531167}]},{'費用': [{'text': '21元','start': 15,'end': 18,'probability': 0.9761294626311425}]}]1.4.2. 使用UIE-Tiny模型來加快模型預測速度
from paddlenlp import Taskflow schema = ['費用'] ie.set_schema(schema) ie = Taskflow('information_extraction', schema=schema, batch_size=2, model='uie-tiny') # ie(['二十號21點49分打車回家46塊錢', '8月3號往返機場交通費110元', '2019年10月17日22點18分回家打車46元', '三月三0號23點10分加班打車21元']) [{'費用': [{'text': '46塊錢','start': 13,'end': 17,'probability': 0.8945340489542026}]},{'費用': [{'text': '110元','start': 11,'end': 15,'probability': 0.9757676375014448}]},{'費用': [{'text': '46元','start': 21,'end': 24,'probability': 0.860397941604333}]},{'費用': [{'text': '21元','start': 15,'end': 18,'probability': 0.8595131018474689}]}]2.小樣本提升UIE效果
Taskflow中的UIE基線版本我們是通過大量的有標簽樣本進行訓練,但是UIE抽取的效果面對部分子領域的效果也不是令人滿意,UIE可以通過小樣本就可以快速提升效果。
為什么UIE可以通過小樣本來提升效果呢?UIE的建模方式主要是通過 Prompt 方式來建模, Prompt 在小樣本上進行微調效果非常有效,下面我們通過一個具體的case
來展示UIE微調的效果。
2.1語音報銷工單信息抽取
1. 背景
在某公司內部可以通過語音輸入來報銷打車費用,通過語音ASR模型可以將語音識別為文字,同時對文字信息進行信息抽取,抽取的信息主要是包括了4個方面,時間、出發地、目的地、費用,通過對文字4個方面的信息進行抽取就可以完成一個報銷工單的填寫。
2. 挑戰
目前Taskflow UIE任務對于這種非常垂類的任務效果沒有完全達到工業使用水平,因此需要一定的微調手段來完成UIE模型的微調來提升模型的效果,下面是一些case的展現
ie.set_schema(['時間', '出發地', '目的地', '費用']) ie('10月16日高鐵從杭州到上海南站車次d5414共48元') # 無法準確抽取出發地、目的地 [{'時間': [{'text': '10月16日','start': 0,'end': 6,'probability': 0.9552445817793149}],'出發地': [{'text': '杭州','start': 9,'end': 11,'probability': 0.5713024802221334}],'費用': [{'text': '48元','start': 24,'end': 27,'probability': 0.8932524634666485}]}]2.2 標注數據
參考鏈接詳細版本—doccano標注過程
我們推薦使用數據標注平臺doccano 進行數據標注,本案例也打通了從標注到訓練的通道,即doccano導出數據后可通過doccano.py腳本輕松將數據轉換為輸入模型時需要的形式,實現無縫銜接。為達到這個目的,您需要按以下標注規則在doccano平臺上標注數據:
Step 1. 本地安裝doccano(請勿在AI Studio內部運行,本地測試環境python=3.8)
$ pip install doccano
Step 2. 初始化數據庫和賬戶(用戶名和密碼可替換為自定義值)
$ doccano init
$ doccano createuser --username my_admin_name --password my_password
Step 3. 啟動doccano
- 在一個窗口啟動doccano的WebServer,保持窗口
$ doccano webserver --port 8000
- 在另一個窗口啟動doccano的任務隊列
$ doccano task
Step 4. 運行doccano來標注實體和關系
- 打開瀏覽器(推薦Chrome),在地址欄中輸入http://127.0.0.1:8000/后回車即得以下界面。
-
登陸賬戶。點擊右上角的LOGIN,輸入Step 2中設置的用戶名和密碼登陸。
-
創建項目。點擊左上角的CREATE,跳轉至以下界面。
- 勾選序列標注(Sequence Labeling)
- 填寫項目名稱(Project name)等必要信息
- 勾選允許實體重疊(Allow overlapping entity)、使用關系標注(Use relation labeling)
- 創建完成后,項目首頁視頻提供了從數據導入到導出的七個步驟的詳細說明。
-
設置標簽。在Labels一欄點擊Actions,Create Label手動設置或者Import Labels從文件導入。
- 最上邊Span表示實體標簽,Relation表示關系標簽,需要分別設置。
- 最上邊Span表示實體標簽,Relation表示關系標簽,需要分別設置。
-
導入數據。在Datasets一欄點擊Actions、Import Dataset從文件導入文本數據。
- 根據文件格式(File format)給出的示例,選擇適合的格式導入自定義數據文件。
- 導入成功后即跳轉至數據列表。
-
標注數據。點擊每條數據最右邊的Annotate按鈕開始標記。標記頁面右側的標簽類型(Label Types)開關可在實體標簽和關系標簽之間切換。
- 實體標注:直接用鼠標選取文本即可標注實體。
- 關系標注:首先點擊待標注的關系標簽,接著依次點擊相應的頭尾實體可完成關系標注。
-
導出數據。在Datasets一欄點擊Actions、Export Dataset導出已標注的數據。
將標注數據轉化成UIE訓練所需數據
- 將doccano平臺的標注數據保存在./data/目錄。對于語音報銷工單信息抽取的場景,可以直接下載標注好的數據。
各個任務標注文檔
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/model_zoo/uie/doccano.md
! wget https://paddlenlp.bj.bcebos.com/datasets/erniekit/speech-cmd-analysis/audio-expense-account.jsonl ! mv audio-expense-account.jsonl ./data/運行以下代碼將標注數據轉換為UIE訓練所需要的數據
splits 0.2 0.8 0.0 訓練集 測試集 驗證集
可配置參數說明
- doccano_file: 從doccano導出的數據標注文件。
- save_dir: 訓練數據的保存目錄,默認存儲在data目錄下。
- negative_ratio: 最大負例比例,該參數只對抽取類型任務有效,適當構造負例可提升模型效果。負例數量和實際的標簽數量有關,最大負例數量 = negative_ratio * 正例數量。該參數只對訓練集有效,默認為5。為了保證評估指標的準確性,驗證集和測試集默認構造全負例。
- splits: 劃分數據集時訓練集、驗證集所占的比例。默認為[0.8, 0.1, 0.1]表示按照8:1:1的比例將數據劃分為訓練集、驗證集和測試集。
- task_type: 選擇任務類型,可選有抽取和分類兩種類型的任務。
- options: 指定分類任務的類別標簽,該參數只對分類類型任務有效。
- prompt_prefix: 聲明分類任務的prompt前綴信息,該參數只對分類類型任務有效。
- is_shuffle: 是否對數據集進行隨機打散,默認為True。
- seed: 隨機種子,默認為1000.
2.3 訓練UIE模型
- 使用標注數據進行小樣本訓練,模型參數保存在./checkpoint/目錄。
tips: 推薦使用GPU環境,否則可能會內存溢出。CPU環境下,可以修改model為uie-tiny,適當調下batch_size。
增加準確率的話:–num_epochs 設置大點多訓練訓練
可配置參數說明:
- train_path: 訓練集文件路徑。
- dev_path: 驗證集文件路徑。
- save_dir: 模型存儲路徑,默認為./checkpoint。
- learning_rate: 學習率,默認為1e-5。
- batch_size: 批處理大小,請結合顯存情況進行調整,若出現顯存不足,請適當調低這一參數,默認為16。
- max_seq_len: 文本最大切分長度,輸入超過最大長度時會對輸入文本進行自動切分,默認為512。
- num_epochs: 訓練輪數,默認為100。
- model: 選擇模型,程序會基于選擇的模型進行模型微調,可選有uie-base和uie-tiny,默認為uie-base。
- seed: 隨機種子,默認為1000.
- logging_steps: 日志打印的間隔steps數,默認10。
- valid_steps: evaluate的間隔steps數,默認100。
- device: 選用什么設備進行訓練,可選cpu或gpu。
- 使用小樣本訓練后的模型參數再次測試無法正確抽取的case。
總結
以上是生活随笔為你收集整理的PaddleNLP--UIE(二)--小样本快速提升性能(含doccona标注)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Makefile 的 遗漏分隔符错误信息
- 下一篇: Wireshark抓包介绍和TCP三次握