文本摘要方法

所謂摘要,就是對給定的單個或者多個文檔進行梗概揭芍,即在保證能夠反映原文檔的重要內容的情況下幻件,盡可能地保持簡明扼要。質量良好的文摘能夠在信息檢索過程中發(fā)揮重要的作用好乐,比如利用文摘代替原文檔參與索引匾竿,可以有效縮短檢索的時間,同時也能減少檢索結果中的冗余信息蔚万,提高用戶體驗岭妖。隨著信息爆炸時代的到來,自動文摘逐漸成為自然語言處理領域的一項重要的研究課題

一. 技術路線

1.1 TF-IDF

《Term Weighting Approaches in Automatic Text Retrieval》

導言:一種統(tǒng)計方法笛坦,用以評估一個詞對于一個文件集或一個語料庫中的其中一份文件的重要程度区转。其是由兩個算法相乘而來,即詞頻(TF)乘以 逆文檔頻率指數(IDF)版扩。其中詞頻表示一個詞的常見程度废离,逆文檔頻率表示一個詞的稀有程度。其基本原理是礁芦,字詞的重要性隨著其在文件中出現(xiàn)的次數成正比增加蜻韭,但同時會隨著其在語料庫中出現(xiàn)的頻率成反比下降

1.1.1 原理

TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的頻率高,并且在其他文章中很少出現(xiàn)柿扣,則認為此詞或者短語具有很好的類別區(qū)分能力肖方,適合用來分類。其計算公式如下:

TF-IDF=TF×IDF

其中未状,TF表示詞頻(Term Frequency)俯画,IDF表示逆向文件頻率(Inverse Document Frequency)TF表示詞在文檔d中出現(xiàn)的頻率司草,而IDF的主要思想是:如果包含詞t的文檔越少艰垂,IDF越大泡仗,則說明詞條t具有很好的類別區(qū)分能力。

詞頻(TF)指的是某一個給定的詞語在該文件中出現(xiàn)的頻率猜憎。這個數字是對詞數(term count)的歸一化娩怎,以防止它偏向長的文件。對于在某一特定文件里的詞語來說胰柑,它的重要性可表示為:

TF_{i,j}=\frac{n_{i,j}}{\sum_kn_{k,j}}

其中分子是該詞在文件中的出現(xiàn)次數截亦,而分母則是在文件中所有字詞的出現(xiàn)次數之和

逆向文件頻率(IDF)指的是一個詞語普遍重要性的度量。某一特定詞語的IDF柬讨,可以由總文件數目除以包含該詞語之文件的數目崩瓤,再將得到的商取以10為底的對數得到:

DF_i=lg\frac{|D|}{|j:t_i\in d_j|}

某一特定文件內的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率姐浮,可以產生出高權重的TF-IDF谷遂。因此,TF-IDF傾向于過濾掉常見的詞語卖鲤,保留重要的詞語。其計算公式如下:

TF-IDF_{i,j}=TF_{i,j}×IDF_i

1.1.2 理論依據及不足

TF-IDF算法基于假設:對區(qū)別文檔最有意義的詞語應該是那些在文檔中出現(xiàn)頻率高畴嘶,而在整個文檔集合的其他文檔中出現(xiàn)頻率少的詞語蛋逾,因此引入TF詞頻作為測度,就可以體現(xiàn)同類文本的特點窗悯;另外考慮到單詞區(qū)別不同類別的能力区匣,TF-IDF法認為一個單詞出現(xiàn)的文本頻數越小,它區(qū)別不同類別文本的能力就越大蒋院,因此引入了逆文本頻度IDF的概念亏钩,以TF和IDF的乘積作為特征空間坐標系的取值測度,完成對TF權重的調整欺旧,其目的在于突出重要單詞姑丑,抑制次要單詞。本質上IDF是一種試圖抑制噪音的加權辞友,且單純認為文本頻數小的單詞就越重要栅哀,文本頻數大的單詞就越無用,顯然并不完全正確称龙。IDF的簡單結構并不能有效地反映單詞的重要程度和特征詞的分布情況留拾,使其無法很好地完成對權值調整的功能,所以TF-IDF法的精度并不是很高鲫尊。此外痴柔,在TF-IDF算法中并沒有體現(xiàn)出單詞的位置信息,特征詞在不同的位置對文章內容的反映程度不同,其權重的計算方法也應不同蒙秒。

1.1.3 代碼實現(xiàn)

