- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个trie数据结构,它存储一系列英语单词。
例如,给定这些单词,字典是这样的:
aa abc aids aimed ami amo b browne brownfield brownie browser brut
butcher casa cash cicca ciccio cicelies cicero cigar ciste conv cony
crumply diarca diarchial dort eserine excursus foul gawkishly he
insomniac mehuman occluding poverty pseud rumina skip slagging
socklessness unensured waspily yes yoga z zoo
TrieNode
的一部分,表示单个节点:
class TrieNode {
public char content;
public boolean isEnd;
public double count;
public LinkedList<TrieNode> childList;
public String path = "";
public double entropyNextChar;
public int level;
...
}
Trie
的一部分,其中包含一些操作trie数据结构的方法:
public class Trie {
...
private double totWords = 0;
public double totChar = 0;
public double[] levelArray; //in each i position of the array there is the entropy of level i
public ArrayList<ArrayList<Double>> level; //contains a list of entropies for each level
private TrieNode root;
public Trie(String filenameIn, String filenameOut) {
root = new TrieNode('*'); //blank for root
getRoot().level = 0;
totWords = 0;
}
public double getTotWords() {
return totWords;
}
/**
* Function to insert word, setta per ogni nodo il path e il livello.
*/
public void insert(String word) {
if(search(word) == true) {
return;
}
int lev = 0;
totChar += word.length();
TrieNode current = root;
current.level = getRoot().level;
for(char ch : word.toCharArray()) {
TrieNode child = current.subNode(ch);
if(child != null) {
child.level = current.level + 1;
current = child;
}
else {
current.childList.add(new TrieNode(ch, current.path, current.level + 1));
current = current.subNode(ch);
}
current.count++;
}
totWords++;
getRoot().count = totWords;
current.isEnd = true;
}
/**
* Function to search for word.
*/
public boolean search(String word) {
...
}
/**
* Set the entropy of each node.
*/
public void entropyNextChar(TrieNode node) {
for(TrieNode childToCalculate : node.childList) {
int numberChildren = node.childList.size();
int i = 0;
double entropy = 0.0;
if(numberChildren > 0) {
double[] p = new double[numberChildren];
for(TrieNode child : node.childList) {
p[i] = child.count / node.count;
i++;
}
for(int j = 0; j < p.length; j++) {
entropy -= p[j] * log2(p[j]);
}
node.entropyNextChar = entropy;
entropyNextChar(childToCalculate);
}
}
}
/**
* Return the number of levels (root has lev = 0).
*/
public int getLevels(TrieNode node) {
int lev = 0;
if(node != null) {
TrieNode current = node;
for(TrieNode child : node.childList) {
lev = Math.max(lev, 1 + getLevels(child));
}
}
return lev;
}
public static double log2(double n) {
return (Math.log(n) / Math.log(2));
}
...
}
level
和
levelArray
)。
levelArray
是包含结果的双精度数组,即在索引
i
中存在
i
级别的熵。
level
是arraylist的arraylist。每个列表包含每个节点的加权熵。
public void entropyEachLevel() {
int num_levels = getLevels(getRoot());
levelArray = new double[num_levels + 1];
level = new ArrayList<ArrayList<Double>>(num_levels + 1);
for(int i = 0; i < num_levels + 1; i++) {
level.add(new ArrayList<Double>());
levelArray[i] = 0; //inizializzo l'array
}
entropyNextChar(getRoot());
fillListArray(getRoot(), level);
for(int i = 1; i < levelArray.length; i++) {
for(Double el : level.get(i)) {
levelArray[i] += el;
}
}
}
public void fillListArray(TrieNode node, ArrayList<ArrayList<Double>> level) {
for(TrieNode child : node.childList) {
double val = child.entropyNextChar * (node.count / totWords);
level.get(child.level).add(val);
fillListArray(child, level);
}
}
[lev 1] 10.355154029112995
[lev 2] 0.6557748405420764
[lev 3] 0.2127659574468085
[lev 4] 0.23925771271992619
[lev 5] 0.17744361708265158
[lev 6] 0.0
[lev 7] 0.0
[lev 8] 0.0
[lev 9] 0.0
[lev 10] 0.0
[lev 11] 0.0
[lev 12] 0.0
levelArray
中的值。
11.64
。
[lev 1] 65.30073504641602
[lev 2] 44.49825655981045
[lev 3] 37.812193162250765
[lev 4] 18.24599038562219
[lev 5] 7.943507700803994
[lev 6] 4.076715421729149
[lev 7] 1.5934893456776191
[lev 8] 0.7510203704630074
[lev 9] 0.33204345165280974
[lev 10] 0.18290941591943546
[lev 11] 0.10260282173581108
[lev 12] 0.056284946780556455
[lev 13] 0.030038717136269627
[lev 14] 0.014766733727532396
[lev 15] 0.007198162552512713
[lev 16] 0.003420610593927708
[lev 17] 0.0013019239303215001
[lev 18] 5.352246905990619E-4
[lev 19] 2.1483959981088307E-4
[lev 20] 8.270156797847352E-5
[lev 21] 7.327868866691726E-5
[lev 22] 2.848394217759738E-6
[lev 23] 6.6648152186416716E-6
[lev 24] 0.0
[lev 25] 8.545182653279214E-6
[lev 26] 0.0
[lev 27] 0.0
[lev 28] 0.0
[lev 29] 0.0
[lev 30] 0.0
[lev 31] 0.0
aaaab
和
abcd
,我有:
*
的计数器是2,因为该节点传递两个单词。
a
也是如此。
public void entropyNextChar(TrieNode node) {
for(TrieNode childToCalculate : node.childList) {
int numberChildren = node.childList.size();
int i = 0;
double entropy = 0.0;
if(numberChildren > 1) {
double[] p = new double[numberChildren];
for(TrieNode child : node.childList) {
p[i] = child.count / node.count;
i++;
}
for(int j = 0; j < p.length; j++) {
entropy -= p[j] * log2(p[j]);
}
node.entropyNextChar = entropy;
entropyNextChar(childToCalculate);
}
else {
node.entropyNextChar = entropy;
entropyNextChar(childToCalculate);
}
}
}
entropyNextChar
。
最佳答案
我不太清楚你想得到什么样的熵(单词?,字符?,trie节点?),所以我假设你的意思是词的熵,你提到的字典可以包含重复的词。
如果你想计算trie中单词的熵和它的水平,你的概率函数在我看来是不对的。请考虑entryNextChar函数:
public void entropyNextChar(TrieNode node) {
for(TrieNode childToCalculate : node.childList) {
int numberChildren = node.childList.size();
int i = 0;
double entropy = 0.0;
if(numberChildren > 0) {
double[] p = new double[numberChildren];
for(TrieNode child : node.childList) {
p[i] = child.count / node.count;
i++;
}
for(int j = 0; j < p.length; j++) {
entropy -= p[j] * log2(p[j]);
}
node.entropyNextChar = entropy;
entropyNextChar(childToCalculate);
}
}
}
p[i] = child.count / node.count;
p[i] = child.count / totWords; // make sure totWords is not 0
关于java - 英语词典的熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408438/
我正在尝试这样做: var myBeacons: [NSUUID: [Int]] = [NSUUID(UUIDString:"74278BDA-B644-4520-8F0C-720EAF059935"
我的字典有问题。如果我将一个对象添加到字典中,它会用添加的项目覆盖整个包含项目。 添加所有元素后,Dictionary 包含正确数量的项目,但项目都是最后添加的项目。 For Each shp In
我使用字典,我将有大约一百万个条目,我将定期添加、删除、编辑和轮询..我想知道所有条目的上/下边是什么,如果有一种更高效的方式。 最佳答案 这取决于你想做什么。如果您想要一个具有快速插入、查找和删除功
我在 Swift 类中的字典数组方面遇到问题。我的代码无法在类或结构中运行,但可以在外部运行。 var data = [Dictionary]() data.append([123: "test"])
有没有一种方法可以添加注释来记录 Dictionary 或 ConcurrentDictionary 以了解键/值的含义? 例如: Dictionary _users; 这个例子有一个用户字典。 gu
我正在基于 Android AOSP LatinIME 项目创建自己的输入法应用。我设法找到了一些用于自动更正和预测的字典文件(main_en.dict、main_fr.dict 等)。 但对于许多其
我已经通过 Locale::Maketext 使我的网站支持多种语言(或更具体地说是 CatalystX::I18N::Model::Maketext )。 我的 maketext 类在编译时通过从数
我不会说英语,而且我的英语也不是很好。我自以为是。我没有和其他人一起在一个共同的代码库上工作过。我没有任何编程的 friend 。我不与其他程序员一起工作(至少没有人关心这些事情)。 我想这可能解释了
我需要做 currentKey+1。所以我想找到键值的索引并获取下一个键(如果在末尾则为第一个)。我如何找到 key 的当前索引? 我正在使用 Dictionary我用 Linq 查找 .Find 或
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我使用 python 2.7 中的 shelve 模块保存了一个数据文件,该文件不知何故已损坏。我可以用 db = shelve.open('file.db') 加载它,但是当我调用 len(db)
我想试试这个抽认卡的想法,为即将到来的测试尝试学习关键字及其含义。我想在 python 上创建一个字典,我可以用它来帮助解决这个问题。这个想法是向我显示定义,然后我必须猜测已定义的词。我在下面展示了如
当尝试 .format() 一次列表中的多个词典时,控制台会给我一个 AttributeError:'list' object has no attribute 'items'。 我尝试滚动浏览提示的
我在公共(public)类(class)中有一个公共(public)词典如下: namespace ApiAssembly { public static class TypeStore
我需要做 currentKey+1。所以我想找到键值的索引并获取下一个键(如果在末尾则为第一个)。我如何找到 key 的当前索引? 我正在使用 Dictionary我用 Linq 查找 .Find 或
我的字典总是零,想了解为什么会这样。我的代码: var dic = [NSDate : MCACalendar]?() dic?[currentDate!] = calendar 最佳答案 @Kirs
给定(简化描述) 我们的一项服务在内存中有很多实例。大约 85% 是独一无二的。我们需要对这些项目进行非常快速的基于键的访问,因为它们在单个堆栈/调用中被非常频繁查询。这个单一上下文的性能得到了极大的
我想为“Sinhala Language speech recognition”僧伽罗语建立新的声学模型、新词典、新语言模型字符是基于 Unicode 的。例如 A=අ,I=ඉ,U=උ,KA=ක,BA
我需要一个带有 的正面和负面词的列表重量 根据单词的强度和周数分配单词。我有 : 1.) WordNet - 它为每个单词提供 + 或 - 分数。 2.) SentiWordNet - 在 [0,1]
我有一个 Jinja2 字典,我想要一个可以修改它的表达式 - 通过更改其内容或与另一个字典合并。 >>> import jinja2 >>> e = jinja2.Environment() 修改字
我是一名优秀的程序员,十分优秀!