Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/linonetwo/template-based-generator-template

基于模板的文本生成器的模板,模生模,凤生凤,老鼠的儿子会打洞。本地启动:npm i && npm run dev:demo
https://github.com/linonetwo/template-based-generator-template

generator nlp nlp-library template

Last synced: 5 days ago
JSON representation

基于模板的文本生成器的模板,模生模,凤生凤,老鼠的儿子会打洞。本地启动:npm i && npm run dev:demo

Awesome Lists containing this project

README

        

# Template-Based-Generator-Template

TBGT 是一个基于**模**板的文本**生**成器的**模**板,模生模,凤生凤,老鼠的儿子会打洞。

本模板是一个 Github Template,点击页面顶部按钮区的「Use this template」应用本模板可以得到一个你自己的文本生成器。模板项目地址:[linonetwo/template-based-generator-template](https://github.com/linonetwo/template-based-generator-template)

你也可以在代码里使用 `npm i tbg` 来赋能你自己的应用,使用方法详见 Demo 里的代码。

## 用处

天生我材必有用,模板生成更有用,本项目主要用于支持以下几种场景:

- 整活小作文
- 模板可以指定需要保留原文中的哪些部分,挖空哪些部分,从而达到最大的模因性。
- (神经网络写八股整活小作文受控程度应该很难比模板更好,就算更好,写出来也跟模板写的差不多。)
- 本项目为[巴别塔图书馆](https://github.com/linonetwo/Babel-Library2)而开发

### 模板用法快速教程

最顶部的几段文本使用模板内容的大纲,每一行文本相当于对指定标题的引用(你会发现每一行其实都是后文中的标题),使用中文冒号`:`可以引用二级标题下的三级标题。

可以有多个大纲,生成时将随机抽取一个大纲来生成,然后从引用的标题里随机抽取文本。大纲里的行可以被 `//` 注释掉。

二三级标题里的内容,每一行就是一个随机素材。每一段就是一个随机组,详见后文介绍。

### 如何制作你自己的文本生成器

1. 首先点击「Use this template」按钮自动生成出你自己的文本生成器仓库。
1. 然后打开项目目录里的 `templates` 文件夹,可以看到里面有一些示例的 Markdown 文件。你可以学习一下下面我们专用的 Markdown 写法写出自己的模板 md 文件放置在这个文件夹里,这个 md 文件可以在 Typora、[太记](https://github.com/tiddly-gittly/TiddlyGit-Desktop)、Logseq 等笔记软件里写完后导出来放在这里

然后你的项目应该就会自动部署 Github Pages 自动生成一个自动生成文本的网页啦!别忘了[允许 Github Pages 生成外链](https://docs.github.com/cn/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site)。

## 模板

~~生成器部分类似 [google/zx](https://github.com/google/zx),可以用 js 写模板脚本,预注入类似[共产中文生成器](https://github.com/linonetwo/communism-report-generator/blob/0bfbf70829a02b650fb547933b4939f1ba6d85e3/%E6%8A%A5%E5%91%8A%E7%89%87%E6%AE%B5.ts#L6)里那样的全局函数和模板字符串标签,并通过 JSON 文件来保存同义词列表。~~

生成器的输入是一份 Markdown 文本,不过里面的写法与标准 md 相比有一些限制,详见下方的模板语言设计。总之用 Markdown 可以写出生成用的模板内容,然后在 Demo 页面上点击生成按钮就会自动生成随机文本啦!

生成器还能打包成 npm 包!这样你可以在你自己的项目里使用预打包的模板 ~~,来让自动生成能力赋能你的项目,提供自动生成的抓手,打出自动生成的组合拳~~。

### 标题

标题需要符合 Markdown 规范,在 `#` 后面加一个空格来表示标题。

`# ` 是大标题,作为生成器名字使用,最好和文件名一致,不过不一致也没事,以标题为准。

`## ` 等是二到四级标题,作为管理模板资源的树状结构来使用。例如:

```md
## 做得好的

### 项目 1

在项目发展早期
```

会形成

```json
{
"做得好的": {
"项目 1": ["在项目发展早期"]
}
}
```

这样的树状结构。

你要从中取 `"在项目发展早期"` 这个模板文本,就得用 `做得好的.项目 1` 这种方式,用英文句号 `.` 符号(或者中文冒号 `:`,写出来是 `做得好的:项目 1`)拼接来取到文本。

### 模板文本

#### 首先介绍自然段

文本部分遵守 Markdown 规范,用一次换行隔开的文本行,
在普通的 Markdown 环境里(注意不是我们的模板生成器环境里),像这样只用一次换行隔开的文本,在实际展示时会被拼接到一起,变成同一段:

```md
像这样只用一次换行隔开的文本,
在实际展示时会被拼接到一起。
```

```md
像这样只用一次换行隔开的文本,在实际展示时会被拼接到一起。
```

注意上面的例子指的是普通的 Markdown 环境里,不是我们的模板生成器环境里,这里的介绍只是给没用过 Markdown 的同学看的。↑

下面介绍的才是我们的模板生成器里的 Markdown 用法! ↓

这些只用一次换行隔开的文本,将视为在一个自然段内。一个自然段内的文本会被程序认为是可以随机抽取的文本池,每一行是一句随机素材(最好自带标点符号),在实际生成的时候会从中抽取一行出来用。也就是说一个自然段内的这些文本行,不会同时出现在文中了,是随机抽一行出现在文中。

#### 多个自然段

而用两次换行隔开的文本段落,将各自成为自然段。

每一自然段都将随机抽取出一句内容贡献给文章。自然段之间的顺序在生成时会保持住,这样可以写出比较有顺序上的逻辑性的文案。

### 元信息

```md
像这样在一行文本后可以加上元信息 [[重点,要考的]]
```

用 `[[ ]]` 语法可以加上元信息,其本质上是一个 CSV 表格中的一行。所以可以用英文逗号或中文逗号隔开多个数据列。

### 槽位

```md
像这样在一行文本后可以加上{{随便什么槽位}}信息
```

用 `{{ }}` 语法可以加上模板槽位,在英文花括号中的内容即是模板变量,会在之后被替换为具体的值。

### 大纲

在大标题和第一个二级标题之间,是想实际生成的文本的大纲,可以使用中文冒号来使用树里深层级的内容:

```md
# 360 评估生成器

做得好的:项目 1
做得好的:项目 2

做得好的:项目 2
做得好的:项目 1

## 做得好的

### 项目 1

xxx

### 项目 2

yyy
```

将会在文章中生成 `xxx`。

大纲的每一行,相当于对指定标题的引用。

可以有多个大纲,放在不同自然段内,生成时将随机抽取一个大纲来生成,然后从引用的标题里随机抽取文本。

通过调整大纲,可以快速调整文本生成的顺序,也可以让文本生成暗含一些叙事顺序上的逻辑。

大纲也相当于开关,让你可以控制本次生成中是否要包含某一个标题下的内容。

### 模板示例

下面通过例子介绍一下怎么写模板。

```md
# 360 评估生成器

做得好的:项目·起
做得好的:项目·承
做得好的:项目·转
做得好的:项目·合

## 做得好的

### 项目·起

在项目发展早期,在没有明确安排和收益的情况下,{{这人}}就抱着试试看的心态做了这个项目,
记得有个双月,组内的需求早就已经排满,但是{{这人}}还是接手了这个{{叫啥项目的}}项目,
在刚开始没有{{叫啥项目的}}的时候,{{这人}}洞察到受众的需求一直没有被满足,
有次在讨论{{叫啥项目的}}的时候,{{这人}}主动请缨,
{{叫啥项目的}}一直是个被公认比较棘手的问题,

### 项目·承

{{这人}}在出色完成本职工作的同时,经常能基于个人成长和业务发展来定目标,
面对{{叫啥项目的}}时,{{这人}}对用户体验的追求到极致,

对于团队来说有的人刚接手时间短,基础不够,任务很重。但是我们把要求放在这儿,
当时这个工作是很困难的,{{这人}}克服阻碍,每天到前线,亲自站在用户的角度看问题,

### 项目·转

{{叫啥项目的}}需要解决的问题在业界属于一种老大难的问题,也是衡量能不能出成果的关键指标,
{{这人}}是负责与我们对接的{{叫啥项目的}}的同学,从{{叫啥项目的}}这个项目一开始就展现了十分良好的职业素养,

就像一鸣曾强调的那样:「不要把业务当作领地,要站上一个台阶思考问题,内部竞争的上限是乐于分享、乐于帮助,下限是要公平竞争」,{{这人}}在{{叫啥项目的}}项目上体现地是分明显,
即使在团队内,一开始对{{叫啥项目的}}的前景并不是完全看好的,甚至有同学直言这是一个重复造轮子的项目,但是{{这人}}有自己独到的看法,
在早期双月 OKR 中,这{{叫啥项目的}}一直是未能被很好解决的问题,大家对这个项目并不是完全持乐观的态度,

### 项目·合

一鸣曾提到:「对 HR 来说,在可以穷尽的比重里,找到最好的人才,而不是说在招聘网站上看到一个简历,看起来基本符合我们要求的就招聘。」在{{这人}}的工作中,恰好践行了这一原则。
一鸣曾提到:「我们要找到 Best of Best,人力资源在高标准上还是很有挑战的。既然我们招这个领域的人,我们应该把所有这个领域的人都挑出来,都排列一遍,对比下,找到最优的。」在{{这人}}的工作中,恰好践行了这一原则。

## 做得烂的

。。。略,抄不动了
```

标题不一定要叫 `项目·承` 这些,可以随便取的。你让每一段的标题叫 `生成素材1` `生成素材2` 也可以。

### 模板语言设计

最后来谈一下模板语言的设计思路。

首先本项目希望降低人机之间的摩擦,让人类能快速为自己的生成器书写模板,所以参考了简洁的 Markdown 语法来让非技术人员也能快速做出自己的内容可控的文本生成器。

然后 `{{槽位}}` 语法是模因学上的思路,众所周知,模因分为不易改变的模因位点和不影响模因识别的随意区域,而且模因位点的序顺并不重要。基于这两点我们的模板需要能快速录入作为模因位点的文本片段,并允许标注位点和顺序信息,也就是:

1. 在哪能插入用户输入的参数和随机选取的同义词、插入语等
2. 在哪能把它剪切成更细碎的能来回打乱的片段

但是依然要能描述模因位点之间的潜在关系,不能把完全无关的两句话凑到一起。这在游戏行业就是拖表,而表做到字词粒度的多维潜在关系就成了神经网络,而我们不能做得这么复杂,但是也不能简单到一行或一个自然段,所以只能拍脑子想一个折中的粒度。

1. 用 Markdown 标题表示树状的 JSON 层级,让用户用简单的标记语言写出树状数据
2. 文本部分用一次换行隔开的文本行,每一行是一句随机素材,需要自带标点符号。用两次换行隔开的文本段落,每一段都将随机抽取出一两句内容贡献给文章。

这样能通过树状数据结构保证用户可以精确引用文案之间的相关性,~~在下方的图灵完备的脚本语言里~~在文档最上方的大纲区域里使用这些相关性比较轻松地凑出内容比较可控的文章。

然后文本内可以用`{{变量}}`语法来插入变量,这是模板语言对生成内容的基本控制能力。

## 技术实现方案

### 自然语言分析树

分析树(parse tree),也称具体语法树(concrete syntax tree);[自然语言具体语法树(NLCST)](https://www.npmjs.com/package/nlcst-types)是一个有前途的项目,通过允许自然语言用[统一语法树(UNIST)](https://github.com/syntax-tree/unist)来描述,从而使用 JS 文本处理社区的一系列工具函数来加速文本处理。

本项目依靠自然语言具体语法树的力量,提供领先的社区共建友好的基于模板的文本生成解决方案。

通过对获得的 MDAST 的理解,我们将其内容转换为 NLCST,并在运行时对这棵树的各节点做半随机的增删改查,从而做到自动生成内容。

### 自动多样性

基于模板生成的多样性来自于组件的多样性,我们通过同义词替换来增加组件多样性。

#### 编译期同义词标注

由于分词库、同义词库很大,而替换效果其实不是很明显,如果把词库打包进去 roi 会比较低,所以我们在编译期进行词性标注和同义词标注,用类似 sourcemap 的方式把这些信息带在模板里打包进来。

### 软连接

为了方便加 Markdown 文件,我 `ln -s src/data/templates templates`。并且为了在网站上显示 Readme,我也 `ln -s README.md src/data/templates` 。