助けて!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;
}