基于node.js开发的文章生成器(三、占位符的替换与段落的生成与文章的生成)

简介: # 引言前面我们已经学会了随机抽取语料库,接下来我们来真正意义上的合成句子。# 生成废话的样子![image.png](https://ucc.alicdn.com/pic/developer-ecology/y3obldvnqeb54_0f21b20ff7d8408e8a8743b2911e6076.png)大概是这样但是前面我们提取到的data是带有一定占位符的,首先我们就要完成占位符的替换。# 占位符的替换接下来我们来做占位符的替换,我们定义一个sentence的函数,然后传入两个参数,pick和replacer,其中,pick函数分为pickFamous,pi

引言

前面我们已经学会了随机抽取语料库,接下来我们来真正意义上的合成句子。

生成废话的样子

image.png

大概是这样

但是前面我们提取到的data是带有一定占位符的,首先我们就要完成占位符的替换。

占位符的替换

接下来我们来做占位符的替换,我们定义一个sentence的函数,然后传入两个参数,pick和replacer,其中,pick函数分为pickFamous,pickSaid.......等多种通过上一章的高阶函数创造的抽取废话的不同的部分,replacer则是要替换的对象

import { randomInt,randomFun } from "./random";
import fs from 'fs';

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;
}

上述函数通过传递参数即可完成句子的替换。

例如句子:"查尔斯·史{{said}},一个人几乎可以在任何他怀有无限热忱的事情上成功。{{conclude}}",
我们只需要传入pickFamous()和{said:pickSaid(),conclude:pickConclude()}即可通过上述的sentence()函数完成替换。

测试实例如下:

import { randomInt,randomFun } from "./random.js";
import fs from 'fs';

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;
}

// 下面为测试部分 用于测试句子的替换情况
fs.readFile('../resources/data.json',{encoding:"utf-8"},(err,dataStr)=>{
    if(err){
      console.log(err);
    }
    else {
      dataStr = JSON.parse(dataStr);
      const pickFamous = randomFun(dataStr.famous);
      const pickConclude = randomFun(dataStr.conclude);
      const pickSaid = randomFun(dataStr.said);
      console.log(sentence(pickFamous,{said:pickSaid(),conclude:pickConclude()}));
    }
})

还是切换到lib目录下,执行node article.js,即可打印出结果

培根说过,深窥自己的心,而后发觉一切的奇迹在你自己。这启发了我。

文章的生成

完成了占位符的替换部分,我们就可以来到最后一部分-----文章的生成了。

核心思路,通过上一章节的高阶函数生成几个废话部分的pick()函数,再通过上面的sentence()函数不断地生成句子,最后超出文章字数极大值的时候停止。

article.js全部代码如下:

import { randomInt,randomFun } 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 articleCreate(title, {
  data
} = {},
cout
) {
  const articleLength = cout;
  const {famous, bosh_before, bosh, said, conclude} = data;
  const [pickFamous, pickBoshBefore, pickBosh, pickSaid, pickConclude] = [famous, bosh_before, bosh, said, conclude].map((item) => {
    return randomFun(item);
});

const article = [];
let totalLength = 0;

while(totalLength < articleLength) {
  let section = '';
  const sectionLength = randomInt(200, 500);
  while(section.length < sectionLength || !/[。?]$/.test(section)) {
    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;
}

代码有些复杂,我来解释一下

首先将articleCreate()export出去,然后定义一个articleLength用做接受文章长度,下一行的const {famous, bosh_before, bosh, said, conclude} = data;则是解构赋值传入的data(data是fs读取的语料库的数据)。接下来通过解构赋值加上createRandomPicker()函数完成pickFamous, pickBoshBefore, pickBosh, pickSaid, pickConclude几个函数的创建。

接下来创建article数组作为文章存储容器,totalLength 作为已有文章字数,通过totalLength和articleLength的比对完成while循环。section作为段落的变量,接下来通过一些句子剩余的判断生成不同长度的废话,然后判断其完整性和长度来添加标点符号。最后section添加到article中,返回出去。

当然可能说完这些还是有一些难度去理解,接下来我们通过一个简单的实例来测试这部分代码

接下来我们改造一下src目录下的index.js文件。

import fs from 'fs';
import {fileURLToPath} from 'url';
import path from 'path';
import {articleCreate} from '../lib/article.js';

const fileURL = import.meta.url;
const pathURL = fileURLToPath(fileURL);
const dirname = path.resolve(pathURL,"../");
const filePath = path.resolve(dirname,"../","resources/data.json");
fs.readFile(filePath,{encoding:"utf-8"},(err,dataStr)=>{
    if(err){
        console.log(err);
    }
    else{
        const data = JSON.parse(dataStr);
        const article = articleCreate('今天吃什么',{data},100);
        console.log(article[0]);
    }
})

前面的代码在准备部分就已经说过,这里就不多赘述了,主要是我import了article.js文件中的articleCreate()函数,然后向里传入了三个参数,最终生成了一篇长度为一百的,标题为 今天吃什么的文章。

输出的文章内容如下:

而这些并不是完全重要,更加重要的问题是,我认为,今天吃什么,到底应该如何实现。 培根说过,深窥自己的心,而后发觉一切的奇迹在你自己。这不
禁令我深思。 既然如此,今天吃什么,到底应该如何实现。 查尔斯·史说过一句著名的话,一个人几乎可以在任何他怀有无限热忱的事情上成功。这启发
了我。今天吃什么,到底应该如何实现。 今天吃什么,到底应该如何实现。 培根说过,深窥自己的心,而后发觉一切的奇迹在你自己。这启发了我。今天
吃什么,到底应该如何实现。 今天吃什么,到底应该如何实现。 我认为,今天吃什么,到底应该如何实现。 培根说过,深窥自己的心,而后发觉一切的
奇迹在你自己。这启发了我。我认为,今天吃什么,到底应该如何实现。 我认为,今天吃什么,到底应该如何实现。 培根说过,深窥自己的心,而后发觉
一切的奇迹在你自己。这启发了我。培根说过,深窥自己的心,而后发觉一切的奇迹在你自己。这启发了我。

可见我们的代码已经实现了生成废话文章的效果。

明天后天继续更新,现在的文章生成器只能接受我们的手动改的死数据,并不能交互,接下来的部分我会更新控制台交互版的文章生成器和网页版的文章生成器。

相关文章
|
1天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第36天】本文将引导您探索Node.js的世界,通过实际案例揭示其背后的原理和实践方法。从基础的安装到高级的异步处理,我们将一起构建一个简单的后端服务,并讨论如何优化性能。无论您是新手还是有经验的开发者,这篇文章都将为您提供新的视角和深入的理解。
|
6天前
|
Web App开发 存储 JavaScript
深入浅出Node.js后端开发
【10月更文挑战第31天】本文将引导你进入Node.js的奇妙世界,探索其如何革新后端开发。通过浅显易懂的语言和实际代码示例,我们将一起学习Node.js的核心概念、搭建开发环境,以及实现一个简单但完整的Web应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇通往高效后端开发的大门。
|
2天前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
18 4
|
6天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
【10月更文挑战第30天】本文将通过一个Node.js的简单示例,引导你进入Node.js的世界。我们将从基础概念讲起,然后一步步深入到代码实现,最后总结Node.js在后端开发中的优势和应用场景。无论你是前端开发者还是后端新手,这篇文章都将为你打开一扇了解Node.js的大门。
17 2
|
4天前
|
Web App开发 JavaScript 前端开发
探索后端开发:Node.js与Express的完美结合
【10月更文挑战第33天】本文将带领读者深入了解Node.js和Express的强强联手,通过实际案例揭示它们如何简化后端开发流程,提升应用性能。我们将一起探索这两个技术的核心概念、优势以及它们如何共同作用于现代Web开发中。准备好,让我们一起开启这场技术之旅!
13 0
|
10天前
|
JavaScript 前端开发 安全
深入浅出Node.js后端开发
【10月更文挑战第26天】在这篇文章中,我们将一起探索Node.js的奇妙世界。不同于传统的Java或Python,Node.js以其异步非阻塞I/O和事件驱动的特性,在后端开发领域独树一帜。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和思考。从基础概念到实际应用,我们一步步深入Node.js的世界,让你了解其不仅仅是JavaScript运行环境那么简单。
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
92 2
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
114 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
80 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
71 4
下一篇
无影云桌面