使用TF_IDF模型實現(xiàn)文本摘要任務忍抽,具體思想如下

  1. 輸入原文(長文本)叉弦,可支持任意長度的文本签赃。

  2. 輸入文本經過文本清洗(刪除html標簽注盈、冗余字符且轨、url俗冻、異常字符等)堆巧,再進行分句妄荔,得到一系列句子的集合;

  3. 然后對原文中的每個句子進行權重的計算谍肤。

  4. 最后將句子按照重要程度進行排序啦租,篩選出超過閾值的重要句子,然后按照原文的序號進行排序荒揣。最后組合成完整的摘要文本并輸出篷角;

# sklearn的TF-IDF實現(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》

導言:最經典的基于圖的無監(jiān)督關鍵詞/句提取算法,是文本任務版本的PageRank系任。TextRank算法仿照PageRank恳蹲,將句子作為節(jié)點,使用句子間相似度俩滥,構造無向有權邊嘉蕾。使用邊上的權值迭代更新節(jié)點值,最后選取N個得分最高的節(jié)點霜旧,作為摘要错忱。

1.1.1 原理

最經典的TextRank通過將文本建模成無向全連接圖結構,在圖上利用PageRank迭代計算每個節(jié)點的重要性分數挂据,從而能夠提取關鍵節(jié)點以清。對于關鍵詞提取而言,圖上的每個節(jié)點即為文檔的詞崎逃,邊則代表詞和詞之間的共現(xiàn)關系掷倔,即在長度為N的滑動窗口內部的所有詞認為是存在共現(xiàn)關系的,這些詞也就相互之間有邊連接婚脱。這里構造的圖是無邊權的今魔,計算節(jié)點V_i的PageRank分數的方法如下式,d的存在目的是為了使模型有一定的概率跳到圖上其它隨機點上障贸,避免孤立點計算出現(xiàn)死循環(huán)错森,一般取d=0.85,初始節(jié)點分數均為1篮洁。注意下式是迭代計算的涩维,一般設為20次:

S\left(V_{i}\right)=(1-d)+d * \sum_{j \in \operatorname{In}\left(V_{i}\right)} \frac{1}{\left|\operatorname{Out}\left(V_{j}\right)\right|} S\left(V_{j}\right)

對于關鍵句提取而言,圖上的節(jié)點代表文檔中的句子,邊權則用下式計算瓦阐,其中S_i,S_j為兩個句子蜗侈,w_k代表句子中的詞,也即節(jié)點邊權定義為和兩個句子詞重疊率成正比睡蟋,之所以還要除以句子長度的對數之和踏幻,是考慮到越長的句子越可能出現(xiàn)重疊的詞

\operatorname{Similarity}\left(S_{i}, S_{j}\right)=\frac{\left|\left\{w_{k} \mid w_{k} \in S_{i} \& w_{k} \in S_{j}\right\}\right|}{\log \left(\left|S_{i}\right|\right)+\log \left(\left|S_{j}\right|\right)}

關鍵句提取中TextRank方法建立的圖為帶邊權的圖,因而以下式計算PageRank分數戳杀,這里w_{ij}即為節(jié)點V_i,V_j之間的邊權大小该面,d的規(guī)定同上:

W S\left(V_{i}\right)=(1-d)+d * \sum_{V_{j} \in In\left(V_{i}\right)} \frac{w_{j i}}{\sum_{V_{k} \in Out \left(V_{j}\right)} w_{j k}} W S\left(V_{j}\right)

故,基于上述方法可知信卡,TextRank方法是無監(jiān)督的不需要訓練

1.1.2 代碼實現(xiàn)

