R文本挖掘-文章关键词提取

关键词提取(keywords)

  • 词频(Term Frequency)
  • 逆文档频率(Inverse Document Frequency)
    IDF就是每个词的权重,它的大小与一个词的常见程度成反比。
  • TF-IDF(Term Frequency-Inverse Document Frequency)
    权衡某个分词是否关键词的指标,该值越大,是关键词的可能性就越大。

如何理解呢,举个例子:
有一篇文章,讲述的是马尔科夫模型在中文分词中的应用,假设“马尔科夫模型”
和“中文分词”这两个分词的词频一样,也就是说两个词的TF值一样,那么,
哪个更适合做这篇文章的关键词呢?
显然是“马尔科夫模型”!

用统计学语言表达,就是在词频的基础上,对每个词分配一个权重:
最常用的词(如“的”、“是”、“在”等)给予最小的权重;
最常见的词(如“中文分词”)给予较小的权重;
较少见的词(如“马尔科夫模型”)给予较大的权重。

TF计算公式
TF=该次在文档中出现的次数
IDF=log(文档总数/包含改词的文档数+1)

TF-IDF=TF*IDF

关键词提取的代码实现:

library(tm)
library(tmcn)
library(Rwordseg)

docs <- Corpus(
  DirSource(
    c(
      "SogouC.mini/Sample/C000007", "SogouC.mini/Sample/C000008",
      "SogouC.mini/Sample/C000010", "SogouC.mini/Sample/C000013",
      "SogouC.mini/Sample/C000014", "SogouC.mini/Sample/C000016",
      "SogouC.mini/Sample/C000020", "SogouC.mini/Sample/C000022",
      "SogouC.mini/Sample/C000023", "SogouC.mini/Sample/C000024"
    )
  ),
  readerControl = list(
    language='UTF-8'
  )
)
#移除空白
docs <- tm_map(docs, stripWhitespace)
#移除标点
docs <- tm_map(docs, removePunctuation)

docs <- tm_map(docs, content_transformer(segmentCN), returnType="tm")

docs <- tm_map(docs, content_transformer(function(x) iconv(x, from="UTF8", to="GB2312", sub="byte")))

tdm <- TermDocumentMatrix(
  docs, 
  control = list(
    wordLengths= c(1, 4),
    stopwords = stopwordsCN()
  )
)

TF <- as.matrix(tdm)

IDF <- apply(TF, 1, function(row) {
  return (log2(length(docs)/(sum(ifelse(row>0, 1, 0))+1)))
});

TF.IDF = TF*IDF

keywords <- apply(TF.IDF, 2, function(col) {
  keyword <- col[order(col, decreasing=TRUE)][1:5];
  return(names(keyword))
})
#获取每篇文章关键字所在的位置,
#这样子就可以获取对应的TF、IDF以及TF.IDF的值了
keywordIndexes <- apply(TF.IDF, 2, function(col) {
  index <- order(col, decreasing=TRUE)[1:5];
  return(index)
})

TF[keywordIndexes[, 1], 1]
IDF[keywordIndexes[, 1]]
TF.IDF[keywordIndexes[, 1], 1]

版权声明:本文为lll1528238733原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。