Java でベクトル空間モデル アルゴリズムを使用/実装して、キーワードに基づいて 2 人の人物の類似性スコアを取得しようとしています。だから私は次のクラスを持っています:
Person - キーワードのリストがあります。
キーワード - 文字列テキスト。整数スコア。
キーワードスコアは、その人がキーワードに対して行った言及の数です。
Javaでこれを実装する方法について何か提案はありますか?
よろしく
Java でベクトル空間モデル アルゴリズムを使用/実装して、キーワードに基づいて 2 人の人物の類似性スコアを取得しようとしています。だから私は次のクラスを持っています:
Person - キーワードのリストがあります。
キーワード - 文字列テキスト。整数スコア。
キーワードスコアは、その人がキーワードに対して行った言及の数です。
Javaでこれを実装する方法について何か提案はありますか?
よろしく
それは非常に簡単です。
それでは、実際のコード:
static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {
Set<String> both = Sets.newHashSet(v1.keySet());
both.retainAll(v2.keySet());
double sclar = 0, norm1 = 0, norm2 = 0;
for (String k : both) sclar += v1.get(k) * v2.get(k);
for (String k : v1.keySet()) norm1 += v1.get(k) * v1.get(k);
for (String k : v2.keySet()) norm2 += v2.get(k) * v2.get(k);
return sclar / Math.sqrt(norm1 * norm2);
}
上記のサンプルコードにはバグがあると思います。修正したコードは以下です。
static double cosine_similarity(Map<String, Double> v1, Map<String, Double> v2) {
Set<String> both = Sets.newHashSet(v1.keySet());
both.removeAll(v2.keySet());
double sclar = 0, norm1 = 0, norm2 = 0;
/* We need to perform cosine similarity only on words that
* exist in both lists */
for (String k : both) {
sclar += v1.get(k) * v2.get(k);
norm1 += v1.get(k) * v1.get(k);
norm2 += v2.get(k) * v2.get(k);
}
return sclar / Math.sqrt(norm1 * norm2);
}