likes
comments
collection
share

如何用node实现一个废话生成器

作者站长头像
站长
· 阅读数 23

前言

现如今废话文学成铺天盖地之势,今天我们就来学习制作一个废话生成器😎

正文

目录结构

如何用node实现一个废话生成器

语言词汇库

这是的示例数据库地址:gitee.com/alozzhi/lhj…

导入到项目文件夹中

里面有很多废话语料

如何用node实现一个废话生成器

实现步骤

index.js

  1. 导入必要的模块:脚本首先导入Node.js的一些内置模块,如fs用于文件系统操作,从url模块导入fileURLToPath,以及从path模块导入dirnameresolve。此外,它还从本地文件导入自定义函数generatecreateRandomPicker
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'
  1. 定义loadCorpus函数:此函数负责从指定源加载JSON数据。使用了import.meta.url获取当前脚本的绝对路径,然后解析出相对于当前脚本位置的数据文件路径。通过fs.readFileSync同步读取文件后,将JSON数据解析成JavaScript对象。
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)
}
  1. 加载语料库数据:变量corpus被赋值为调用loadCorpus函数的结果,参数是数据文件的路径。
const corpus = loadCorpus('curpus/data.json')
  1. 创建随机标题选择器:使用createRandomPicker创建一个随机选择器函数pickTitle,并将语料库数据中的标题数组传入。
const pickTitle = createRandomPicker(corpus.title)
  1. 选择标题:通过调用pickTitle()函数选择一个随机标题,并存储在变量title中。
const title = pickTitle()
  1. 生成文章:使用选择的title和整个corpus数据,通过调用generate函数生成一篇文章。生成的文章存储在变量article中。
const article = generate(title, { corpus })
  1. 将文章写入文件:最后,生成的文章被写入到output目录下的文本文件中,文件名以选择的title命名。
fs.writeFileSync(`./output/${title}.txt`, article.join('\n'));

完整代码:

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('\n'));

random.js

这段js 代码主要做了两件事:

  1. 定义一个 randomInt 函数,用于生成一个在给定最小值和最大值之间的随机整数。
  2. 定义一个 createRandomPicker 函数,它接收一个数组,然后创建一个可以从中随机抽取元素的函数。每次调用这个抽取函数,都会随机返回数组中的一个元素,并确保这个元素在之后的抽取中不会被重复抽到,直到数组中的所有元素都被抽取过一次。
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
}

generator.js

这段代码定义了一个 generate 函数,其功能是从提供的语料库(corpus)中生成一篇长度在指定范围内的文章。

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 }) {
   //调用 `randomInt` 函数来确定文章的总长度,介于 `min` 和 `max` 之间
  const articleLenth = randomInt(min, max)
  
  //从 `corpus` 中解构出不同的语料库部分
  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) {
      
      //使用 `sentence` 函数来生成具体的句子,其中 `sentence` 函数会随机选择一句模板,然后用相应的语料替换模板中的占位符
        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 
}

生成废话

我们运行index.js文件,能看到output里成功生成了废话文档

如何用node实现一个废话生成器

结语

以上就是本篇文章全部内容,我们成功利用node制作了一个废话生成器,希望本文对你有所帮助,感谢你的阅读!

转载自:https://juejin.cn/post/7389077092136976436
评论
请登录