基于Nodejs的TF-IDF自动提取摘要,关键字插件 for Hexo

基于Nodejs的TF-IDF自动提取摘要,关键字插件 for Hexo

最近看了 阮一峰 关于 TF-IDF与余弦相似性的应用 的一系列文章, 深受启发。

加上发现一个非常好的 blog皮肤

于时心血来潮,写个插件练习下。

插件安装方法

npm install git://github.com/vfasky/hexo-summarizer.git

编辑配置文件 _config.yml

plugins:
- hexo-summarizer

在模板的适当处加入

<%- auto_keyword_desc(page.content) %>

当然,你要适当的改下模板的逻辑,如:

<% if (page.description){ %>
<meta name="description" content="<%= page.description %>">
<% } else if (page.content){ %>
<%- auto_keyword_desc(page.content) %>
<% } else if (config.description){ %>
<meta name="description" content="<%= config.description %>">
<% } %>

提取效果

示例文章

用机器代替人工做文章摘要,国内创业公司推出类Summly产品“自动摘要”

提取的值:

[ '其网站上现有三个示例,新闻说明文议论文各一篇,从示例的效果来看,个人觉得虽不如人工摘要来的紧凑和传情达意,但基本上也能从摘出来的内容了解到文章的大意',
  '有创业者在试图减轻人们信息筛选之苦,我们之前介绍过两款机器代替人工做文章摘要的产品,一是Summy,该产品出自一个 16 岁的少年之手,Nick DAosio 为自己的自动新闻摘要应用Summy拿到100万美元融资,后传 Yahoo CEO Marissa Mayer 也有意收购 Summy暂无更新的消息',
  '我同事体验后发现,这两款产品想法和愿景很好,但是实际使用效果并不如人意:Summy 基本就是截取个开头,而一些文章的核心内容并没放在开头;而针对一些比较偏重事实的文章,确实读 Cipped 提出的三点摘要就能大概了解文章内容了,而一些偏重观点性的文章,Cipped 还是提的不是很好' ]

demo

vfasky.com


3 回复

基于Node.js的TF-IDF自动提取摘要、关键字插件 for Hexo

最近阅读了阮一峰关于TF-IDF与余弦相似性的应用的一系列文章,深受启发。同时,我也发现了一个非常棒的博客及皮肤。

于是心血来潮,决定写一个插件进行练习。

插件安装方法

首先需要通过npm安装插件:

npm install git://github.com/vfasky/hexo-summarizer.git

编辑配置文件 _config.yml

_config.yml中添加插件配置:

plugins:
- hexo-summarizer

在模板的适当位置加入自动摘要和关键字生成

在EJS模板中,可以插入以下代码来调用插件功能:

<%- auto_keyword_desc(page.content) %>

为了确保页面描述的优先级,你可以修改模板逻辑如下:

<% if (page.description) { %>
<meta name="description" content="<%= page.description %>">
<% } else if (page.content) { %>
<%- auto_keyword_desc(page.content) %>
<% } else if (config.description) { %>
<meta name="description" content="<%= config.description %>">
<% } %>

提取效果示例

假设有一篇文章《用机器代替人工做文章摘要,国内创业公司推出类Summly产品“自动摘要”》,插件可以提取出以下内容作为摘要:

[
  "其网站上现有三个示例,新闻说明文议论文各一篇,从示例的效果来看,个人觉得虽不如人工摘要来的紧凑和传情达意,但基本上也能从摘出来的内容了解到文章的大意",
  "有创业者在试图减轻人们信息筛选之苦,我们之前介绍过两款机器代替人工做文章摘要的产品,一是Summy,该产品出自一个 16 岁的少年之手,Nick DAosio 为自己的自动新闻摘要应用Summy拿到100万美元融资,后传 Yahoo CEO Marissa Mayer 也有意收购 Summy暂无更新的消息",
  "我同事体验后发现,这两款产品想法和愿景很好,但是实际使用效果并不如人意:Summy 基本就是截取个开头,而一些文章的核心内容并没放在开头;而针对一些比较偏重事实的文章,确实读 Cipped 提出的三点摘要就能大概了解文章内容了,而一些偏重观点性的文章,Cipped 还是提的不是很好"
]

这些摘录能够帮助读者快速理解文章的主要内容,提高阅读效率。

示例站点

你可以访问vfasky.com查看插件的实际效果。

通过这个插件,我们可以更方便地在Hexo博客中自动生成摘要和关键词,从而提升文章的可读性和SEO优化。


nice 我也看了那系列的三篇文章,我手上在做 TF-IDF 关键词提取。有空在论坛交流。

为了实现基于Node.js的TF-IDF自动提取摘要和关键字的功能,并将其集成到Hexo博客系统中,我们可以编写一个Hexo插件。以下是一个简单的实现方案和步骤。

步骤1: 安装插件

首先需要通过npm安装插件:

npm install git://github.com/vfasky/hexo-summarizer.git --save

步骤2: 编辑配置文件 _config.yml

_config.yml 文件中添加插件配置:

plugins:
- hexo-summarizer

步骤3: 使用插件

在你的EJS模板文件中调用插件函数,以自动生成摘要和关键字。例如,在合适的位置插入:

<%- auto_keyword_desc(page.content) %>

示例代码:auto_keyword_desc 函数实现

这是一个简化版的 auto_keyword_desc 函数实现,它会根据页面内容生成摘要和关键字:

const tfidf = require('tfidf');

function auto_keyword_desc(content) {
    const words = content.split(/\s+/);
    const wordCount = {};
    
    // 统计词频
    words.forEach(word => {
        if (word in wordCount) {
            wordCount[word]++;
        } else {
            wordCount[word] = 1;
        }
    });
    
    // 计算TF-IDF
    const tfIdf = new tfidf();
    tfIdf.add({
        body: words
    });
    
    const keywords = tfIdf.top(5); // 获取前5个关键词
    
    return {
        summary: generateSummary(words), // 生成摘要
        keywords: keywords
    };
}

function generateSummary(words) {
    let summary = '';
    for (let i = 0; i < Math.min(words.length, 10); i++) { // 截取前10个词作为摘要
        summary += words[i] + ' ';
    }
    return summary.trim();
}

解释

  • TF-IDF计算:通过tfidf库计算每个单词的重要性。
  • 摘要生成:简单地从原文中截取前10个词作为摘要。
  • 模板使用:在模板中调用上述函数,将结果插入到HTML中。

这样,你就可以使用这个插件来自动生成每篇文章的关键字和摘要,从而提升用户体验。

回到顶部