最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Node.js實現(xiàn)一個文章生成器

 更新時間:2024年07月05日 08:55:23   作者:愛吃土豆絲呦  
本文將從零開始,講解如何使用Node.js來實現(xiàn)一個文章生成器,node里面有很多優(yōu)秀的模塊,現(xiàn)在我們就借助node的fs模塊來操控文本,來實現(xiàn)我們想要的效果,感興趣的小伙伴跟著小編一起來看看吧

前言

本文將從零開始,講解如何使用Node.js來實現(xiàn)一個文章生成器

node里面有很多優(yōu)秀的模塊,現(xiàn)在我們就借助node的fs模塊來操控文本,來實現(xiàn)我們想要的效果

效果展示

  • 體驗 fs

首先我們先創(chuàng)建一個json文件

里面放一些內(nèi)容

接下來我們書寫代碼

import fs from "fs";
const data = fs.readFileSync("./cuepus/data.json", "utf-8", (err, data) => {
  if (!err) {
    // console.log(data);
  } else {
    console.log(err);
  }
});

可以看到我們就能讀取到文件里的數(shù)據(jù),這里我們體驗了fs里面強大的功能

在這里我們放了文章的一些必須點,如文章內(nèi)容、標題等,通過隨機拿取數(shù)據(jù)生成一個文章

這里我們通過

import { fileURLToPath } from "url";
import { dirname,resolve } from "path";

去操控獲取絕對路徑

const url = import.meta.url;// 獲取當前文件的絕對路徑 
console.log(url);
console.log(fileURLToPath(url));
console.log(dirname(fileURLToPath(url)));
// 獲取文件的絕對路徑
const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json"); console.log(path);
  • const url = import.meta.url; :使用了import.meta 對象來獲取當前模塊文件的絕對 URL 路徑,并將其賦值給變量 url 。
  • console.log(fileURLToPath(url)); :將url路徑轉(zhuǎn)換為文件系統(tǒng)路徑
  • console.log(dirname(fileURLToPath(url))); :將url轉(zhuǎn)換為文件系統(tǒng)路徑,然后通過 dirname 函數(shù)獲取該路徑的目錄部分
  • const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json"); :將前面獲取到的目錄部分和相對路徑 "./cuepus/data.json" 進行組合,生成一個完整的文件絕對路徑,并將其賦值給變量 path 。

接下來我們代碼就可以寫成以下的形式

import fs from "fs";
import { fileURLToPath } from "url";
import { dirname,resolve } from "path";

const url = import.meta.url;// 獲取當前文件的絕對路徑
// 獲取文件的絕對路徑
const path = resolve(dirname(fileURLToPath(url)), "./cuepus/data.json");
const data = fs.readFileSync(path, "utf-8", (err, data) => {
  if (!err) {
    // console.log(data);
  } else {
    console.log(err);
  }
});

console.log(JSON.parse(data));

接下來我們寫封裝兩個函數(shù)

random.js

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
}

首先,定義了一個名為 randomInt 的導出函數(shù),它接受兩個參數(shù) min 和 max ,用于生成指定范圍內(nèi)的隨機整數(shù)。

然后,定義了一個名為 createRandomPicker 的導出函數(shù),它接受一個數(shù)組 arr 作為參數(shù)。

在函數(shù)內(nèi)部,先對傳入的數(shù)組進行了復制,以避免修改原始數(shù)組。

接著,定義了一個內(nèi)部函數(shù) randomPick ,它的功能是:

  • 計算數(shù)組的有效長度。
  • 生成一個在有效范圍內(nèi)的隨機索引。
  • 通過交換將隨機索引處的元素與最后一個元素交換位置。
  • 返回交換后的隨機索引處的元素。

在函數(shù)體中,首先調(diào)用了一次 randomPick 函數(shù),但放棄了這次的結果。

最后,返回 randomPick 函數(shù),以便外部可以調(diào)用它來獲取隨機抽取的數(shù)組元素。

generator.js

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 }) {
  const articleLenth = randomInt(min, max)
  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) {
        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
}

從 './random.js' 模塊導入了 randomInt 和 createRandomPicker 兩個函數(shù)。

然后,定義了 sentence 函數(shù),它接受兩個參數(shù) pick 和 replacer 。

pick 函數(shù)用于獲取一個句子,然后通過遍歷 replacer 對象中的鍵,使用正則表達式匹配并替換句子中特定的模板字符串(形如 {{key}} )。如果對應的值是函數(shù),則調(diào)用函數(shù)獲取結果進行替換,否則直接使用值進行替換。

