所謂摘要,就是對給定的單個或者多個文檔進(jìn)行梗概,即在保證能夠反映原文檔的重要內(nèi)容的情況下,盡可能地保持簡明扼要。質(zhì)量良好的文摘能夠在信息檢索過程中發(fā)揮重要的作用,比如利用文摘代替原文檔參與索引,可以有效縮短檢索的時間,同時也能減少檢索結(jié)果中的冗余信息,提高用戶體驗(yàn)。隨著信息爆炸時代的到來,自動文摘逐漸成為自然語言處理領(lǐng)域的一項(xiàng)重要的研究課題
一. 技術(shù)路線
1.1 TF-IDF
《Term Weighting Approaches in Automatic Text Retrieval》
導(dǎo)言:一種統(tǒng)計方法,用以評估一個詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。其是由兩個算法相乘而來,即詞頻(TF)乘以 逆文檔頻率指數(shù)(IDF)。其中詞頻表示一個詞的常見程度,逆文檔頻率表示一個詞的稀有程度。其基本原理是,字詞的重要性隨著其在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著其在語料庫中出現(xiàn)的頻率成反比下降
1.1.1 原理
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的頻率高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。其計算公式如下:
其中,TF表示詞頻(Term Frequency),IDF表示逆向文件頻率(Inverse Document Frequency)。TF表示詞在文檔d中出現(xiàn)的頻率,而IDF的主要思想是:如果包含詞t的文檔越少,IDF越大,則說明詞條t具有很好的類別區(qū)分能力。
詞頻(TF)指的是某一個給定的詞語在該文件中出現(xiàn)的頻率。這個數(shù)字是對詞數(shù)(term count)的歸一化,以防止它偏向長的文件。對于在某一特定文件里的詞語來說,它的重要性可表示為:
其中分子是該詞在文件中的出現(xiàn)次數(shù),而分母則是在文件中所有字詞的出現(xiàn)次數(shù)之和
逆向文件頻率(IDF)指的是一個詞語普遍重要性的度量。某一特定詞語的IDF,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目,再將得到的商取以10為底的對數(shù)得到:
某一特定文件內(nèi)的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產(chǎn)生出高權(quán)重的TF-IDF。因此,TF-IDF傾向于過濾掉常見的詞語,保留重要的詞語。其計算公式如下:
1.1.2 理論依據(jù)及不足
TF-IDF算法基于假設(shè):對區(qū)別文檔最有意義的詞語應(yīng)該是那些在文檔中出現(xiàn)頻率高,而在整個文檔集合的其他文檔中出現(xiàn)頻率少的詞語,因此引入TF詞頻作為測度,就可以體現(xiàn)同類文本的特點(diǎn);另外考慮到單詞區(qū)別不同類別的能力,TF-IDF法認(rèn)為一個單詞出現(xiàn)的文本頻數(shù)越小,它區(qū)別不同類別文本的能力就越大,因此引入了逆文本頻度IDF的概念,以TF和IDF的乘積作為特征空間坐標(biāo)系的取值測度,完成對TF權(quán)重的調(diào)整,其目的在于突出重要單詞,抑制次要單詞。本質(zhì)上IDF是一種試圖抑制噪音的加權(quán),且單純認(rèn)為文本頻數(shù)小的單詞就越重要,文本頻數(shù)大的單詞就越無用,顯然并不完全正確。IDF的簡單結(jié)構(gòu)并不能有效地反映單詞的重要程度和特征詞的分布情況,使其無法很好地完成對權(quán)值調(diào)整的功能,所以TF-IDF法的精度并不是很高。此外,在TF-IDF算法中并沒有體現(xiàn)出單詞的位置信息,特征詞在不同的位置對文章內(nèi)容的反映程度不同,其權(quán)重的計算方法也應(yīng)不同。
1.1.3 代碼實(shí)現(xiàn)
使用TF_IDF模型實(shí)現(xiàn)文本摘要任務(wù),具體思想如下:
輸入原文(長文本),可支持任意長度的文本。
輸入文本經(jīng)過文本清洗(
刪除html標(biāo)簽、冗余字符、url、異常字符等),再進(jìn)行分句,得到一系列句子的集合;然后對原文中的每個句子進(jìn)行權(quán)重的計算。
最后將句子按照重要程度進(jìn)行排序,篩選出超過閾值的重要句子,然后按照原文的序號進(jìn)行排序。最后組合成完整的摘要文本并輸出;
# sklearn的TF-IDF實(shí)現(xiàn)
from sklearn.feature_extraction.text import TfidfTransformer, CountVectorizer
corpus=["I come to China to travel",
"This is a car polupar in China",
"I love tea and Apple ",
"The work is to write some papers in science"]
vectorizer=CountVectorizer()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
print tfidf
1.2 TextRank
《TextRank: Bringing Order into Texts》
導(dǎo)言:最經(jīng)典的基于圖的無監(jiān)督關(guān)鍵詞/句提取算法,是文本任務(wù)版本的PageRank。TextRank算法仿照PageRank,將句子作為節(jié)點(diǎn),使用句子間相似度,構(gòu)造無向有權(quán)邊。使用邊上的權(quán)值迭代更新節(jié)點(diǎn)值,最后選取N個得分最高的節(jié)點(diǎn),作為摘要。
1.1.1 原理
最經(jīng)典的TextRank通過將文本建模成無向全連接圖結(jié)構(gòu),在圖上利用PageRank迭代計算每個節(jié)點(diǎn)的重要性分?jǐn)?shù),從而能夠提取關(guān)鍵節(jié)點(diǎn)。對于關(guān)鍵詞提取而言,圖上的每個節(jié)點(diǎn)即為文檔的詞,邊則代表詞和詞之間的共現(xiàn)關(guān)系,即在長度為N的滑動窗口內(nèi)部的所有詞認(rèn)為是存在共現(xiàn)關(guān)系的,這些詞也就相互之間有邊連接。這里構(gòu)造的圖是無邊權(quán)的,計算節(jié)點(diǎn)V_i的PageRank分?jǐn)?shù)的方法如下式,d的存在目的是為了使模型有一定的概率跳到圖上其它隨機(jī)點(diǎn)上,避免孤立點(diǎn)計算出現(xiàn)死循環(huán),一般取d=0.85,初始節(jié)點(diǎn)分?jǐn)?shù)均為1。注意下式是迭代計算的,一般設(shè)為20次:
對于關(guān)鍵句提取而言,圖上的節(jié)點(diǎn)代表文檔中的句子,邊權(quán)則用下式計算,其中S_i,S_j為兩個句子,w_k代表句子中的詞,也即節(jié)點(diǎn)邊權(quán)定義為和兩個句子詞重疊率成正比,之所以還要除以句子長度的對數(shù)之和,是考慮到越長的句子越可能出現(xiàn)重疊的詞:
關(guān)鍵句提取中TextRank方法建立的圖為帶邊權(quán)的圖,因而以下式計算PageRank分?jǐn)?shù),這里w_{ij}即為節(jié)點(diǎn)V_i,V_j之間的邊權(quán)大小,d的規(guī)定同上:
故,基于上述方法可知,TextRank方法是無監(jiān)督的不需要訓(xùn)練
1.1.2 代碼實(shí)現(xiàn)
這里使用sklearn實(shí)現(xiàn),使用TextRank抽取文檔中的關(guān)鍵句,實(shí)現(xiàn)無監(jiān)督提取文本摘要
from sklearn.feature_extraction.text import TfidfVectorizer, TfidfTransformer
def get_abstract(content, size=3):
"""
利用textrank提取摘要
:param content:
:param size:
:return:
"""
docs = list(cut_sentence(content))
tfidf_model = TfidfVectorizer(tokenizer=jieba.cut, stop_words=load_stopwords())
tfidf_matrix = tfidf_model.fit_transform(docs)
normalized_matrix = TfidfTransformer().fit_transform(tfidf_matrix)
similarity = nx.from_scipy_sparse_matrix(normalized_matrix * normalized_matrix.T)
scores = nx.pagerank(similarity)
tops = sorted(scores.items(), key=lambda x: x[1], reverse=True)
size = min(size, len(docs))
indices = list(map(lambda x: x[0], tops))[:size]
return list(map(lambda idx: docs[idx], indices))
1.3 Roberta
A Robustly Optimized BERT Pretraining Approach
導(dǎo)言:基于全詞掩碼策略的中文預(yù)訓(xùn)練BERT模型,在多項(xiàng)中文NLP任務(wù)中均取得優(yōu)異性能
Roberta本質(zhì)上是一個調(diào)到最優(yōu)的bert模型。chinese-roberta-wwm-ext針對中文任務(wù)的特點(diǎn),對roberta的訓(xùn)練策略進(jìn)行了進(jìn)一步的優(yōu)化

