嘿,我正在研究一个文本生成器,它应该生成数百万种不同的文本.

为了使每个文本的内容变得现实,我使用了Zipf定律

它运作良好,字分布正确.

但是下面的next()函数执行速度非常慢,因为我想生成数百万篇文章,所以必须进行更改. (while循环是缓慢的部分)

有人可以帮我弄这个吗?

我这样实现了:

public int next() {

int rank;

double frequency = 0;

double dice;

rank = rnd.nextInt(size);

frequency = (1.0d / Math.pow(rank, this.skew)) / this.bottom;

dice = rnd.nextDouble();

while (!(dice < frequency) || (rank == 0)) {

rank = rnd.nextInt(size);

frequency = (1.0d / Math.pow(rank, this.skew)) / this.bottom;

dice = rnd.nextDouble();

}

return rank;

}

解决方法:

您复制的实现…有一些问题.人们可能会说这显然是错误的,因为它使用的是随机值,而且在计算时就像

rank = rnd.nextInt(size);

friquency = (1.0d / Math.pow(rank, this.skew)) / this.bottom;

等级值为0,则频率为无穷大,并且会混淆一些统计数据.

我试图纠正这些错误,但没有分析实现,也没有将它与Zipf分配函数的定义进行比较.因此,如果有人复制我的代码,他可能会发现它仍然“……有一些问题”.

严格地说,下一个功能的实现不是“total correct”,因为它不一定终止.没有什么能阻止循环永远运行.根据参数的不同,它可能或多或少地需要一段时间才能终止.而且我认为这也是导致“性能”问题的主要原因之一:对于某些值,条件(骰子和频率)不太可能发生……

无论如何,您想要实现的目标可以更一般地制定:您有一定的概率分布.并且您想要一个“随机”函数,它根据此分布返回随机值.

实现此目的的一种简单而通用的方法是使用NavigableMap将(累积的)概率分布映射到目标值.然后,可以使用此映射快速查找目标值,给定java.util.Random实例提供的介于0.0和1.0之间的随机值.

对于特定情况,可能会有更有效的解决方案,但同样:这是非常通用和简单的(并且仍然合理有效).

我在这里实现了Zipf发行版.同样,我没有详细验证所有内容,并且有一些1 / -1个奇怪(在第一段中提到),但它应该显示出来:FastZipfGenerator填充包含概率分布的地图,并在下一个()函数,只执行查找:

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.NavigableMap;

import java.util.Random;

import java.util.TreeMap;

public class ZipfGeneratorTest

{

public static void main(String[] args) {

int size = 10;

double skew = 2.0;

ZipfGenerator z0 = new ZipfGenerator(size, skew);

FastZipfGenerator z1 = new FastZipfGenerator(size, skew);

long before = 0;

long after = 0;

int n = 5000000;

before = System.nanoTime();

Map counts0 = computeCounts(z0, size, n);

after = System.nanoTime();

System.out.println(counts0+", duration "+(after-before)/1e6);

before = System.nanoTime();

Map counts1 = computeCounts(z1, size, n);

after = System.nanoTime();

System.out.println(counts1+", duration "+(after-before)/1e6);

}

private static Map computeCounts(

ZipfGenerator z, int size, int n)

{

Map counts = new LinkedHashMap();

for (int i=1; i<=size; i++)

{

counts.put(i, 0);

}

for (int i=1; i<=n; i++)

{

int k = z.next();

counts.put(k, counts.get(k)+1);

}

return counts;

}

private static Map computeCounts(

FastZipfGenerator z, int size, int n)

{

Map counts = new LinkedHashMap();

for (int i=1; i<=size; i++)

{

counts.put(i, 0);

}

for (int i=1; i<=n; i++)

{

int k = z.next();

counts.put(k, counts.get(k)+1);

}

return counts;

}

}

// Based on http://diveintodata.org/tag/zipf/

class ZipfGenerator {

private Random rnd = new Random(0);

private int size;

private double skew;

private double bottom = 0;

public ZipfGenerator(int size, double skew) {

this.size = size;

this.skew = skew;

for(int i=1;i <=size; i++) {

this.bottom += (1/Math.pow(i, this.skew));

}

}

// the next() method returns an random rank id.

// The frequency of returned rank ids are follows Zipf distribution.

public int next() {

int rank;

double friquency = 0;

double dice;

rank = rnd.nextInt(size)+1;

friquency = (1.0d / Math.pow(rank, this.skew)) / this.bottom;

dice = rnd.nextDouble();

while(!(dice < friquency)) {

rank = rnd.nextInt(size)+1;

friquency = (1.0d / Math.pow(rank, this.skew)) / this.bottom;

dice = rnd.nextDouble();

}

return rank;

}

// This method returns a probability that the given rank occurs.

public double getProbability(int rank) {

return (1.0d / Math.pow(rank, this.skew)) / this.bottom;

}

}

class FastZipfGenerator

{

private Random random = new Random(0);

private NavigableMap map;

FastZipfGenerator(int size, double skew)

{

map = computeMap(size, skew);

}

private static NavigableMap computeMap(

int size, double skew)

{

NavigableMap map =

new TreeMap();

double div = 0;

for (int i = 1; i <= size; i++)

{

div += (1 / Math.pow(i, skew));

}

double sum = 0;

for(int i=1; i<=size; i++)

{

double p = (1.0d / Math.pow(i, skew)) / div;

sum += p;

map.put(sum, i-1);

}

return map;

}

public int next()

{

double value = random.nextDouble();

return map.ceilingEntry(value).getValue()+1;

}

}

它打印随机样本结果(基本上是“直方图”)和一些定时结果.时间结果是这样的

duration 6221.835052

duration 304.761282

显示它很可能会更快(即使这不应被视为“基准”……)

标签:java,performance,power-law

来源: https://codeday.me/bug/20190824/1712735.html

java生成zipf分布_用于文本生成的Java中的Zipf定律 – 太慢了相关推荐

  1. 利用循环神经网络生成唐诗_PyTorch实现用于文本生成的循环神经网络

    自然语言处理(NLP)有很多有趣的应用,文本生成就是其中一个有趣的应用. 当一个机器学习模型工作在诸如循环神经网络.LSTM-RNN.GRU等序列模型上时,它们可以生成输入文本的下一个序列. PyTo ...

  2. python自动生成鸡汤文_马尔可夫链文本生成的简单应用:不足20行的Python代码生成鸡汤文...

    提到自然语言的生成时,人们通常认为要会使用高级数学来思考先进的AI系统,然而,并不一定要这样.在这篇文章中,我将使用马尔可夫链和一个小的语录数据集来产生新的语录. 马尔可夫链 马尔可夫链是一个只根据先 ...

  3. 今日头条李磊等最新论文:用于文本生成的核化贝叶斯Softmax

    译者 | Raku 出品 | AI科技大本营(ID:rgznai100) 摘要 用于文本生成的神经模型需要在解码阶段具有适当词嵌入的softmax层,大多数现有方法采用每个单词单点嵌入的方式,但是一个 ...

  4. keras bi-lstm_LSTM用于文本生成的应用介绍-使用Keras和启用GPU的Kaggle Kernels

    keras bi-lstm by Megan Risdal 梅根·里斯达尔(Megan Risdal) LSTM用于文本生成的应用介绍-使用Keras和启用GPU的Kaggle Kernels (An ...

  5. transformer xl 用于文本生成

    本文尝试用transformer xl做中文文本续写,基于论文为:<Transformer-XL: Attentive Language Models Beyond a Fixed-Length ...

  6. PyTorch实现用于文本生成的循环神经网络

    作者|DR. VAIBHAV KUMAR 编译|VK 来源|Analytics In Diamag 自然语言处理(NLP)有很多有趣的应用,文本生成就是其中一个有趣的应用. 当一个机器学习模型工作在诸 ...

  7. itext生成pdf间距_使用itext生成pdf

    在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText.通过 在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到 ...

  8. node 生成随机头像_唯一ID生成算法剖析

    引在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识:商品需要唯一标识:消息需要唯一标识:事件需要唯一标识-等等,都需要全局唯一ID,尤其是分布式场景下.唯一ID有哪些特性或者说要求呢 ...

  9. python生成字符画_使用Python生成ASCII字符画

    使用Python生成ASCII字符画 在很多的网站主页中或者程序的注释中会有一些好看的字符注释画.显得很牛逼的样子 例如: 知乎 _____ _____ _____ _____ /\ \ /\ \ / ...

  10. java类中声明log对象_用于Android环境,java环境的log打印,可打印任何类型数据

    LogXixi 用于Android环境,java环境的log打印,可打印任何类型数据,根据android项目环境debug环境自动打开,release环境自动关闭android环境log打印,规范be ...

最新文章

  1. 驱动学习模块最简单示例
  2. Go 语言学习笔记(二):函数
  3. 聊一聊Jmeter的参数化
  4. java安全——数字签名+代码签名
  5. Javascript中char和int的互相转换的代码(转载)
  6. mysql安全性特点_MySQL数据库有哪些特点?为何能得到了广泛应用?
  7. Fragment 和 FragmentActivity的使用(二)
  8. 解决XP IIS(HTTP 500内部服务器错误)
  9. Ubuntu 16.04 源码编译安装PHP7.2.23详细过程
  10. armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别
  11. 计算机病毒相关参考文献,计算机病毒参考文献
  12. 74HC595 的使用
  13. oracle 脚本检查点,oracle nca脚本检查点
  14. 使用jquery validate结合zui作表单验证
  15. 201506051031_《JavaScript权威指南》(p104-143)
  16. UT/UTC/GMT的区别和联系
  17. Apache服务部署静态网站——个人用户主页
  18. 使用计算机来进行翻译是,利用计算机进行中英文翻译的探讨
  19. c++RPG游戏《末日风暴》1.0.8
  20. 履 天泽履 乾上兑下

热门文章

  1. 在线浏览stp(step)文件(一)
  2. 菜鸟的JavaScript自学笔记整理
  3. java实现车牌头像识别_LPR java车牌图像处理 输入一个车牌照片(不是整车的照片) - 下载 - 搜珍网...
  4. Stata:何时使用线性概率模型而非Logit?
  5. TCP粘包分析与处理
  6. Matlab求平均值函数mean
  7. Chrome 自动播放m3u8
  8. 20170330今日头条笔试题
  9. 【NeurIPS 2019】Yoshua Bengio报告:深度学习系统从1代到2代中的基础知识
  10. TwinCAT 3 基础——安装