package processing.hashtag.baseline;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class PersonalisedSimilarityCalculator {
/**
* Personalised Similarity: Sum of similarity score of a users who have used
* the hashtag to the target user, more the similarity score between the
* users who have used the same hashtag, higher is the chance of use of
* hashtag.
*
* @param hashtag
* the hashtag for which we want to calculate the similarity
* score
* @param user
* target user who is creating the target tweet.
* @return
*/
public static double getPersonalisedSimilarity(String user, ArrayList<String> friendsArrayList, HashSet<String> friends, HashMap<String,
HashMap<Integer, ArrayList<Long>>> userTagTimes) {
//ArrayList<String> friendsArrayList = network.get(user);
HashSet<String> intersectedUsers = new HashSet<String>(friendsArrayList);
//HashSet<String> friends = new HashSet<String>(tagUserMap.get(targetHashtag));
intersectedUsers.retainAll(friends);
double simScore = findSumOfSimilarityScore(user, new ArrayList<String>(intersectedUsers), userTagTimes);
return simScore;
}
/**
* Sum of similarity score in case of personalised recommendation.
*
* @param targetUser
* @param candidateUsers
* @return
*/
private static double findSumOfSimilarityScore(String targetUser, ArrayList<String> candidateUsers,
HashMap<String, HashMap<Integer, ArrayList<Long>>> userTagTimes) {
double similarityScoreValue = 0d;
Set<Integer> targetUserHashtag;
Set<Integer> candidateUserHashtag;
Set<Integer> intersection;
for (String candidateUser : candidateUsers) {
targetUserHashtag = userTagTimes.get(targetUser).keySet();
if (userTagTimes.containsKey(candidateUser)) {
candidateUserHashtag = new HashSet<Integer>(userTagTimes.get(candidateUser).keySet());
intersection = new HashSet<Integer>(targetUserHashtag);
intersection.retainAll(candidateUserHashtag);
if (targetUserHashtag.size() > 0 && candidateUserHashtag.size() > 0) {
similarityScoreValue += computeSimilarityScore(intersection.size(), targetUserHashtag.size(),
candidateUserHashtag.size());
}
}
}
return similarityScoreValue;
}
/**
* Compute similarity score.
*
* @param intersectionSize
* @param set1Size
* @param set2Size
* @return
*/
private static double computeSimilarityScore(int intersectionSize, int set1Size, int set2Size) {
return (double) intersectionSize / (double) (set1Size * set2Size);
}
}