1.3.1 原理
整體改進(jìn):
-
Roberta全稱為Robusty Optimized BERT Approach,其基礎(chǔ)模型結(jié)構(gòu)和Bert一致,都是使用了Transformer的Encoder結(jié)構(gòu)。Roberta的改進(jìn)主要在以下幾點(diǎn):
使用了更多的訓(xùn)練語料,在BERT采用的數(shù)據(jù)BOOKCORPUS+English WIKIPEDIA(共16G)基礎(chǔ)上,增加CC-NEWS(76GB)、OPENWEBTEXT(38GB)、STORIES(31GB),一共用了160GB語料進(jìn)行預(yù)訓(xùn)練
訓(xùn)練時采用動態(tài)MASK策略,預(yù)訓(xùn)練的每一個step都隨機(jī)挑選15%的token進(jìn)行mask操作,而不是像BERT那樣,一個epoch內(nèi)選取固定的15%token進(jìn)行mask
去除BERT中的next sentence prediction(NSP)預(yù)訓(xùn)練任務(wù),因?yàn)閷?shí)驗(yàn)證明NSP任務(wù)可能對效果有負(fù)提升,因?yàn)槠浒瑑蓚€句子的拼接,可能會對單個句子截斷從而影響句子的語義表達(dá),此外NSP中含有大量負(fù)樣本,即兩個句子的關(guān)聯(lián)度不高,也會影響mask的預(yù)測
訓(xùn)練時采用更大的batch size,更大的batch size可以提升性能,但同時也會造成更大的顯存開銷
Byte-level BPE編碼,原始BERT采用字符級別的BPE編碼,英文vocab size為30k,容易出現(xiàn)UNK問題,影響模型效果。RoBERTa采用了Byte級別的BPE詞匯表,vocab size為50k。vocab size的增加使得模型參數(shù)量有所增加,BERT-base增加了15M,BERT-large增加了20M。但也提升了一定的效果。
-
除此之外,中文chinese-roberta-wwm-ext模型又對roberta的優(yōu)化策略做了如下改進(jìn),使其更適合中文NLP任務(wù):
- 采用全詞掩碼策略。Google在2019年發(fā)布了BERT的升級版,其中包含whole-word-mask(wwm),即全詞掩碼。在全詞Mask中,如果一個完整的詞的部分WordPiece子詞被mask,則同屬該詞的其他部分也會被mask。由于中文BERT模型是以字為粒度進(jìn)行切分,沒有考慮到傳統(tǒng)NLP中的中文分詞(CWS),因此chinese-roberta-wwm-ext將全詞Mask的方法應(yīng)用在了中文中,使用了中文維基百科(包括簡體和繁體)進(jìn)行訓(xùn)練,并且使用了哈工大LTP作為分詞工具,即對組成同一個詞的漢字全部進(jìn)行Mask
輸入:原始文本是一個句子,如“使用語言模型來預(yù)測下一個詞的probability”,經(jīng)過分詞和隨機(jī)mask后,會得到預(yù)處理文本“使 用 語 言 [MASK] [MASK] 來 [MASK] [MASK] 下 一 個 詞 的 [MASK] [MASK] [MASK]”,這里采用了全詞掩碼策略
輸出:對[MASK]位置的詞進(jìn)行預(yù)測,輸出概率值
預(yù)訓(xùn)練過程:集成了RoBERTa和BERT-wwm的優(yōu)點(diǎn),對兩者進(jìn)行了一個自然的結(jié)合。 和之前本目錄中的模型之間的區(qū)別如下:
預(yù)訓(xùn)練階段采用wwm策略進(jìn)行mask(但沒有使用dynamic masking)
簡單取消Next Sentence Prediction(NSP)loss
不再采用先maxlen=128然后再maxlen=512的訓(xùn)練模式,直接訓(xùn)練max_len=512
訓(xùn)練步數(shù)適當(dāng)延長
1.3.2 代碼實(shí)現(xiàn)
# Roberta模型的訓(xùn)練過程
def Roberta_train(train_file, test_file, model_save_path,out_file):
trainer = Trainer(data_file=train_file)
best_rouge_2 = 0.
best_rouge_l = 0.
train_epoches = 20
best_save_model_path = model_save_path
for epoch in tqdm(range(train_epoches)):
trainer.train(epoch)
_,results = trainer.test(model_path = None, test_file = test_file, with_metric = True,
out_file = 'saved_models/test_test_output_{}.json'.format(epoch))
if results['rouge-2'] > best_rouge_2 or results['rouge-l'] > best_rouge_l:
best_rouge_2 = max(results['rouge-2'], best_rouge_2)
best_rouge_l = max(results['rouge-l'], best_rouge_l)
best_save_model_path = model_save_path.replace('.bin','0530_{:.4f}_{:.4f}.bin'.format(results['rouge-2'], results['rouge-l']))
trainer.save(best_save_model_path)
trainer.test(model_path = best_save_model_path, test_file = test_file, out_file = out_file)
1.4 mT5 model
Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
導(dǎo)言:一個統(tǒng)一框架,靠著大力出奇跡,將所有 NLP 任務(wù)都轉(zhuǎn)化成 Text-to-Text(文本到文本)任務(wù)

