文本復(fù)述,中文文本數(shù)據(jù)增強(qiáng)

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

谷歌公開(kāi)了本文獻(xiàn)對(duì)應(yīng)的代碼,但是原有任務(wù)與當(dāng)前任務(wù)有一定的差異性,需要修改部分代碼,主要修改如下:
A.分詞方式:原代碼針對(duì)英文,以空格為間隔分成若干詞?,F(xiàn)在針對(duì)中文,分成若干字。
B.推理效率:原代碼每次只對(duì)一個(gè)文本進(jìn)行復(fù)述,改成每次對(duì)batch_size個(gè)文本進(jìn)行復(fù)述,推理效率提高6倍。
三.文件說(shuō)明和實(shí)驗(yàn)步驟
1.安裝python模塊 參見(jiàn)"requirements.txt", "rephrase.sh" 2.訓(xùn)練和評(píng)測(cè)模型
文件需求 bert預(yù)訓(xùn)練的tensorflow 模型
采用RoBERTa-tiny-clue(中文版)預(yù)訓(xùn)練模型。 網(wǎng)址
https://storage.googleapis.com/cluebenchmark/pretrained_models/RoBERTa-tiny-clue.zip
如果想采用其他預(yù)訓(xùn)練模型,請(qǐng)修改“configs/lasertagger_config.json".
代碼跑通順序:第一種方法:修改運(yùn)行rephrase.sh 第二種方法詳解:
第一步:制作訓(xùn)練測(cè)試驗(yàn)證集 python get_pairs_chinese/get_text_pair_lcqmc.py 獲得lcqmc中的文本復(fù)述語(yǔ)料(語(yǔ)義一致的文本對(duì),且字面表述差異不能過(guò)大,第三列為最長(zhǎng)公共子串長(zhǎng)度與總長(zhǎng)度的比值)
只需要修改lcqmc的目錄位置即可
python get_pairs_chinese/get_text_pair.py 可根據(jù)自己的預(yù)料獲得文本復(fù)述語(yǔ)料(第三列為最長(zhǎng)公共子串長(zhǎng)度與總長(zhǎng)度的比值)
再運(yùn)行merge_split_corpus.py 將 結(jié)果數(shù)據(jù) 按比例劃分 訓(xùn)練、測(cè)試、驗(yàn)證集
第二步:短語(yǔ)_詞匯表_優(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ù)訓(xùn)練模型的驗(yàn)證集
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ù)訓(xùn)練模型的訓(xùn)練集
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、訓(xùn)練模型
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文件進(jìn)行預(yù)測(cè)
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
# 解析,這應(yīng)該是最后保存的模型文件名稱 可以考如下語(yǔ)句獲得
# (ls "./output/models/wikisplit_experiment_name/" | grep -v "temp-" | sort -r | head -1) 第六步 對(duì)第五步預(yù)測(cè)的文件進(jìn)行打分。
python score_main.py --prediction_file=./output/models/wikisplit_experiment_name/pred.tsv
#根據(jù)自己情況修改腳本"rephrase.sh"中2個(gè)文件夾的路徑,然后運(yùn)行 sh rephrase.sh
#腳本中的變量HOST_NAME是作者為了方便設(shè)定路徑使用的,請(qǐng)根據(jù)自己情況修改;
#如果只是離線的對(duì)文本進(jìn)行批量的泛化,可以注釋腳本中其他部分,只用predict_main.py就可以滿足需求。
3.啟動(dòng)文本復(fù)述服務(wù) 根據(jù)自己需要,可選
根據(jù)自己情況修改"rephrase_server.sh"文件中幾個(gè)文件夾的路徑,使用命令"sh rephrase_server.sh"可以啟動(dòng)一個(gè)文本復(fù)述的API服務(wù)
本API服務(wù)可以接收一個(gè)http的POST請(qǐng)求,解析并對(duì)其中的文本進(jìn)行泛化,具體接口請(qǐng)看“rephrase_server/rephrase_server_flask.py"
有幾個(gè)腳本文件如rephrase_for_qa.sh,rephrase_for_chat.sh,rephrase_for_skill.sh是作者自己辦公需要的,可以忽略
四.實(shí)驗(yàn)效果
在公開(kāi)數(shù)據(jù)集Wiki Split上復(fù)現(xiàn)模型:
Wiki Split數(shù)據(jù)集是英文語(yǔ)料,訓(xùn)練模型將一句話拆分成兩句話,并保持語(yǔ)義一致,語(yǔ)法合理,語(yǔ)義連貫通順。
Exact score=15,SARI score=61.5,KEEP score=93,ADDITION score=32,DELETION score=59,
基本與論文中的Exact score=15.2;SARI score=61.7一致(這些分?jǐn)?shù)均為越高越好)。在自己構(gòu)造的中文數(shù)據(jù)集訓(xùn)練文本復(fù)述模型:
(1)語(yǔ)料來(lái)源
(A)一部分語(yǔ)料來(lái)自于LCQMC語(yǔ)料中的正例,即語(yǔ)義接近的一對(duì)文本;
(B)另一部分語(yǔ)料來(lái)自于寶安機(jī)場(chǎng)用戶QA下面同一答案的問(wèn)題。; 因?yàn)槟P偷脑?,要求文本A和B在具有一定的重合字?jǐn)?shù),故過(guò)濾掉上述兩個(gè)來(lái)源中字面表述差異大的文本,如“我要去廁所”與“衛(wèi)生間在哪里”。對(duì)語(yǔ)料篩選后對(duì)模型進(jìn)行訓(xùn)練和測(cè)試。
(2)測(cè)試結(jié)果:
對(duì)25918對(duì)文本進(jìn)行復(fù)述和自動(dòng)化評(píng)估,評(píng)測(cè)分?jǐn)?shù)如下(越高越好):
Exact score=29,SARI score=64,KEEP score=84,ADDITION score=39,DELETION score=66.
CPU上耗時(shí)0.5小時(shí),平均復(fù)述一句話需要0.72秒。
可能是語(yǔ)言和任務(wù)不同,在中文文本復(fù)述上的評(píng)測(cè)分?jǐn)?shù)比公開(kāi)數(shù)據(jù)集高一些。
五.一些trick
1.可以設(shè)定對(duì)于某些字或詞不做修改 如對(duì)實(shí)體識(shí)別NER的語(yǔ)料泛化,需要保證模型不能修改其中的實(shí)體;
對(duì)業(yè)務(wù)語(yǔ)料泛化,也可以根據(jù)情況保證模型不能修改其中的關(guān)鍵字 如日期,航班號(hào)等;
目前,是通過(guò)正則的方式定位這些不能被模型修改的位置,然后將這些位置的location設(shè)置為1,具體實(shí)現(xiàn)參見(jiàn)tagging.py.
2.增加復(fù)述文本與原文本的差異度
可以對(duì)訓(xùn)練語(yǔ)料中的text_a先進(jìn)行隨機(jī)的swag操作,相應(yīng)地腳本中enable_swap_tag改為true,再訓(xùn)練模型將其改寫(xiě)為text_b;
實(shí)際應(yīng)用或測(cè)試時(shí)同樣將原始文本text_a先進(jìn)行隨機(jī)的swag操作,然后利用模型改寫(xiě)為text_b;
因?yàn)橛?xùn)練語(yǔ)料中text_a是不通順,但text_b是通順的,所以實(shí)際應(yīng)用或測(cè)試時(shí)仍然會(huì)得到通順的復(fù)述結(jié)果。
六.數(shù)據(jù)集
1.由于不少人咨詢我數(shù)據(jù)集的問(wèn)題,現(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
閱讀過(guò)本文的人還看了以下文章:
TensorFlow 2.0深度學(xué)習(xí)案例實(shí)戰(zhàn)
基于40萬(wàn)表格數(shù)據(jù)集TableBank,用MaskRCNN做表格檢測(cè)
《基于深度學(xué)習(xí)的自然語(yǔ)言處理》中/英PDF
Deep Learning 中文版初版-周志華團(tuán)隊(duì)
【全套視頻課】最全的目標(biāo)檢測(cè)算法系列講解,通俗易懂!
《美團(tuán)機(jī)器學(xué)習(xí)實(shí)踐》_美團(tuán)算法團(tuán)隊(duì).pdf
《深度學(xué)習(xí)入門(mén):基于Python的理論與實(shí)現(xiàn)》高清中文PDF+源碼
python就業(yè)班學(xué)習(xí)視頻,從入門(mén)到實(shí)戰(zhàn)項(xiàng)目
2019最新《PyTorch自然語(yǔ)言處理》英、中文版PDF+源碼
《21個(gè)項(xiàng)目玩轉(zhuǎn)深度學(xué)習(xí):基于TensorFlow的實(shí)踐詳解》完整版PDF+附書(shū)代碼
《深度學(xué)習(xí)之pytorch》pdf+附書(shū)源碼
PyTorch深度學(xué)習(xí)快速實(shí)戰(zhàn)入門(mén)《pytorch-handbook》
【下載】豆瓣評(píng)分8.1,《機(jī)器學(xué)習(xí)實(shí)戰(zhàn):基于Scikit-Learn和TensorFlow》
《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》PDF+完整源碼
汽車(chē)行業(yè)完整知識(shí)圖譜項(xiàng)目實(shí)戰(zhàn)視頻(全23課)
李沐大神開(kāi)源《動(dòng)手學(xué)深度學(xué)習(xí)》,加州伯克利深度學(xué)習(xí)(2019春)教材
筆記、代碼清晰易懂!李航《統(tǒng)計(jì)學(xué)習(xí)方法》最新資源全套!
《神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)》最新2018版中英PDF+源碼
將機(jī)器學(xué)習(xí)模型部署為REST API
FashionAI服裝屬性標(biāo)簽圖像識(shí)別Top1-5方案分享
重要開(kāi)源!CNN-RNN-CTC 實(shí)現(xiàn)手寫(xiě)漢字識(shí)別
同樣是機(jī)器學(xué)習(xí)算法工程師,你的面試為什么過(guò)不了?
前海征信大數(shù)據(jù)算法:風(fēng)險(xiǎn)概率預(yù)測(cè)
【Keras】完整實(shí)現(xiàn)‘交通標(biāo)志’分類、‘票據(jù)’分類兩個(gè)項(xiàng)目,讓你掌握深度學(xué)習(xí)圖像分類
VGG16遷移學(xué)習(xí),實(shí)現(xiàn)醫(yī)學(xué)圖像識(shí)別分類工程項(xiàng)目
特征工程(二) :文本數(shù)據(jù)的展開(kāi)、過(guò)濾和分塊
如何利用全新的決策樹(shù)集成級(jí)聯(lián)結(jié)構(gòu)gcForest做特征工程并打分?
Machine Learning Yearning 中文翻譯稿
全球AI挑戰(zhàn)-場(chǎng)景分類的比賽源碼(多模型融合)
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
python+flask搭建CNN在線識(shí)別手寫(xiě)中文網(wǎng)站
中科院Kaggle全球文本匹配競(jìng)賽華人第1名團(tuán)隊(duì)-深度學(xué)習(xí)與特征工程
不斷更新資源
深度學(xué)習(xí)、機(jī)器學(xué)習(xí)、數(shù)據(jù)分析、python
搜索公眾號(hào)添加: datayx
機(jī)大數(shù)據(jù)技術(shù)與機(jī)器學(xué)習(xí)工程
搜索公眾號(hào)添加: datanlp
長(zhǎng)按圖片,識(shí)別二維碼


