39-textrank文本關鍵詞提取與文本摘要

TextRank算法是一個比較耗時的算法,因為它依賴于圖計算,需要構成相似度矩陣。當數據量變大的時候,運行時間會呈“幾何級”增長。但是對于中小型的文本來說,這個方法還是非常不錯的。但是中小型的文本,還需要摘要么?盡管如此,這還是一個非常直觀的算法,如果TF-IDF在一些時候不好用的話,這是一個非常好的候補選項。

1、讀取文獻

> library(pacman)
> p_load(readtext, dplyr)

注意路徑中不能包含中文,否則會讀取不到文件。

> # 批量讀取文件夾下所有的文本文件
> dir_path <- "C:/Users/Admin/Documents/CCST/"
> files <- system.file(dir_path, package = "readtext")
> filenames <- list.files(dir_path) %>% gsub("\\.+(.*)", "", .)
> 
> txt <- readtext(paste0(dir_path, "*"), encoding = "UTF-8", ignore_missing_files = F, docid_field = filenames, text_field = "texts")
> txt
## readtext object consisting of 8 documents and 0 docvars.
## # Description: df[,2] [8 x 2]
##   doc_id                                                          text                         
##   <chr>                                                           <chr>                        
## 1 關于研究生課程在線教學的通知(修改).docx                       "\"關于2019-202\"..."        
## 2 經管院非全專碩“中特”課程教學大綱、教學日歷、課件.docx           "\"2019—2020學\"..."         
## 3 陸婭楠-努力實現今年經濟社會發展目標任務.docx                    "\"陸婭楠-努力實現今年\"..." 
## 4 馬院2019-2020學年第二學期研究生培養工作實施方案.docx            "\"馬克思主義學院201\"..."   
## 5 習近平:新型冠狀病毒肺炎疫情工作時的講話.docx                   "\"在中央政治局常委會會\"..."
## 6 專題二 習近平新時代中國特色社會主義思想的豐富內涵與歷史地位.pdf   "\"\n  CONTENT\"..."         
## # ... with 2 more rows

2、關鍵詞提取

2.1 中文分詞

> p_load(cidian, jiebaR)

> stopword <- "./dict/stopwords_wf.txt"
> # 加載用戶字典及詞性標記
> wk <- worker(user = user, type = "tag", stop_word = stopword)
> # 預處理函數,清除數字
> pre_fun = function(string) {
+     # 英文轉小寫
+     string <- tolower(string)
+     # 清除符號:!'#$%&'()*+,-./:;<=>?@[\]^_`{|}~.
+     string <- gsub("[[:punct:]]", " ", string)
+     # 清除換行符、換頁符、退格符等控制字符
+     string <- gsub("[[:cntrl:]]", " ", string)
+     # 清除<>中的內容
+     string <- gsub("<.*?>", "", string)
+     # 清除數字
+     string <- gsub("\\d+", "", string)
+     # 多個連續空格替換為單個空格
+     string <- gsub("\\s+", " ", string)
+     # 清除\n
+     string <- gsub("\\n", " ", string)
+     return(string)
+ }
> tok_fun <- function(strings) {
+     strings <- lapply(strings, pre_fun)
+     strings <- lapply(strings, segment, wk)
+     return(strings)
+ }
> 
> tag_fun <- function(word) {
+     lapply(word, tibble::enframe, name = "tag", value = "word")
+ }
> 
> txt_jieba <- txt %>% mutate(words = tok_fun(text)) %>% mutate(word_tag = tag_fun(words)) %>% select(doc_id, word_tag)

2.2 構造提取名詞n的函數,提取關鍵詞

> p_load(textrank, tidyr)
> extract_n <- function(df) {
+     textrank_keywords(df$word, relevant = stringr::str_detect(df$tag, "^n"), ngram_max = 2) %>% .$keywords
+ }
> 
> txt_kw <- txt_jieba %>% mutate(textrank.key = lapply(word_tag, extract_n)) %>% select(-word_tag)
> txt_kw
##                                                              doc_id
## 1                         關于研究生課程在線教學的通知(修改).docx
## 2             經管院非全專碩“中特”課程教學大綱、教學日歷、課件.docx
## 3                      陸婭楠-努力實現今年經濟社會發展目標任務.docx
## 4              馬院2019-2020學年第二學期研究生培養工作實施方案.docx
## 5                     習近平:新型冠狀病毒肺炎疫情工作時的講話.docx
## 6   專題二 習近平新時代中國特色社會主義思想的豐富內涵與歷史地位.pdf
## 7           專題三 社會主要矛盾轉化與中國特色社會主義進入新時代.pdf
## 8 專題一 中國特色社會主義是改革開放以來黨的全部理論和實踐的主題.pdf
##                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      textrank.key
## 1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             教學, 課程, 研究生-課程, 任課教師, 單位, 處, 課堂, 學年-學期, 學期, 課程-教學, 疫情, 教學方式, 領導, 研究生-教學, 指導, 研究生, 教學-任課教師, 任課教師-課程, 布置, 主管-領導, 統計表, 課程名稱-任課教師, 辦公室-疫情, 湖北省-教育廳, 教育廳, 實施方案-文件精神, 文件精神, 單位-任課教師, 課堂-任課教師, 信息, 指導-任課教師, 文獻, 指導-課程, 項目-入選者, 入選者-榮譽稱號, 榮譽稱號, 單位-課程, 處-學年, 教學-課程, 單位-研究生, 統計表-單位, 教學-研究生, 課程-統計表, 統計表-課程名稱, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 27, 17, 8, 8, 7, 7, 6, 5, 5, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
## 2                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    中國-特色, 專題, 習近平, 課程, 理論, 教學, 特色, 時代-中國, 中共中央文獻研究室-習近平, 特色-理論, 特色-思想, 思想, 時間, 專題-中國, 碩士-研究生, 馬克思主義, 班, 手機號, 教學-專題, 指導, 專題-教學, 時代, 戰略, 生態, 線下, 人民出版社, 研究生-中國, 課程-教學, 國際-班, 班-課程, 中心-聯系人, 聯系人, 教學進度-本學期, 本學期, 課程-專題, 教材, 理論課-教學, 教學-指導, 教學-時間, 時間-專題, 專題-習近平, 核心-價值觀, 價值觀, 特色-生態, 國際-戰略, 教學方式, 講義, 布置-線下, 方式, 布置, 方式-時間, 馬克思主義-理論, 教材-碩士, 研究生, 理論課-教材, 教材-中國, 出版社-人民出版社, 習近平-生態, 黨史, 習近平-中國, 視頻-資料, 資料, 電視-政論, 政論, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 1, 17, 12, 10, 9, 8, 8, 7, 6, 6, 5, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
## 3                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      疫情, 經濟, 經濟社會, 壓力, 政策, 經濟運行, 中國-經濟, 目標, 疫情-經濟, 條件-能力, 能力-經濟社會, 目標-疫情, 信心, 對沖-疫情, 餐飲-影視娛樂, 影視娛樂, 結構性-體制性, 體制性, 疫情-經濟運行, 解決問題, 中國, 優勢, 技術-基礎, 基礎, 政策-空間, 空間-市場, 市場, 貸款, 市場-信心, 產業鏈, 拓寬-產品, 產品, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 16, 10, 5, 5, 5, 4, 4, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1

2.3 挑選ngram更高,詞頻大于1的關鍵詞