接下來,定義了 generate 函數(shù),它接受三個參數(shù):title 、一個包含配置信息的對象(包含 corpus 以及可選的 min 和 max )。

在函數(shù)內(nèi)部:

  • 通過 randomInt 生成一個在 min 和 max 范圍內(nèi)的文章長度 articleLenth 。
  • 從 corpus 對象中解構出幾個部分,并對每個部分使用 createRandomPicker 函數(shù)創(chuàng)建隨機選擇器。
  • 通過一個循環(huán)生成文章內(nèi)容,每次循環(huán)生成一個段落。在生成段落的過程中,根據(jù)隨機數(shù)決定使用不同的句子生成方式,并通過 sentence 函數(shù)進行處理和組合。
  • 不斷累加段落的長度,直到總長度達到 articleLenth ,最終將生成的文章段落組成一個數(shù)組返回。

最后調(diào)用即可,修改index.js

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

總結

本文本文將從零開始,講解如何使用Node.js來實現(xiàn)一個文章生成器

希望看到這里的你能夠有所收獲?。。。∽约簞邮謱崿F(xiàn)一個簡易的文章生成器吧

后期可以結合AI去實現(xiàn)更加智能的文章生成器

到此這篇關于使用Node.js實現(xiàn)一個文章生成器的文章就介紹到這了,更多相關Node.js文章生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文帶你了解Node.js中的path模塊

    一文帶你了解Node.js中的path模塊

    Node.js和Python技術類似,?都致力于能夠?qū)崿F(xiàn)跨平臺的通用代碼。?為此,針對路徑的拼接,?Node.js提供了path模塊,本文就來講講path模塊的使用
    2023-03-03
  • Node.js實現(xiàn)簡單管理系統(tǒng)

    Node.js實現(xiàn)簡單管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Node.js實現(xiàn)簡單管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Nodejs搭建多進程Web服務器實現(xiàn)過程

    Nodejs搭建多進程Web服務器實現(xiàn)過程

    這篇文章主要為大家介紹了Nodejs搭建多進程Web服務器實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Node.js 中如何收集和解析命令行參數(shù)

    Node.js 中如何收集和解析命令行參數(shù)

    這篇文章主要介紹了Node.js 中如何收集和解析命令行參數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • nodejs遞歸文件夾獲取所有文件路徑實例

    nodejs遞歸文件夾獲取所有文件路徑實例

    這篇文章主要為大家介紹了nodejs遞歸文件夾獲取所有文件路徑實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • node.js中的http.response.getHeader方法使用說明

    node.js中的http.response.getHeader方法使用說明

    這篇文章主要介紹了node.js中的http.response.getHeader方法使用說明,本文介紹了http.response.getHeader的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解

    Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解

    這篇文章主要為大家介紹了Node.js實現(xiàn)分片上傳斷點續(xù)傳示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • nodejs中密碼加密處理操作詳解

    nodejs中密碼加密處理操作詳解

    這篇文章主要介紹了nodejs中密碼加密處理操作,結合實例形式分析了nodejs針對用戶登陸密碼的加密處理操作相關實現(xiàn)技巧與注意事項,需要的朋友可以參考下
    2018-03-03
  • node.js中的socket.io的廣播消息

    node.js中的socket.io的廣播消息

    這篇文章主要介紹了node.js中的socket.io的廣播消息,需要的朋友可以參考下
    2014-12-12
  • Node.js中代碼重復與不一致的問題及解決方案

    Node.js中代碼重復與不一致的問題及解決方案

    在 Node.js 開發(fā)中,代碼重復和不一致是常見的問題,尤其是在項目規(guī)模擴大和團隊協(xié)作時,這些問題不僅會增加維護成本,還可能導致邏輯錯誤和性能問題,本文將探討這些問題的常見原因,并提供相應的解決方案,需要的朋友可以參考下
    2025-03-03

最新評論

武乡县| 易门县| 韶山市| 筠连县| 舟山市| 昌黎县| 长顺县| 扶风县| 聂拉木县| 高邮市| 葫芦岛市| 手机| 深水埗区| 临夏县| 阳山县| 天台县| 宜州市| 定襄县| 梧州市| 油尖旺区| 禹城市| 文山县| 西峡县| 岫岩| 华蓥市| 香港| 乌什县| 福安市| 儋州市| 兴仁县| 华宁县| 石棉县| 望城县| 桂东县| 永新县| 沅江市| 芦山县| 新余市| 蕲春县| 鄱阳县| 吉木乃县|