助けて!TextRankアルゴリズムキーワードキー文抽出時、反復投票部分コードの解析HashMap理解を求める

10557 ワード



TextRankアルゴリズムを用いて主題語と主題文を抽出する場合,過程には語間と文間で互いに投票する過程がある.大神に助けを求めてこの部分のコードの意味を解析します.明日の答弁が必要だ!2つの投票過程はいずれもMap,HashMapに関連しており,この2つの図の運用も理解しにくい難点である.会の大神に助けを求めます.次の最初のキー反復投票のコードを抽出します.
private void solve()
    {
        int cnt = 0;
        for (List sentence : docs)
        {
            double[] scores = bm25.simAll(sentence);
//            System.out.println(Arrays.toString(scores));
            weight[cnt] = scores;
            weight_sum[cnt] = sum(scores) - scores[cnt]; //     ,          
            vertex[cnt] = 1.0;
            ++cnt;
        }
        for (int _ = 0; _ < max_iter; ++_)
        {
            double[] m = new double[D];// m       D    
            double max_diff = 0;
            for (int i = 0; i < D; ++i)
            {
                m[i] = 1 - d;
                for (int j = 0; j < D; ++j)
                {
                    if (j == i || weight_sum[j] == 0) continue;
                    m[i] += (d * weight[j][i] / weight_sum[j] * vertex[j]);
                }
                double diff = Math.abs(m[i] - vertex[i]);
                if (diff > max_diff)
                {
                    max_diff = diff;
                }
            }
            vertex = m;
            if (max_diff <= min_diff) break;
        }
        //        
        for (int i = 0; i < D; ++i)
        {
            top.put(vertex[i], i);
        }
    }

2つ目はキーワードを抽出することです.
 Map, Float> score = new HashMap, Float>();
    for (int i = 0; i < max_iter; ++i)
    {
        Map, Float> m = new HashMap, Float>();
        float max_diff = 0;
        for (Map.Entry, Set> entry : words.entrySet())
        {
            String key = entry.getKey();
            Set value = entry.getValue();
            m.put(key, 1 - d);
            for (String element : value)
            {
                int size = words.get(element).size();
                if (key.equals(element) || size == 0) continue;
                m.put(key, m.get(key) + d / size * (score.get(element) == null ? 0 : score.get(element)));
            }
            max_diff = Math.max(max_diff, Math.abs(m.get(key) - (score.get(key) == null ? 0 : score.get(key))));
        }
        score = m;
        if (max_diff <= min_diff) break;
    }

    return score;
}