使用Node.js实现一个文章生成器

 更新时间:2024年07月05日 08:55:23   作者:爱吃土豆丝呦  
本文将从零开始,讲解如何使用Node.js来实现一个文章生成器,node里面有很多优秀的模块,现在我们就借助node的fs模块来操控文本,来实现我们想要的效果,感兴趣的小伙伴跟着小编一起来看看吧

前言

本文将从零开始,讲解如何使用Node.js来实现一个文章生成器

node里面有很多优秀的模块,现在我们就借助node的fs模块来操控文本,来实现我们想要的效果

效果展示

  • 体验 fs

首先我们先创建一个json文件

里面放一些内容

接下来我们书写代码

import fs from "fs";
const data = fs.readFileSync("./cuepus/data.json", "utf-8", (err, data) => {
  if (!err) {
    // console.log(data);
  } else {
    console.log(err);
  }
});

可以看到我们就能读取到文件里的数据,这里我们体验了fs里面强大的功能

在这里我们放了文章的一些必须点,如文章内容、标题等,通过随机拿取数据生成一个文章

这里我们通过

import { fileURLToPath } from "url";
import { dirname,resolve } from "path";

去操控获取绝对路径

const url = import.meta.url;// 获取当前文件的绝对路径 
console.log(url);
console.log(fileURLToPath(url));
console.log(dirname(fileURLToPath(url)));
// 获取文件的绝对路径
const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json"); console.log(path);
  • const url = import.meta.url; :使用了import.meta 对象来获取当前模块文件的绝对 URL 路径,并将其赋值给变量 url 。
  • console.log(fileURLToPath(url)); :将url路径转换为文件系统路径
  • console.log(dirname(fileURLToPath(url))); :将url转换为文件系统路径,然后通过 dirname 函数获取该路径的目录部分
  • const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json"); :将前面获取到的目录部分和相对路径 "./cuepus/data.json" 进行组合,生成一个完整的文件绝对路径,并将其赋值给变量 path 。

接下来我们代码就可以写成以下的形式

import fs from "fs";
import { fileURLToPath } from "url";
import { dirname,resolve } from "path";

const url = import.meta.url;// 获取当前文件的绝对路径
// 获取文件的绝对路径
const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json");
const data = fs.readFileSync(path, "utf-8", (err, data) => {
  if (!err) {
    // console.log(data);
  } else {
    console.log(err);
  }
});

console.log(JSON.parse(data));

接下来我们写封装两个函数

random.js

export function randomInt(min, max) {
  const n = Math.random()
  return Math.floor(min * (1 - n) + max * n)
}

export function createRandomPicker(arr) {
  arr = [...arr]

  function randomPick() { 
    const len = arr.length - 1
    const index = randomInt(0, len);
    [arr[index], arr[len]] = [arr[len], arr[index]]
    return arr[index]
  }
  randomPick()  // 放弃第一次结果
  return randomPick
}

首先,定义了一个名为 randomInt 的导出函数,它接受两个参数 min 和 max ,用于生成指定范围内的随机整数。

然后,定义了一个名为 createRandomPicker 的导出函数,它接受一个数组 arr 作为参数。

在函数内部,先对传入的数组进行了复制,以避免修改原始数组。

接着,定义了一个内部函数 randomPick ,它的功能是:

  • 计算数组的有效长度。
  • 生成一个在有效范围内的随机索引。
  • 通过交换将随机索引处的元素与最后一个元素交换位置。
  • 返回交换后的随机索引处的元素。

在函数体中,首先调用了一次 randomPick 函数,但放弃了这次的结果。

最后,返回 randomPick 函数,以便外部可以调用它来获取随机抽取的数组元素。

generator.js

import { randomInt, createRandomPicker } from './random.js'

// 替换文本
function sentence(pick, replacer) {
  let ret = pick()  // 得到一个句子
  for (const key in replacer) {
    ret = ret.replace(
      new RegExp(`{{${key}}}`, 'g'), 
      typeof replacer[key] === 'function' ? replacer[key]() : replacer[key]
    ) 
  }
  return ret
}


export function generate(title, { corpus, min = 500, max = 800 }) {
  const articleLenth = randomInt(min, max)
  const { famous, bosh_before, bosh, conclude, said } = corpus
  const [pickFamous, pickBoshBefore, pickBosh, pickConclude, pickSaid] 
  = [famous, bosh_before, bosh, conclude, said].map(createRandomPicker)

  const article = []
  let totalLength = 0

  while (totalLength < articleLenth) {  // 生成文章
    let section = ''
    const sectionLength = randomInt(100, 300)
    while (section.length < sectionLength) {  // 生成段落
      const n = randomInt(0, 100)
      if (n < 20) {
        section += sentence(pickFamous, {said: pickSaid, conclude: pickConclude})
      } else if (n < 50) {
        section += sentence(pickBoshBefore, { title }) + sentence(pickBosh, { title })
      } else {
        section += sentence(pickBosh, { title })
      }
    }
    totalLength += section.length
    article.push(section)
  }
  return article
}