1.4.1 原理
mT5是T5的多語言變體,已在包含101中語言的新的基于Common Crawl的數(shù)據(jù)集中進(jìn)行了預(yù)訓(xùn)練。mT5的模型架構(gòu)和訓(xùn)練過程與T5緊密相似,其改進(jìn)點(diǎn)在于:使用GeGLU非線性(Shazeer,2020年)激活函數(shù),在更大模型中縮放dmodel而不是改變dff, 對無標(biāo)簽數(shù)據(jù)進(jìn)行預(yù)訓(xùn)練而沒有dropout等措施。
本項(xiàng)目直接加載降級處理后的mT5模型(hugging Face庫中對應(yīng)的版本為:csebuetnlp/mT5_multilingual_XLSum),輸入文本通過tokenizer進(jìn)行分詞得到對應(yīng)的token id (支持最大長度為512),然后調(diào)用generate函數(shù),將編碼的輸入文本進(jìn)行解碼,目前項(xiàng)目在解碼過程中的超參數(shù)設(shè)置如下:支持最大長度max_length=70, 解碼所用的beam search所保留的beam值為4。然后將得到的generate token ids經(jīng)過tokenizer解碼生成具體預(yù)測的文本。
訓(xùn)練多語言模型的最重要的一點(diǎn)是如何從每種語言中采樣數(shù)據(jù)。但是,這種選擇是零和博弈:如果對低資源語言的采樣過于頻繁,則該模型可能會過擬合;如果對高資源語言的訓(xùn)練不夠充分,則模型的通用性會受限。
因此,研究團(tuán)隊采用Devlin和Arivazhagan等人使用的方法,并根據(jù)概率p(L)∝|L|^α,對資源較少的語言進(jìn)行采樣。其中p(L)是在預(yù)訓(xùn)練期間從給定語言中采樣的概率,|L|是該語言中樣本的數(shù)量,α是個超參數(shù),谷歌經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn)α取0.3的效果最好。
1.4.2 代碼實(shí)現(xiàn)
def summarize(text, max_length):
'''
text: 要生成摘要的文本
max_length: 摘要的最大長度
'''
preprocess_text = text.strip().replace('\n','') # 去掉多余的空格和換行符
t5_prepared_text = 'summarize: ' + preprocess_text # 準(zhǔn)備前綴+文本
print("Preprocessed and prepared text: \n", t5_prepared_text) # 分詞
tokenized_text = tokenizer.encode(t5_prepared_text, return_tensors="pt").to(device)
summary_ids = model.generate(tokenized_text, # 進(jìn)行文本摘要
num_beams=4,
no_repeat_ngram_size=2,
min_length=30,
max_length=max_length,
early_stopping=True)
output = tokenizer.decode(summary_ids[0], skip_special_tokens=True) # 將id轉(zhuǎn)換為輸出 summary_ids.shape = [1, 50]
return output
二. 評價指標(biāo)
2.1 ROUGE-N
2.1.1 指標(biāo)解釋
ROUGE英文全稱Recall-Oriented Understudy for Gisting Evaluation,專注于召回率而非精度。N指的是N-gram,它會查看有多少個參考譯句中的n元詞組出現(xiàn)在了輸出之中
公式的分母是統(tǒng)計在參考譯文中N-gram的個數(shù),而分子是統(tǒng)計參考譯文與機(jī)器譯文共有的N-gram個數(shù)。
2.2 bertscore
2.2.1 指標(biāo)解釋
對兩個生成句和參考句(word piece進(jìn)行tokenize)分別用bert提取特征,然后對2個句子的每一個詞分別計算內(nèi)積,可以得到一個相似性矩陣?;谶@個矩陣,我們可以分別對參考句和生成句做一個最大相似性得分的累加然后歸一化,得到bertscore的precision,recall和F1:
2.3 Perplexity
2.3.1 指標(biāo)解釋
給測試集的句子賦予較高幾率值的語言模型較好,當(dāng)語言模型訓(xùn)練完以后,測試集中的句子都是正常的句子,那么訓(xùn)練好的模型就是在測試集上的幾率越高越好,對于句子s
它的概率為:
困惑度與測試集上的句子概率相關(guān),其基本思想是:給測試集的句子賦予較高概率值的語言模型較好,當(dāng)語言模型訓(xùn)練完之后,測試集中的句子都是正常的句子,那么訓(xùn)練好的模型就是在測試集上的概率越高越好,公式如下: