如何在java中实现一包单词
基本上,我需要一个双连接的映射,它可以从键和逆键中检索值,我已经检查过了,但是也应该根据值进行排序,并且应该为单个键取多个值。我不能保证不同键没有精确的频率。 那么,是否存在符合该标准的结构 下面是造成这种需求的具体问题,也许我在实施时遗漏了一些东西,但如果您知道上述问题的答案,那么您可能可以跳过它: 我想为一些特性实现一个单词包方法。其想法是只保留发生频率最高的前k个垃圾箱 为了让它更具体,让我们假设我有一个代码本 双[10000][d]码本和一组功能双[]功能。对于表示一个特征的特征中的每一行,我检查代码本中每一行的距离,并将其分配给具有该行质心的箱子。 然后我将这个容器的索引增加1,直到所有的特性都被使用。 然后,我想只保留前k个箱子作为结果 我有点卡住的部分是只保留top-k垃圾箱的部分。我使用BoundedPriorityQueue集合来实现,但我不确定是否有更简单的方法如何在java中实现一包单词,java,sorting,map,Java,Sorting,Map,基本上,我需要一个双连接的映射,它可以从键和逆键中检索值,我已经检查过了,但是也应该根据值进行排序,并且应该为单个键取多个值。我不能保证不同键没有精确的频率。 那么,是否存在符合该标准的结构 下面是造成这种需求的具体问题,也许我在实施时遗漏了一些东西,但如果您知道上述问题的答案,那么您可能可以跳过它: 我想为一些特性实现一个单词包方法。其想法是只保留发生频率最高的前k个垃圾箱 为了让它更具体,让我们假设我有一个代码本 双[10000][d]码本和一组功能双[]功能。对于表示一个特征的特征中的每一
public static BoundedPriorityQueue<Feature> boWquantizerLargerK(double[][] codebook, double[][] features, int featureLength, int maxNumWords) {
HashMap<Integer, Integer> boWMap = new HashMap<Integer, Integer>();
BoundedPriorityQueue<Feature> nn = new BoundedPriorityQueue<Feature>(new Feature(), maxNumWords);
for(int i = 0; i < features.length; i++) {
double[] distCodebook = new double[codebook.length];
for(int j = 0; j < codebook.length; j++) {
double[] dist = new double[featureLength];
for(int k = 0; k < featureLength; k++)
dist[k] = (codebook[j][k] - features[i][k])*(codebook[j][k] - features[i][k]);
distCodebook[j] = MathUtils.sum(dist);
}
Integer index = MathUtils.indexOfMin(distCodebook) + 1;
Integer freq;
if((freq = boWMap.get(index)) == null) {
boWMap.put(index, 1);
nn.offer(new Feature(1, index));
}
else {
boWMap.put(index, ++freq);
nn.offer(new Feature(freq, index));
}
}
return nn;
}
为了总结这个问题,我有一个集合,它的成员有两个值对,第一个表示bin,第二个表示frequency。此集合将一直更新,直到所有功能都已处理完毕,此时我只想保留具有最大值的箱子。
我对集合使用HashMap结构,对前k个垃圾箱使用BoundedPriorityQueue。仅谷歌java包,就有很多这样的实现,甚至还有其他的。@Polywhill先生,谢谢,我会检查它。
public class Feature implements Comparator<Feature> {
private Integer freq;
private Integer word;
public Feature() {}
public Feature(Integer freq, Integer word) {
this.freq = freq;
this.word = word;}
public int compare(Feature o1, Feature o2) {
if ((o1).getFrequency() > (o2).getFrequency())
return -1;
else if ((o1).getFrequency() < (o2).getFrequency())
return 1;
else
return 0;}
public double getFrequency() {
return freq;}
}