文本復述,中文文本數(shù)據(jù)增強

向AI轉型的程序員都關注了這個號??????
人工智能大數(shù)據(jù)與深度學習 公眾號:datayx
一.概述
文本復述任務是指把一句/段文本A改寫成文本B,要求文本B采用與文本A略有差異的表述方式來表達與之意思相近的文本。
改進谷歌的LaserTagger模型,使用LCQMC等中文語料訓練文本復述模型,即修改一段文本并保持原有語義。
復述的結果可用于數(shù)據(jù)增強,文本泛化,從而增加特定場景的語料規(guī)模,提高模型泛化能力。
二.模型介紹
谷歌在文獻《Encode, Tag, Realize: High-Precision Text Editing》中采用序列標注的框架進行文本編輯,在文本拆分和自動摘要任務上取得了最佳效果。
在同樣采用BERT作為編碼器的條件下,本方法相比于Seq2Seq的方法具有更高的可靠度,更快的訓練和推理效率,且在語料規(guī)模較小的情況下優(yōu)勢更明顯。

谷歌公開了本文獻對應的代碼,但是原有任務與當前任務有一定的差異性,需要修改部分代碼,主要修改如下:
A.分詞方式:原代碼針對英文,以空格為間隔分成若干詞。現(xiàn)在針對中文,分成若干字。
B.推理效率:原代碼每次只對一個文本進行復述,改成每次對batch_size個文本進行復述,推理效率提高6倍。
三.文件說明和實驗步驟
1.安裝python模塊 參見"requirements.txt", "rephrase.sh" 2.訓練和評測模型
文件需求 bert預訓練的tensorflow 模型
采用RoBERTa-tiny-clue(中文版)預訓練模型。 網(wǎng)址
https://storage.googleapis.com/cluebenchmark/pretrained_models/RoBERTa-tiny-clue.zip
如果想采用其他預訓練模型,請修改“configs/lasertagger_config.json".
代碼跑通順序:第一種方法:修改運行rephrase.sh 第二種方法詳解:
第一步:制作訓練測試驗證集 python get_pairs_chinese/get_text_pair_lcqmc.py 獲得lcqmc中的文本復述語料(語義一致的文本對,且字面表述差異不能過大,第三列為最長公共子串長度與總長度的比值)
只需要修改lcqmc的目錄位置即可
python get_pairs_chinese/get_text_pair.py 可根據(jù)自己的預料獲得文本復述語料(第三列為最長公共子串長度與總長度的比值)
再運行merge_split_corpus.py 將 結果數(shù)據(jù) 按比例劃分 訓練、測試、驗證集
第二步:短語_詞匯表_優(yōu)化 python phrase_vocabulary_optimization.py
--input_file=./data/train.txt
--input_format=wikisplit
--vocabulary_size=500
--max_input_examples=1000000
--enable_swap_tag=false
--output_file=./output/label_map.txt
第三步:
1、制作后續(xù)訓練模型的驗證集
python preprocess_main.py
--input_file=./data/tune.txt
--input_format=wikisplit
--output_tfrecord=./output/tune.tf_record
--label_map_file=./output/label_map.txt
--vocab_file=./data/RoBERTa-tiny-clue/vocab.txt
--max_seq_length=40
--output_arbitrary_targets_for_infeasible_examples=false 2、制作后續(xù)訓練模型的訓練集
python preprocess_main.py
--input_file=./data/train.txt
--input_format=wikisplit
--output_tfrecord=./output/train.tf_record
--label_map_file=./output/label_map.txt
--vocab_file=./data/RoBERTa-tiny-clue/vocab.txt
--max_seq_length=40
--output_arbitrary_targets_for_infeasible_examples=false
第四步:
1、訓練模型
python run_lasertagger.py
--training_file=./output/train.tf_record
--eval_file=./output/tune.tf_record
--label_map_file=./output/label_map.txt
--model_config_file=./configs/lasertagger_config.json
--output_dir=./output/models/wikisplit_experiment_name
--init_checkpoint=./data/RoBERTa-tiny-clue/bert_model.ckpt
--do_train=true
--do_eval=true
--train_batch_size=256
--save_checkpoints_steps=200
--max_seq_length=40
--num_train_examples=319200
--num_eval_examples=5000
2、 模型整理
python run_lasertagger.py
--label_map_file=./output/label_map.txt
--model_config_file=./configs/lasertagger_config.json
--output_dir=./output/models/wikisplit_experiment_name
--do_export=true
--export_path=./output/models/wikisplit_experiment_name
第五步 根據(jù)test文件進行預測
python predict_main.py
--input_file=./data/test.txt
--input_format=wikisplit
--output_file=./output/models/wikisplit_experiment_name/pred.tsv
--label_map_file=./output/label_map.txt
--vocab_file=./data/RoBERTa-tiny-clue/vocab.txt
--max_seq_length=40
--saved_model=./output/models/wikisplit_experiment_name/1587693553
# 解析,這應該是最后保存的模型文件名稱 可以考如下語句獲得
# (ls "./output/models/wikisplit_experiment_name/" | grep -v "temp-" | sort -r | head -1) 第六步 對第五步預測的文件進行打分。
python score_main.py --prediction_file=./output/models/wikisplit_experiment_name/pred.tsv
#根據(jù)自己情況修改腳本"rephrase.sh"中2個文件夾的路徑,然后運行 sh rephrase.sh
#腳本中的變量HOST_NAME是作者為了方便設定路徑使用的,請根據(jù)自己情況修改;
#如果只是離線的對文本進行批量的泛化,可以注釋腳本中其他部分,只用predict_main.py就可以滿足需求。
3.啟動文本復述服務 根據(jù)自己需要,可選
根據(jù)自己情況修改"rephrase_server.sh"文件中幾個文件夾的路徑,使用命令"sh rephrase_server.sh"可以啟動一個文本復述的API服務
本API服務可以接收一個http的POST請求,解析并對其中的文本進行泛化,具體接口請看“rephrase_server/rephrase_server_flask.py"
有幾個腳本文件如rephrase_for_qa.sh,rephrase_for_chat.sh,rephrase_for_skill.sh是作者自己辦公需要的,可以忽略
四.實驗效果
在公開數(shù)據(jù)集Wiki Split上復現(xiàn)模型:
Wiki Split數(shù)據(jù)集是英文語料,訓練模型將一句話拆分成兩句話,并保持語義一致,語法合理,語義連貫通順。
Exact score=15,SARI score=61.5,KEEP score=93,ADDITION score=32,DELETION score=59,
基本與論文中的Exact score=15.2;SARI score=61.7一致(這些分數(shù)均為越高越好)。在自己構造的中文數(shù)據(jù)集訓練文本復述模型:
(1)語料來源
(A)一部分語料來自于LCQMC語料中的正例,即語義接近的一對文本;
(B)另一部分語料來自于寶安機場用戶QA下面同一答案的問題。; 因為模型的原理,要求文本A和B在具有一定的重合字數(shù),故過濾掉上述兩個來源中字面表述差異大的文本,如“我要去廁所”與“衛(wèi)生間在哪里”。對語料篩選后對模型進行訓練和測試。
(2)測試結果:
對25918對文本進行復述和自動化評估,評測分數(shù)如下(越高越好):
Exact score=29,SARI score=64,KEEP score=84,ADDITION score=39,DELETION score=66.
CPU上耗時0.5小時,平均復述一句話需要0.72秒。
可能是語言和任務不同,在中文文本復述上的評測分數(shù)比公開數(shù)據(jù)集高一些。
五.一些trick
1.可以設定對于某些字或詞不做修改 如對實體識別NER的語料泛化,需要保證模型不能修改其中的實體;
對業(yè)務語料泛化,也可以根據(jù)情況保證模型不能修改其中的關鍵字 如日期,航班號等;
目前,是通過正則的方式定位這些不能被模型修改的位置,然后將這些位置的location設置為1,具體實現(xiàn)參見tagging.py.
2.增加復述文本與原文本的差異度
可以對訓練語料中的text_a先進行隨機的swag操作,相應地腳本中enable_swap_tag改為true,再訓練模型將其改寫為text_b;
實際應用或測試時同樣將原始文本text_a先進行隨機的swag操作,然后利用模型改寫為text_b;
因為訓練語料中text_a是不通順,但text_b是通順的,所以實際應用或測試時仍然會得到通順的復述結果。
六.數(shù)據(jù)集
1.由于不少人咨詢我數(shù)據(jù)集的問題,現(xiàn)將數(shù)據(jù)集地址貼在下面
You can download LCQMC data set from https://download.csdn.net/download/tcd1112/12357994,But other data is the company data can't give you. You can also leave your E-mail, I will send you LCQMC data
閱讀過本文的人還看了以下文章:
基于40萬表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測
《深度學習入門:基于Python的理論與實現(xiàn)》高清中文PDF+源碼
python就業(yè)班學習視頻,從入門到實戰(zhàn)項目
2019最新《PyTorch自然語言處理》英、中文版PDF+源碼
《21個項目玩轉深度學習:基于TensorFlow的實踐詳解》完整版PDF+附書代碼
PyTorch深度學習快速實戰(zhàn)入門《pytorch-handbook》
【下載】豆瓣評分8.1,《機器學習實戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘實戰(zhàn)》PDF+完整源碼
汽車行業(yè)完整知識圖譜項目實戰(zhàn)視頻(全23課)
李沐大神開源《動手學深度學習》,加州伯克利深度學習(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計學習方法》最新資源全套!
《神經(jīng)網(wǎng)絡與深度學習》最新2018版中英PDF+源碼
重要開源!CNN-RNN-CTC 實現(xiàn)手寫漢字識別
【Keras】完整實現(xiàn)‘交通標志’分類、‘票據(jù)’分類兩個項目,讓你掌握深度學習圖像分類
VGG16遷移學習,實現(xiàn)醫(yī)學圖像識別分類工程項目
特征工程(二) :文本數(shù)據(jù)的展開、過濾和分塊
如何利用全新的決策樹集成級聯(lián)結構gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在線識別手寫中文網(wǎng)站
中科院Kaggle全球文本匹配競賽華人第1名團隊-深度學習與特征工程
不斷更新資源
深度學習、機器學習、數(shù)據(jù)分析、python
搜索公眾號添加: datayx
機大數(shù)據(jù)技術與機器學習工程
搜索公眾號添加: datanlp
長按圖片,識別二維碼


