如何理解呢,举个例子: 有一篇文章,讲述的是马尔科夫模型在中文分词中的应用,假设“马尔科夫模型” 和“中文分词”这两个分词的词频一样,也就是说两个词的TF值一样,那么, 哪个更适合做这篇文章的关键词呢? 显然是“马尔科夫模型”!
用统计学语言表达,就是在词频的基础上,对每个词分配一个权重: 最常用的词(如“的”、“是”、“在”等)给予最小的权重; 最常见的词(如“中文分词”)给予较小的权重; 较少见的词(如“马尔科夫模型”)给予较大的权重。
TF计算公式 TF=该次在文档中出现的次数 IDF=log(文档总数/包含改词的文档数+1)
关键词提取的代码实现:
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]