从 './random.js' 模块导入了 randomInt 和 createRandomPicker 两个函数。

然后,定义了 sentence 函数,它接受两个参数 pick 和 replacer 。

pick 函数用于获取一个句子,然后通过遍历 replacer 对象中的键,使用正则表达式匹配并替换句子中特定的模板字符串(形如 {{key}} )。如果对应的值是函数,则调用函数获取结果进行替换,否则直接使用值进行替换。

接下来,定义了 generate 函数,它接受三个参数:title 、一个包含配置信息的对象(包含 corpus 以及可选的 min 和 max )。

在函数内部:

  • 通过 randomInt 生成一个在 min 和 max 范围内的文章长度 articleLenth 。
  • 从 corpus 对象中解构出几个部分,并对每个部分使用 createRandomPicker 函数创建随机选择器。
  • 通过一个循环生成文章内容,每次循环生成一个段落。在生成段落的过程中,根据随机数决定使用不同的句子生成方式,并通过 sentence 函数进行处理和组合。
  • 不断累加段落的长度,直到总长度达到 articleLenth ,最终将生成的文章段落组成一个数组返回。

最后调用即可,修改index.js

import fs from 'fs'
import { fileURLToPath } from 'url'
import { dirname, resolve } from 'path'
import { generate } from './lib/generator.js'
import { createRandomPicker } from './lib/random.js'


function loadCorpus(src) {
  const url = import.meta.url  // 读取当前脚本的绝对路径
  const path = resolve(dirname(fileURLToPath(url)), src)
  const data = fs.readFileSync(path, {encoding: 'utf8'})
  return JSON.parse(data)
}
const corpus = loadCorpus('curpus/data.json')
const pickTitle = createRandomPicker(corpus.title)
const title = pickTitle()

const article = generate(title, { corpus })

fs.writeFileSync(`./output/${title}.txt`, article.join(''));

总结

本文本文将从零开始,讲解如何使用Node.js来实现一个文章生成器

希望看到这里的你能够有所收获!!!!自己动手实现一个简易的文章生成器吧

后期可以结合AI去实现更加智能的文章生成器

到此这篇关于使用Node.js实现一个文章生成器的文章就介绍到这了,更多相关Node.js文章生成器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解Node.js的HTTP模块

    深入理解Node.js的HTTP模块

    最近在工作中接触到了Node.js标准库提供了http模块,所以这篇文章想总结下Node.js的HTTP模块,方便大家和自己以后使用的时候参考借鉴。有需要的朋友们下面来一起看看吧。
    2016-10-10
  • 浅谈Koa服务限流方法实践

    浅谈Koa服务限流方法实践

    本篇文章主要介绍了浅谈Koa服务限流方法实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • node.js-path模块你了解多少

    node.js-path模块你了解多少

    这篇文章主要为大家详细介绍了node.js-path模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • pnpm实现依赖包共享和依赖包项目隔离的方法详解

    pnpm实现依赖包共享和依赖包项目隔离的方法详解

    pnpm是Node.js的包管理器,它是 npm 的直接替代品,相对于npm和yarn它的优点就在于速度快和高效节省磁盘空间,本文主要讲解pnpm相比于npm/yarn如何利用软硬链接来节省磁盘空间,以及如何实现依赖包共享和依赖包项目隔离的,需要的朋友可以参考下
    2024-05-05
  • nvm安装使用及常用命令

    nvm安装使用及常用命令

    nvm主要是用来管理 nodejs 和 npm 版本的工具,可以用来切换不同版本的 nodejs,这篇文章主要介绍了nvm安装与使用,需要的朋友可以参考下
    2023-01-01
  • Node.JS利用PhantomJs抓取网页入门教程

    Node.JS利用PhantomJs抓取网页入门教程

    现今,网页抓取已经是一种人所共知的技术了,然而依然存在着诸多复杂性,下面这篇文章主要给大家介绍了Node.JS利用PhantomJs抓取网页的方法教程,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • Node.JS中事件轮询(Event Loop)的解析

    Node.JS中事件轮询(Event Loop)的解析

    对NodeJs的事情轮询机造一孔之见。查阅了些许材料后,总算掀开了其神奇的里纱。下面这篇文章主要介绍了Node.JS中事件轮询(Event Loop)的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • nodejs+express实现文件上传下载管理网站

    nodejs+express实现文件上传下载管理网站

    这篇文章主要为大家详细介绍了nodejs+express实现文件上传下载管理的网站,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • node.js实现端口转发

    node.js实现端口转发

    这篇文章主要为大家详细介绍了node.js实现端口转发的关键代码,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 使用 Node-RED对 MQTT 数据流处理

    使用 Node-RED对 MQTT 数据流处理

    本文将介绍使用 Node-RED 连接到 MQTT 服务器,并对 MQTT 数据进行过滤和处理后再将其发送至 MQTT 服务器的完整操作流程。读者可以快速了解如何使用 Node-RED 对 MQTT 数据进行简单的流处理
    2022-05-05

最新评论