java - 如何在 Java 中正确使用 Apache 公共数学库中的 ZipfDistribution?
问题描述
我想根据遵循 Zipf 分布的单词(来自字典)创建一个数据源(用 Java 编写)。所以我来到了Apache commons库的ZipfDistribution和NormalDistribution。不幸的是,关于如何使用这些类的信息很少。我试图做一些测试,但我不确定我是否以正确的方式使用它。我只关注每个构造函数的文档中所写的内容。但结果似乎并不“分布均匀”。
import org.apache.commons.math3.distribution.NormalDistribution;
import org.apache.commons.math3.distribution.ZipfDistribution;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
public class ZipfDistributionDataSource extends RichSourceFunction<String> {
private static final String DISTINCT_WORDS_URL = "https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt";
public static void main(String[] args) throws Exception {
ZipfDistributionDataSource zipfDistributionDataSource = new ZipfDistributionDataSource();
StringBuffer stringBuffer = new StringBuffer(zipfDistributionDataSource.readDataFromResource());
String[] words = stringBuffer.toString().split("\n");
System.out.println("size: " + words.length);
System.out.println("Normal Distribution");
NormalDistribution normalDistribution = new NormalDistribution(words.length / 2, 1);
for (int i = 0; i < 10; i++) {
int sample = (int) normalDistribution.sample();
System.out.print("sample[" + sample + "]: ");
System.out.println(words[sample]);
}
System.out.println();
System.out.println("Zipf Distribution");
ZipfDistribution zipfDistribution = new ZipfDistribution(words.length - 1, 1);
for (int i = 0; i < 10; i++) {
int sample = zipfDistribution.sample();
System.out.print("sample[" + sample + "]: ");
System.out.println(words[sample]);
}
}
private String readDataFromResource() throws Exception {
URL url = new URL(DISTINCT_WORDS_URL);
InputStream in = url.openStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
StringBuilder builder = new StringBuilder();
String line;
try {
while ((line = bufferedReader.readLine()) != null) {
builder.append(line + "\n");
}
bufferedReader.close();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return builder.toString();
}
}
输出
size: 370103
Normal Distribution
sample[185049]: metathesize
sample[185052]: metathetically
sample[185051]: metathetical
sample[185050]: metathetic
sample[185049]: metathesize
sample[185050]: metathetic
sample[185052]: metathetically
sample[185050]: metathetic
sample[185052]: metathetically
sample[185050]: metathetic
Zipf Distribution
sample[11891]: anaphasic
sample[314]: abegge
sample[92]: abandoner
sample[3]: aah
sample[36131]: blepharosynechia
sample[218]: abbozzo
sample[8]: aalii
sample[5382]: affing
sample[6394]: agoraphobia
sample[4360]: adossed
解决方案
从代码的角度来看,您可以很好地使用它:) 问题在于假设源材料是由 Zipf 排序的,而它显然是按字母顺序排列的。使用的重点ZipfDistribution
是 words[0] 必须是最常见的词(提示:它是'the')并且大约是 words[1] 频率的两倍)等。
https://en.wikipedia.org/wiki/Word_lists_by_frequency https://en.wikipedia.org/wiki/Most_common_words_in_English
推荐阅读
- ethereum - 可重复使用的智能合约
- python - 我想以矩阵形式将一串原始数据转换为整数数组
- node.js - Heroku - SSL 关闭错误 - 在之前完美运行之后
- php - xampp文件无法在macos bigsur中解压
- python - 在 Heroku 上部署 Django 应用程序时出现 uWSGI 错误
- c++ - 编译器在哪里遇到以下程序中的浮点数?核心转储是什么意思?
- python-3.x - 从指纹图像中提取 level-1 和 level-2 特征
- python - 如何使用 fastAPI、Pydantic 和 SQLAlchemy 正确设置一对多双向关系
- c# - 在 asp.net core 中添加身份迁移时出错
- progressive-web-apps - PWA 离线检查 - 类型错误:[start_url] 的网络请求引发错误:无法获取