R中如何利用余弦算法实现文章的自动摘要

来源:互联网 发布:三月软件工作室面试 编辑:程序博客网 时间:2024/06/05 16:56

自动摘要

自动摘要,就是利用计算机自动地从原始文献中提取摘要。
例如百度经验中的经验摘要,简短的描述了该经验的主要解决问题。
自动摘要的算法原理
余弦相似度(Cosine Similarity)

这里写图片描述

算法步骤:

  1. 获取到需要摘要的文章
  2. 对该文章进行词频统计
  3. 对该文章进行分句 根据中文的标点符号,一般我们采用。,?进行分句
  4. 计算分句与文章之间的余弦相似度

代码实现:

library(tm)library(tmcn)library(Rwordseg)docs <- Corpus(  DirSource(    c(      "SogouC.mini/SampleNamed/C000007", "SogouC.mini/SampleNamed/C000008",      "SogouC.mini/SampleNamed/C000010", "SogouC.mini/SampleNamed/C000013",      "SogouC.mini/SampleNamed/C000014", "SogouC.mini/SampleNamed/C000016",      "SogouC.mini/SampleNamed/C000020", "SogouC.mini/SampleNamed/C000022",      "SogouC.mini/SampleNamed/C000023", "SogouC.mini/SampleNamed/C000024"    )  ),  readerControl = list(    language='UTF-8'  ))#使用矩阵的方式计算cosineDist <- function(x){  return(x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2))))) }#字符串分隔函数strsplits <- function(x, splits, ...) {  for (split in splits) {    x <- unlist(strsplit(x, split, ...))  }  return(x[nchar(x)>3])}mainSegs <- data.frame(  name=c(NA),   seg1=c(NA),   seg2=c(NA),   seg3=c(NA));for(i in 1:length(docs)) {  #分句  segs <- unlist(    strsplits(      docs[[i]]$content,       splits=c('。', '?')    )  );  doc <- Corpus(VectorSource(c(segs, paste(docs[[i]]$content, collapse = "。"))))  doc <- tm_map(    doc,     content_transformer(segmentCN),     returnType="tm"  )  #移除空白  doc <- tm_map(    doc,     stripWhitespace  )  #移除标点  doc <- tm_map(    doc,     removePunctuation  )  doc <- tm_map(    doc,     removeNumbers  )  tdm <- DocumentTermMatrix(    doc,     control = list(      wordLengths= c(1, 4),      stopwords = stopwordsCN()    )  )  TF <- as.matrix(tdm)  cosSimilar <- cosineDist(TF)  resultIndex <- apply(cosSimilar, 2, function(col) {    return(order(col, decreasing=TRUE)[2:4]);  })  mainSegs[i, 1] <- docs[[i]]$meta$id;  mainSegs[i, 2:4] <- segs[resultIndex[, length(segs)+1]]}
阅读全文
0 0