package word2vec.evidencecomputation; import java.io.PrintWriter; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.PriorityQueue; import doser.word2vec.Word2VecModel; @SuppressWarnings("deprecation") public class EvidenceThread implements Runnable { private static final int TOPN = 100; private List<String> entities; private Word2VecModel model; private PrintWriter writer; public EvidenceThread(Word2VecModel model, List<String> entities, PrintWriter writer) { this.entities = entities; this.model = model; this.writer = writer; } @Override public void run() { float[][] vec = model.getVec(); HashMap<String, Integer> map = model.getVocab(); for (String entity : entities) { PriorityQueue<Holder> topN = new PriorityQueue<Holder>(TOPN, new Comparator<Holder>() { @Override public int compare(Holder h1, Holder h2) { return Float.compare(h1.getScore(), h2.getScore()); } }); float[] entityVec = vec[map.get(entity)]; for (Map.Entry<String, Integer> entry : map.entrySet()) { String word = entry.getKey(); if (!word.contains("http://dbpedia.org/resource/")) { float[] vector = vec[entry.getValue()]; float similarity = computeSimilarity(entityVec, vector); if (topN.size() < TOPN) { topN.add(new Holder(word, similarity)); } else if (topN.peek().score < similarity) { topN.poll(); topN.add(new Holder(word, similarity)); } } } String line = ""; while(!topN.isEmpty()) { Holder h = topN.poll(); String addition = "(" + h.word + "," + h.score + ")"; if (topN.size() > 0) { addition = "," + addition; } line = addition + line; } line = entity + "\t" + line; writer.println(line); } } private float computeSimilarity(float[] vec1, float[] vec2) { float sum = 0; for (int i = 0; i < vec1.length; i++) { sum += vec1[i] * vec2[i]; } return sum; } class Holder { private String word; private float score; public Holder(String entity, float score) { super(); this.word = entity; this.score = score; } public String getEntity() { return word; } public void setEntity(String entity) { this.word = entity; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } } }