package happy.research.cf; import happy.coding.io.Logs; import happy.coding.math.Sims; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class RN_mt extends DefaultCF_mt { private Map<String, Map<String, Double>> userTNsCorrMap = new HashMap<>(); public RN_mt() { methodId = "Reconstructed Network"; } @Override protected void preProcessing() { /* Reconstruct Trust Network */ String path = Dataset.DIRECTORY + "Reconstruction\\network.txt"; File file = new File(path); if (!file.exists()) { try { Logs.debug("Pre-Processing: Reconstruct Trust Network ..."); sampleDataset(path); } catch (Exception e) { e.printStackTrace(); } } else { try { Logs.debug("Pre-Processing: Loading Reconstructed Trust Network ..."); loadTestSet(path); } catch (Exception e) { e.printStackTrace(); } } Logs.debug("Done!"); } private void loadTestSet(String file) throws Exception { BufferedReader br = new BufferedReader(new FileReader(new File(file))); String line = null; while ((line = br.readLine()) != null) { String[] data = line.split(" "); String trustor = data[0]; String trustee = data[1]; double similarity = Double.parseDouble(data[2]); Map<String, Double> tnsCorrMap = null; if (userTNsCorrMap.containsKey(trustor)) tnsCorrMap = userTNsCorrMap.get(trustor); else tnsCorrMap = new HashMap<>(); tnsCorrMap.put(trustee, similarity); userTNsCorrMap.put(trustor, tnsCorrMap); } br.close(); } @Override protected Performance runMultiThreads() throws Exception { for (int i = 0; i < ratingArrays.length; i++) { threads[i] = new Thread(new RN_t(i, userTNsCorrMap)); threads[i].start(); } for (Thread tr : threads) tr.join(); return pf; } private void sampleDataset(String path) throws Exception { File dir = new File(path.substring(0, 1 + path.lastIndexOf('\\'))); if (!dir.exists()) dir.mkdirs(); BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path))); for (Entry<String, Map<String, Double>> entry : userTNsMap.entrySet()) { String user = entry.getKey(); Map<String, Double> tns = entry.getValue(); Map<String, Rating> rs = userRatingsMap.get(user); if (rs == null || rs.size() <= 3) continue; if (tns.size() < 10) continue; int count = 0; Map<String, Double> tnsCorrMap = new HashMap<>(); for (String tn : tns.keySet()) { double similarity = computeSimilarity(user, tn, null); if (Double.isNaN(similarity)) continue; if (similarity >= 0.5) count++; tnsCorrMap.put(tn, similarity); } if (count >= 4) { userTNsCorrMap.put(user, tnsCorrMap); for (Entry<String, Double> en : tnsCorrMap.entrySet()) { bw.write(user + " " + en.getKey() + " " + en.getValue() + "\n"); } } } bw.flush(); bw.close(); } protected double computeSimilarity(String userA, String userB, Rating exception) { if (userA.equals(userB)) return Double.NaN; Map<String, Rating> asRatings = userRatingsMap.get(userA); Map<String, Rating> bsRatings = userRatingsMap.get(userB); if (asRatings == null || bsRatings == null || asRatings.size() < 1 || bsRatings.size() < 1) return Double.NaN; List<Double> a = new ArrayList<>(); List<Double> b = new ArrayList<>(); for (Rating ar : asRatings.values()) { if (exception != null && ar.getItemId().equals(exception.getItemId())) continue; if (bsRatings.containsKey(ar.getItemId())) { a.add(ar.getRating()); b.add(bsRatings.get(ar.getItemId()).getRating()); } } return Sims.pcc(a, b); } }