如何在java中实现一个词袋

时间:2014-10-21 11:35:15

标签: java sorting map

基本上,我需要一个双连接的Map,它可以从key和inverse中检索值,我已经检查了这个link,但是也应该根据值进行排序AND应该为单个值取多个值key(我无法保证不同的密钥不会有精确的freq)。 那么有没有那个标准的结构呢?

以下是强加这种需求的具体问题(也许我在实施时遇到了一些问题,但如果你知道上述问题的答案,那么你可以跳过它):

我想为某些功能实现一个词袋方法。我们的想法是只保留发生频率最高的k个顶部。

为了使它更具体,让我说我有一个码本 double[10000][d] codebook和一组功能double[][] features。对于代表特征的features中的每一行,我检查codebook中每行的距离,并将其分配给具有该行的质心的bin。 然后我将此bin的索引递增1,直到使用了所有功能。 然后,我想只保留最高k个分区作为结果。

我有点卡住的部分是仅保留顶部k箱的部分。我使用BoundedPriorityQueue<Feature>集合来实现,但我不确定是否有一些更简单的方法。

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;
}

Feature类是Comparator的简单实现:

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;}
}

总结一下这个问题,我有一个集合,它有成员对的值,第一个代表bin,第二个代表频率。此集合将更新,直到所有功能都已处理完毕,此时我只想保留具有最大值的bin。 我对集合使用HashMap<Integer, Integer>结构,为BoundedPriorityQueue<Feature>个顶部使用k

0 个答案:

没有答案