> top3_ngram <- txt_kw %>% unnest(cols = textrank.key) %>% group_by(doc_id) %>% filter(freq > 1) %>% top_n(3, ngram) %>% 
+     ungroup()
> top3_ngram
## # A tibble: 157 x 4
##    doc_id                                                keyword           ngram  freq
##    <chr>                                                 <chr>             <int> <int>
##  1 關于研究生課程在線教學的通知(修改).docx             研究生-課程           2     8
##  2 關于研究生課程在線教學的通知(修改).docx             學年-學期             2     5
##  3 關于研究生課程在線教學的通知(修改).docx             課程-教學             2     4
##  4 關于研究生課程在線教學的通知(修改).docx             研究生-教學           2     2
##  5 關于研究生課程在線教學的通知(修改).docx             教學-任課教師         2     2
##  6 關于研究生課程在線教學的通知(修改).docx             任課教師-課程         2     2
##  7 關于研究生課程在線教學的通知(修改).docx             主管-領導             2     2
##  8 關于研究生課程在線教學的通知(修改).docx             課程名稱-任課教師     2     2
##  9 經管院非全專碩“中特”課程教學大綱、教學日歷、課件.docx  中國-特色             2    17
## 10 經管院非全專碩“中特”課程教學大綱、教學日歷、課件.docx  時代-中國             2     6
## # ... with 147 more rows

2.4 篩選詞頻最高的10個詞

> top3_kw <- top3_ngram %>% count(keyword) %>% arrange(desc(n)) %>% slice(1:10)
> top3_kw
## A tibble: 10 x 2
##    keyword           n
##    <chr>         <int>
##  1 中國-特色         5
##  2 時代-中國         4
##  3 特色-思想         3
##  4 生態-文明         2
##  5 碩士-研究生       2
##  6 特色-理論         2
##  7 特色-理論體系     2
##  8 特色-社會         2
##  9 研究生-教學       2
## 10 制度-體系         2

4、文本摘要

4.1 將文章切分為語句

> get_sentence <- function(string) {
+     # 按標點符號切分
+     string %>% stringr::str_split("[:punct:]+") %>% unlist %>% tibble::enframe() %>% transmute(sentence_id = 1:n(), 
+         sentence = value)
+ }
> 
> get_word <- function(string) {
+     string %>% get_sentence %>% mutate(words = lapply(sentence, segment, wk)) %>% select(-sentence) %>% unnest(cols = words)
+ }

4.2 提取關鍵句函數

> rank_sentence <- function(st, wt) {
+     textrank_sentences(data = st, terminology = wt) %>% # 提取五個關鍵句
+     summary(n = 5)
+ }

4.3 選擇一個文檔生成摘要(全部生成耗時太長)

> # 隨機選擇一行
> article <- txt[sample(nrow(txt), 1), ]
> article
## readtext object consisting of 1 document and 0 docvars.
## Description: df[,2] [1 x 2]
##  doc_id                                        text                         
## * <chr>                                         <chr>                        
## 1 習近平:新型冠狀病毒肺炎疫情工作時的講話.docx "\"在中央政治局常委會會\"..."
> st <- get_sentence(article$text)
> wt <- get_word(article$text)
> key_sentence = rank_sentence(st,wt)
> abstract <- tibble(article$doc_id,key_sentence) %>% unnest(cols = key_sentence)
> print(abstract)
## A tibble: 5 x 2
##   `article$doc_id`                              key_sentence                                                  
##   <chr>                                         <chr>                                                         
## 1 習近平:新型冠狀病毒肺炎疫情工作時的講話.docx "在疫情防控工作中"                                            
## 2 習近平:新型冠狀病毒肺炎疫情工作時的講話.docx "關于疫情防控形勢和做好疫情防控重點工作\n  做好疫情防控工作"
## 3 習近平:新型冠狀病毒肺炎疫情工作時的講話.docx "要在做好疫情防控的同時"                                      
## 4 習近平:新型冠狀病毒肺炎疫情工作時的講話.docx "全面加強疫情防控工作的局面"                                  
## 5 習近平:新型冠狀病毒肺炎疫情工作時的講話.docx "疫情防控方面要重點抓好以下工作" 
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容