如何用node实现一个废话生成器
前言
现如今废话文学成铺天盖地之势,今天我们就来学习制作一个废话生成器😎
正文
目录结构
语言词汇库
这是的示例数据库地址:gitee.com/alozzhi/lhj…
导入到项目文件夹中
里面有很多废话语料
实现步骤
index.js
- 导入必要的模块:脚本首先导入Node.js的一些内置模块,如
fs
用于文件系统操作,从url
模块导入fileURLToPath
,以及从path
模块导入dirname
和resolve
。此外,它还从本地文件导入自定义函数generate
和createRandomPicker
。
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'
- 定义
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)
}
- 加载语料库数据:变量
corpus
被赋值为调用loadCorpus
函数的结果,参数是数据文件的路径。
const corpus = loadCorpus('curpus/data.json')
- 创建随机标题选择器:使用
createRandomPicker
创建一个随机选择器函数pickTitle
,并将语料库数据中的标题数组传入。
const pickTitle = createRandomPicker(corpus.title)
- 选择标题:通过调用
pickTitle()
函数选择一个随机标题,并存储在变量title
中。
const title = pickTitle()
- 生成文章:使用选择的
title
和整个corpus
数据,通过调用generate
函数生成一篇文章。生成的文章存储在变量article
中。
const article = generate(title, { corpus })
- 将文章写入文件:最后,生成的文章被写入到
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 代码主要做了两件事:
- 定义一个
randomInt
函数,用于生成一个在给定最小值和最大值之间的随机整数。 - 定义一个
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制作了一个废话生成器,希望本文对你有所帮助,感谢你的阅读!
转载自:https://juejin.cn/post/7389077092136976436