基于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()函数,然后向里传入了三个参数,最终生成了一篇长度为一百的,标题为 今天吃什么的文章。

输出的文章内容如下:

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

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

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

相关文章
|
20天前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
34 13
|
27天前
|
存储 JavaScript 前端开发
深入浅出Node.js后端开发
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将以Node.js为例,深入探讨其背后的哲学思想、核心特性以及在实际项目中的应用,旨在为读者揭示Node.js如何优雅地处理高并发请求,并通过实践案例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和思考。
|
24天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
本文将带你领略Node.js的魅力,从基础概念到实践应用,一步步深入理解并掌握Node.js在后端开发中的运用。我们将通过实例学习如何搭建一个基本的Web服务,探讨Node.js的事件驱动和非阻塞I/O模型,以及如何利用其强大的生态系统进行高效的后端开发。无论你是前端开发者还是后端新手,这篇文章都会为你打开一扇通往全栈开发的大门。
|
27天前
|
Web App开发 开发框架 JavaScript
深入浅出Node.js后端开发
在这篇文章中,我们将一起探索Node.js的奇妙世界。无论你是刚接触后端开发的新手,还是希望深化理解的老手,这篇文章都适合你。我们将从基础概念开始,逐步深入到实际应用,最后通过一个代码示例来巩固所学知识。让我们一起开启这段旅程吧!
|
23天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
26天前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
本文旨在揭示Node.js的核心特性之一——事件循环,并探讨其对后端开发实践的深远影响。通过剖析事件循环的工作原理和关键组件,我们不仅能够更好地理解Node.js的非阻塞I/O模型,还能学会如何优化我们的后端应用以提高性能和响应能力。文章将结合实例分析事件循环在处理大量并发请求时的优势,以及如何避免常见的编程陷阱,从而为读者提供从理论到实践的全面指导。
|
27天前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带你走进Node.js的世界,从基础到进阶,逐步解析Node.js在后端开发中的应用。我们将通过实例来理解Node.js的异步特性、事件驱动模型以及如何利用它处理高并发请求。此外,文章还会介绍如何搭建一个基本的Node.js服务器,并探讨如何利用现代前端框架与Node.js进行交互,实现全栈式开发。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
22 4
|
1月前
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
32 2
2024年5月node.js安装(winmac系统)保姆级教程
|
1月前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
88 2
|
3月前
|
JavaScript
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装