39-textrank文本关键词提取与文本摘要

作者: wonphen | 来源:发表于2020-02-26 10:00 被阅读0次

    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 "疫情防控方面要重点抓好以下工作" 
    

    相关文章

      网友评论

        本文标题:39-textrank文本关键词提取与文本摘要

        本文链接:https://www.haomeiwen.com/subject/fynpchtx.html