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

输出的文章内容如下:

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

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

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

相关文章
|
6月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
276 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
4月前
|
人工智能 监控 JavaScript
HarmonyOS5云服务技术分享--ArkTS开发Node环境
本文详细讲解了在HarmonyOS(ArkTS API 9及以上)中使用云函数的开发技巧,结合Node.js和HTTP触发器,从零开始手把手教学。内容涵盖核心能力、开发流程(配置到部署)、高阶优化及常见问题解决,并提供实际应用场景示例。助你快速掌握Serverless开发,提升效率,探索跨端协作与AI集成等未来方向。
|
7月前
|
JavaScript 前端开发 数据可视化
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
409 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
|
8月前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
165 10
|
9月前
|
Web App开发 JavaScript 前端开发
Node.js开发
Node.js开发
183 13
|
9月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带领读者从零基础开始,一步步深入到Node.js后端开发的精髓。我们将通过通俗易懂的语言和实际代码示例,探索Node.js的强大功能及其在现代Web开发中的应用。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的见解和技巧,让你的后端开发技能更上一层楼。
|
2月前
|
JavaScript Unix Linux
nvm与node.js的安装指南
通过以上步骤,你可以在各种操作系统上成功安装NVM和Node.js,从而在不同的项目中灵活切换Node.js版本。这种灵活性对于管理不同项目的环境依赖而言是非常重要的。
735 11
|
7月前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。