@ dasmig/ 个人
完全虚构的人物 来自一个种子的呼叫:姓名,国家,城市,出生日期和年龄,身体,人格,宗教,爱好,最喜欢的媒体和工作. 没错 人为生成者 (C++23) 编译到WebAssembly,与 lite 它所构建的8个库的数据,所以运行时没有获取到任何数据,而是模块本身的 persona.wasm。 。 。 .
输出是虚构的样本数据,而不是真实人物的描述或预测.
import { createPersonaGenerator } from '@dasmig/persona';
createPersonaGenerator().then(personas => {
const p = personas.generate({ country: 'BR', sex: 'female', ages: { min: 25, max: 40 } });
console.log(p.name, p.age, p.city.name, p.occupation.job?.label);
// The same seed, request and data give the same persona, on every platform.
const again = personas.generate({ country: 'BR', sex: 'female', ages: { min: 25, max: 40 }, seed: p.signature.seed });
});
安装
npm install @dasmig/persona
该套件仅是ES模块(没有通用JS构建),用于浏览器,Web Workers和Node 20+.
它自行运送了TypeScript类型(index.d.ts)和WebAssembly模块(Apersona.wasm,大约8 MB,在3 MB 下压缩),例如Vite、webpack和esbuild等捆绑机从中取出 new URL('persona.wasm', import.meta.url); 通过 locateFile 或者说 wasmBinary 改为 createPersonaGenerator() 以其他方式装入。 它没有依赖关系.
正在装入
createPersonaGenerator() 即时化模块并加载所有八个库的数据。 这需要 秒或两秒 (大约1.4 s在桌面上,更多在电话上)并屏蔽它运行的线程,一个生成器使用大约90 MB的内存. 所以说:
- 创建一个生成器并重用它 . 每人大约需要一毫秒的三分之一.
- 在浏览器中, 在 Web Worker 中创建它 因此,页面保持响应, 并张贴个人(Plain JSON)回来:
// persona-worker.js, started with new Worker(new URL('./persona-worker.js', import.meta.url), { type: 'module' })
import { createPersonaGenerator } from '@dasmig/persona';
const ready = createPersonaGenerator();
onmessage = async ({ data: request }) => {
const personas = await ready;
try {
postMessage({ persona: personas.generate(request) });
} catch (error) {
postMessage({ error: error.message });
}
};
模块在一个浏览器中找到 persona.wasm 下边(new URL('persona.wasm', import.meta.url)) (中文(简体) ). Vite和Webpack 5遵循这一点,将文件作为资产放出;Webpack警告说,它超过了建议的资产规模,这是预期的. 要从别处提供文件,请通过 Emscripten's locateFile,或以 wasmBinary数字 :
const personas = await createPersonaGenerator({ locateFile: file => '/assets/' + file });
在节点,包 node 导出为 persona.wasm 从磁盘.
persona.wasm 是8.3 MB,大部分数据(城市和名称列表): 2.8 MB为gzip, 2.2 MB为brotli. 把它压缩.
请求
每个领域都是可选的。 所遗漏的东西是抽取的;所给的条件是赖以抽取的。 由国家定出城市,取名文化,身体和工作;由年龄和性别定出其余的.
| 外地 | 类型 | 默认 |
|---|---|---|
country | ISO 3166-1 α-2 代码来自 personas.countries (79个国家),任何案件 | 一个 personas.countries按人口加权 |
sex | 'male' 或者说 'female' | 与生俱来 |
ages | { min, max },完成年份,0-120 | 国家时代金字塔 |
traits | 个性特征数, 0 到 personas.maxTraits | 3个 |
referenceDate | 'YYYY-MM-DD' 或一个 Date (当地日期),1900-2100 | '2023-07-01' |
relations | true,或 { up, down, siblings, partners, names, stepparents, home }: 也把人的家人引入 relatives | 无 |
identity | true 国家编号,或 { documents: ['passport', 'id_card'] } 添加文档 | 无 |
finance | true 用于一个活期账户,或 { accounts, cards, cardNumbers, network }:机会,由该国全球指数股份 | 无 |
safe | true 用图书馆的安全方法制作数字、文档、账户和卡片 | false |
home | true,或 { type, tenure, area } 强迫他们:还引出人格的家 home 及其家庭收入 household_income | 无 |
seed | A 类 bigint,非负式安全整数,或 十六进制 字符串 | 随机 |
- 国家. 只有国家
personas.countries在所有八个库中都有数据,所以另一个代码是一个错误而不是一个名字来自错误文化的人. - 特质. 当没有其他特性与已经选择的特性相容时,返回的特性比要求的少(一组中的两块相互排斥).
- 证件和钱包. 数字、账户和卡片是测试数据。 无
safe它们结构上是有效的,可能与真实的人相符:永远不要使用它们来识别任何人,开户,通过支票,或者在现场支付系统上. 见 限制。 。 。 . - 诸眷属.
relations: true添加relatives:人的父母、兄弟姐妹、同父异母的兄弟姐妹、伴侣和儿童(up: 2加上祖父母,down: 2孙子们),每个都有名字,出生日期,而对于死者来说,有死亡日期,由"活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活edges。 。 。 .members[0]就是那个人.stepparents: true增加父母的新伴侣( )stepfather, (中文(简体) ),stepmother,带有step_parent_of子女,父母与子女(同父异母)和他们自己的子女stepsibling和home: true添加household和这个人住在一起 两者都是默认关闭的. 家族有自有的种子溪流,所以其余的人物a与所生的和所生的相同. - 归.
home: true添加home(财产继承人的住房类型、使用权、房间、面积、建造年份和monthly_cost和household_income家里每个人都能赚多少 与relations家适合我们家household家是开着的;没有家,家是单独吸引的.monthly_cost财务报告和审定财务报表household_income为:null当家里没人挣钱的时候. - 约会. 发电机从不读钟 过
referenceDate: new Date()从今天开始,如果人必须重播,则保留与种子的日期. - 种子来. 种子为64位无符号整数. 字符串读取为十六进制,可选择在
0x,这是形式signature.seed数字 :seed: '42'是 0x42(66),而不是42。 使用一个bigint以上种子的十六进制字符串Number.MAX_SAFE_INTEGER。 。 。 .
生成任何内容前的无效请求: a TypeError 对于错误类型或未知字段(错误的字段) contry 是一个错误,而不是一个随机的国家)和 RangeError 用于超出范围的值。 信息说哪个领域和为什么。 一个失败的呼叫让生成器可用 .
结果
generate() 返回 a Persona (见 index.d.ts) (中文(简体) ). 它已经 name, (中文(简体) ), sex, (中文(简体) ), age, (中文(简体) ), admin1 (州或省)和 signature,而每个图书馆自己的结果在 country, (中文(简体) ), city, (中文(简体) ), birth, (中文(简体) ), biodata, (中文(简体) ), personality, (中文(简体) ), interest 财务报告和审定财务报表 occupation。 。 。 . generateJson() 返回与 JSON 文本相同的文本,与 C++ 库所写的文本完全相同.
每个部分都取自自己的随机流,从人物的种子中分出. 强迫一种选择不会转移不相干的部分:与另一种性别的同种保持了城市和个性.
电池
对于测试数据和种群,从一批种子中生成许多人:
// 10,000 personas, as objects or as JSON Lines (one persona per line).
const people = personas.generateBatch({ request: { country: 'BR' }, count: 10000, seed: 42 });
const lines = personas.generateBatchJsonl({ request: { country: 'BR' }, count: 10000, seed: 42 });
// The same personas, split across workers (Web Workers in a browser, worker threads in Node).
import { createPersonaPool } from '@dasmig/persona';
const pool = await createPersonaPool({ workers: 4 });
const same = await pool.generateBatchJsonl({ request: { country: 'BR' }, count: 10000, seed: 42 });
pool.close();
- 个人a
i一组 没错generate({ ...request, seed })分批出产的种子i(单位:千美元)core::item_seed在 C++ 库中。 因此,任何一个人从自己的signature.seed,可以单独生成一个范围(first: 1000起始于 persona 1000),相继相继相继相继的两批相继而相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相继相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相. - 选项.
request(以上字段除外)seed, (中文(简体) ),count(0至2^31-1), (中文(简体) ),seed(一个如果被忽略的随机的,使批次无法重复)和first(默认为0). - 速为. 在节点24的一台发电机上,大约每秒14000人,20,000人,有2个和38,000个池子,有4个池子,一旦池子开始(约半秒). JSON 线条格式跳过构建对象.
- 记忆. 每个工人都加载自己的模块,大约60 MB,一个池子默认核数,最多4个. 游泳池需要没有
SharedArrayBuffer,所以它在任意一页都起作用:片段作为字符串行走. - 在浏览器中, 池启动模块 Web Works from
pool-worker.mjs; 后面的捆绑器new URL(..., import.meta.url)捡起.
重放人物为
要在以后(例如,从保存的游戏中)重现一个人,则存储其 signature.seed 和它提出的要求,包括: referenceDate。 。 。 .
同样的种子和请求给予相同的人a 只有相同数据。 。 。 . personas.dataHash 查明所有八个图书馆的数据, personas.identityDataHash id -生成者, personas.financeDataHash 金融创造者, personas.propertyDataHash 财务报告和审定财务报表 personas.relationshipDataHash 两个家庭加,和 personas.versions 列出模块创建的库版本。 存储 dataHash 与种子相伴:如果一个软件包更新更改了它,被保存的种子会给出不同的人称.
一个人的每个部分a 还有一个 signature,拥有自己的种子和库中的数据散列.
数据
这些数据来自开放式数据集(地名、mledoze/countries、联合国世界人口前景、NCD-RisC、CIA世界概况介绍、劳工组织统计数据库等)以及为图书馆编写的目录. DATA_LICENSES.txt 列出每个来源及其许可证。 名字来自 名称数据集; 参见名称生成器的 数据说明 因为它的来源.
每个图书馆自行记录其数据限制 doc/data.md。 。 。 .
版本数
软件包版本是自己的. personas.versions 列出个人生成器的释放和库的释放 persona-generator: 'v3.0.0'),每个软件包的放行都标记 package-v<version> 输入 仓库,带有其注释中包含的图书馆版本. 同种种子只为同类库版本提供同人称,因此更改输出的库更新是包的主要版本.
资料来源: 遗传/包装问题: github.com/dasmig/人-生成人/问题。 。 。 .
许可证
代码的麻省理工学院;见 DATA_LICENSES.txt 数据.