這里使用sklearn實現(xiàn)隔缀,使用TextRank抽取文檔中的關鍵句,實現(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

導言:基于全詞掩碼策略的中文預訓練BERT模型傍菇,在多項中文NLP任務中均取得優(yōu)異性能

Roberta本質上是一個調到最優(yōu)的bert模型猾瘸。chinese-roberta-wwm-ext針對中文任務的特點,對roberta的訓練策略進行了進一步的優(yōu)化

1.3.1 原理

整體改進

  • Roberta全稱為Robusty Optimized BERT Approach丢习,其基礎模型結構和Bert一致牵触,都是使用了Transformer的Encoder結構。Roberta的改進主要在以下幾點:

    • 使用了更多的訓練語料泛领,在BERT采用的數據BOOKCORPUS+English WIKIPEDIA(共16G)基礎上荒吏,增加CC-NEWS(76GB)、OPENWEBTEXT(38GB)渊鞋、STORIES(31GB),一共用了160GB語料進行預訓練

    • 訓練時采用動態(tài)MASK策略瞧挤,預訓練的每一個step都隨機挑選15%的token進行mask操作锡宋,而不是像BERT那樣,一個epoch內選取固定的15%token進行mask

    • 去除BERT中的next sentence prediction(NSP)預訓練任務特恬,因為實驗證明NSP任務可能對效果有負提升执俩,因為其包含兩個句子的拼接,可能會對單個句子截斷從而影響句子的語義表達癌刽,此外NSP中含有大量負樣本役首,即兩個句子的關聯(lián)度不高,也會影響mask的預測

    • 訓練時采用更大的batch size显拜,更大的batch size可以提升性能衡奥,但同時也會造成更大的顯存開銷

    • Byte-level BPE編碼,原始BERT采用字符級別的BPE編碼远荠,英文vocab size為30k矮固,容易出現(xiàn)UNK問題,影響模型效果譬淳。RoBERTa采用了Byte級別的BPE詞匯表档址,vocab size為50k盹兢。vocab size的增加使得模型參數量有所增加,BERT-base增加了15M守伸,BERT-large增加了20M绎秒。但也提升了一定的效果。

  • 除此之外尼摹,中文chinese-roberta-wwm-ext模型又對roberta的優(yōu)化策略做了如下改進见芹,使其更適合中文NLP任務:

    • 采用全詞掩碼策略。Google在2019年發(fā)布了BERT的升級版窘问,其中包含whole-word-mask(wwm)辆童,即全詞掩碼。在全詞Mask中惠赫,如果一個完整的詞的部分WordPiece子詞被mask把鉴,則同屬該詞的其他部分也會被mask。由于中文BERT模型是以字為粒度進行切分儿咱,沒有考慮到傳統(tǒng)NLP中的中文分詞(CWS)庭砍,因此chinese-roberta-wwm-ext將全詞Mask的方法應用在了中文中,使用了中文維基百科(包括簡體和繁體)進行訓練混埠,并且使用了哈工大LTP作為分詞工具怠缸,即對組成同一個詞的漢字全部進行Mask

輸入:原始文本是一個句子,如“使用語言模型來預測下一個詞的probability”钳宪,經過分詞和隨機mask后揭北,會得到預處理文本“使 用 語 言 [MASK] [MASK] 來 [MASK] [MASK] 下 一 個 詞 的 [MASK] [MASK] [MASK]”,這里采用了全詞掩碼策略

輸出:對[MASK]位置的詞進行預測吏颖,輸出概率值

預訓練過程:集成了RoBERTa和BERT-wwm的優(yōu)點搔体,對兩者進行了一個自然的結合。 和之前本目錄中的模型之間的區(qū)別如下:

  • 預訓練階段采用wwm策略進行mask(但沒有使用dynamic masking)

  • 簡單取消Next Sentence Prediction(NSP)loss

  • 不再采用先maxlen=128然后再maxlen=512的訓練模式半醉,直接訓練max_len=512

  • 訓練步數適當延長

1.3.2 代碼實現(xiàn)
# Roberta模型的訓練過程
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

導言:一個統(tǒng)一框架疚俱,靠著大力出奇跡,將所有 NLP 任務都轉化成 Text-to-Text(文本到文本)任務

1.4.1 原理

mT5是T5的多語言變體缩多,已在包含101中語言的新的基于Common Crawl的數據集中進行了預訓練呆奕。mT5的模型架構和訓練過程與T5緊密相似,其改進點在于:使用GeGLU非線性(Shazeer衬吆,2020年)激活函數梁钾,在更大模型中縮放dmodel而不是改變dff, 對無標簽數據進行預訓練而沒有dropout等措施。

本項目直接加載降級處理后的mT5模型(hugging Face庫中對應的版本為:csebuetnlp/mT5_multilingual_XLSum)咆槽,輸入文本通過tokenizer進行分詞得到對應的token id (支持最大長度為512)陈轿,然后調用generate函數,將編碼的輸入文本進行解碼,目前項目在解碼過程中的超參數設置如下:支持最大長度max_length=70, 解碼所用的beam search所保留的beam值為4麦射。然后將得到的generate token ids經過tokenizer解碼生成具體預測的文本蛾娶。

  • 訓練多語言模型的最重要的一點是如何從每種語言中采樣數據。但是潜秋,這種選擇是零和博弈:如果對低資源語言的采樣過于頻繁蛔琅,則該模型可能會過擬合;如果對高資源語言的訓練不夠充分峻呛,則模型的通用性會受限罗售。

  • 因此,研究團隊采用Devlin和Arivazhagan等人使用的方法钩述,并根據概率p(L)∝|L|^α寨躁,對資源較少的語言進行采樣。其中p(L)是在預訓練期間從給定語言中采樣的概率牙勘,|L|是該語言中樣本的數量职恳,α是個超參數,谷歌經過實驗發(fā)現(xiàn)α取0.3的效果最好方面。

1.4.2 代碼實現(xiàn)
def summarize(text, max_length):
    '''
      text: 要生成摘要的文本
      max_length: 摘要的最大長度
    '''
    preprocess_text = text.strip().replace('\n','')                       # 去掉多余的空格和換行符
    t5_prepared_text = 'summarize: ' + preprocess_text                    # 準備前綴+文本
    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,                          # 進行文本摘要
                                 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轉換為輸出 summary_ids.shape = [1, 50]
    return output

二. 評價指標

2.1 ROUGE-N

2.1.1 指標解釋

ROUGE英文全稱Recall-Oriented Understudy for Gisting Evaluation放钦,專注于召回率而非精度。N指的是N-gram恭金,它會查看有多少個參考譯句中的n元詞組出現(xiàn)在了輸出之中

ROUGE-N=\frac{\sum \limits_{S\in \{ReferenceSummaries\}}\sum \limits_{gram\in S}Count_{match}(gram_N)}{\sum\limits_{S\in \{ReferenceSummaries\}}\sum\limits_{gram\in S}Count(gram_N)}

公式的分母是統(tǒng)計在參考譯文中N-gram的個數操禀,而分子是統(tǒng)計參考譯文與機器譯文共有的N-gram個數。

2.2 bertscore

2.2.1 指標解釋

對兩個生成句和參考句(word piece進行tokenize)分別用bert提取特征横腿,然后對2個句子的每一個詞分別計算內積颓屑,可以得到一個相似性矩陣」⒑福基于這個矩陣邢锯,我們可以分別對參考句和生成句做一個最大相似性得分的累加然后歸一化,得到bertscore的precision搀别,recall和F1:

R_{BERT}=\frac{1}{|x|} \sum_{x_i\in x} \max_{\hat x_j\in \hat x}x_i^T\hat x_j\\ P_{BERT}=\frac{1}{|\hat x|} \sum_{\hat x_i\in \hat x} \max_{x_j\in x}x_i^T\hat x_j\\ F_{BERT}=2\frac{P_{BERT}\cdot R_{BERT}}{P_{BERT}+R_{BERT}}

2.3 Perplexity

2.3.1 指標解釋

給測試集的句子賦予較高幾率值的語言模型較好,當語言模型訓練完以后,測試集中的句子都是正常的句子尾抑,那么訓練好的模型就是在測試集上的幾率越高越好歇父,對于句子s

S=W_1,W_2,...,W_k

它的概率為:

P(S)=P(W_1,W_2,...,W_k)=P(W_1)P(W_2|W_1)...P(W_k|W_1,W_2,...,W_{k-1})

困惑度與測試集上的句子概率相關,其基本思想是:給測試集的句子賦予較高概率值的語言模型較好,當語言模型訓練完之后再愈,測試集中的句子都是正常的句子榜苫,那么訓練好的模型就是在測試集上的概率越高越好,公式如下:

PP(W)=P(w_1,w_2,...,w_N)^{-\frac1N} = \sqrt[N]{\frac{1}{P(w_1,w_2,...,w_N)}}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末翎冲,一起剝皮案震驚了整個濱河市垂睬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖驹饺,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钳枕,死亡現(xiàn)場離奇詭異,居然都是意外死亡赏壹,警方通過查閱死者的電腦和手機鱼炒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝌借,“玉大人昔瞧,你說我怎么就攤上這事∑杏樱” “怎么了自晰?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稍坯。 經常有香客問我酬荞,道長,這世上最難降的妖魔是什么劣光? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任袜蚕,我火速辦了婚禮,結果婚禮上绢涡,老公的妹妹穿的比我還像新娘牲剃。我一直安慰自己,他們只是感情好雄可,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布凿傅。 她就那樣靜靜地躺著,像睡著了一般数苫。 火紅的嫁衣襯著肌膚如雪聪舒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天虐急,我揣著相機與錄音箱残,去河邊找鬼。 笑死止吁,一個胖子當著我的面吹牛被辑,可吹牛的內容都是我干的。 我是一名探鬼主播敬惦,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼盼理,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俄删?” 一聲冷哼從身側響起宏怔,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奏路,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后臊诊,有當地人在樹林里發(fā)現(xiàn)了一具尸體鸽粉,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年妨猩,在試婚紗的時候發(fā)現(xiàn)自己被綠了潜叛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡壶硅,死狀恐怖威兜,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情庐椒,我是刑警寧澤椒舵,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站约谈,受9級特大地震影響笔宿,放射性物質發(fā)生泄漏。R本人自食惡果不足惜棱诱,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一泼橘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迈勋,春花似錦炬灭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厦凤,卻和暖如春鼻吮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背较鼓。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工椎木, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人博烂。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓拓哺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脖母。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容