Counter.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. package analyzer;
  2. import analyzer.models.Hashtag;
  3. import analyzer.models.Round;
  4. import analyzer.models.User;
  5. import java.io.*;
  6. import java.util.*;
  7. import java.util.concurrent.atomic.AtomicReference;
  8. import java.util.stream.Collectors;
  9. public class Counter {
  10. private static Map<String, Integer> hashtagsCounter = new HashMap<>();
  11. private static Map<String, Integer> clientsCounter = new HashMap<>();
  12. private static String path = "C:\\Users\\Admin\\Desktop\\Skripts\\Thesis\\Repo\\local\\round_based_data_" + Analyzer.roundLength + ".txt";
  13. public static void main(String[] args) throws IOException, InterruptedException {
  14. new Analyzer();
  15. countHashtag(10);
  16. System.out.println();
  17. countClient(100);
  18. //datasetStatistics();
  19. //trial();
  20. }
  21. public static void countHashtag(int num) throws IOException {
  22. FileReader fr = new FileReader(Analyzer.serverLogPath);
  23. BufferedReader br= new BufferedReader(fr);
  24. String line;
  25. while((line = br.readLine()) != null) {
  26. String[] elements = line.trim().split("\t");//timestamp user_id hashtags
  27. String[] hashtags = elements[2].split(" ");
  28. for(String h : hashtags) {
  29. if(hashtagsCounter.containsKey(h))
  30. hashtagsCounter.replace(h, hashtagsCounter.get(h) + 1);
  31. else
  32. hashtagsCounter.put(h, 1);
  33. }
  34. }
  35. List<Map.Entry<String, Integer>> list = new ArrayList<>(hashtagsCounter.entrySet());
  36. list.sort(Map.Entry.comparingByValue((v1, v2) -> Integer.compare(v2, v1)));
  37. System.out.println(hashtagsCounter.size() + " hashtags");
  38. System.out.println("Hashtag" + "\t" + "Times");
  39. for(int i=0; i<num; i++)
  40. System.out.println(list.get(i).getKey() + "\t" + list.get(i).getValue());
  41. }
  42. public static void countClient(int num) throws IOException {
  43. FileReader fr = new FileReader(Analyzer.clientLogPath);
  44. BufferedReader br= new BufferedReader(fr);
  45. String line;
  46. while((line = br.readLine()) != null) {
  47. String[] elements = line.trim().split("\t");//client-id destination timestamp
  48. if (clientsCounter.containsKey(elements[0]))
  49. clientsCounter.replace(elements[0], clientsCounter.get(elements[0]) + 1);
  50. else
  51. clientsCounter.put(elements[0], 1);
  52. }
  53. List<Map.Entry<String, Integer>> list = new ArrayList<>(clientsCounter.entrySet());
  54. list.sort(Map.Entry.comparingByValue((v1, v2) -> Integer.compare(v2, v1)));
  55. System.out.println(clientsCounter.size() + " clients");
  56. System.out.println("Client" + "\t" + "Posts");
  57. for(int i=0; i<num; i++)
  58. System.out.println(list.get(i).getKey() + "\t" + list.get(i).getValue());
  59. }
  60. private static void datasetStatistics() throws InterruptedException, IOException {
  61. //Analyzer.serverLogPath = path;
  62. new Analyzer();
  63. //hashtagsPerUser();
  64. //postsPerUserPerRound();
  65. //messagesPerHashtagPerRound();
  66. //popularHashtagsOvertime();
  67. //hashtagTable(50);
  68. //distribution1(new int[] {2, 3, 4, 10, 100, 1000});
  69. //distribution2();
  70. //exportDataPopularity(new int[] {1, 10, 100, 1000, 10000, 100000});
  71. //exportDataLifetime(new int[] {1, 10, 100, 1000, 10000, 100000});
  72. numOfPostsEachRound();
  73. //activeTime();
  74. }
  75. private static void hashtagsPerUser() {
  76. int min = Integer.MAX_VALUE;
  77. long total = 0L;
  78. int max = Integer.MIN_VALUE;
  79. int allUsers = ServerLogParser.users.size();
  80. for(User u : ServerLogParser.users.values()) {
  81. int noOfHashtags = u.getHashtags().size();
  82. if(min > noOfHashtags)
  83. min = noOfHashtags;
  84. if(max < noOfHashtags)
  85. max = noOfHashtags;
  86. total += noOfHashtags;
  87. }
  88. double avg = ((double)total / (double)allUsers);
  89. System.out.println();
  90. System.out.println("hashtagsPerUser");
  91. System.out.println("Min: " + min);
  92. System.out.println("Max: " + max);
  93. System.out.println("Avg: " + avg);
  94. }
  95. private static void postsPerUserPerRound() {
  96. int min = Integer.MAX_VALUE;
  97. int max = Integer.MIN_VALUE;
  98. double avg;
  99. double avgSigma = 0;
  100. for(Round r : ServerLogParser.rounds.values()) {
  101. int total_i = r.getUserMap().values().stream().mapToInt(v -> v).sum();
  102. double avg_i = (double) total_i / (double) r.getUserMap().size();
  103. avgSigma += avg_i;
  104. }
  105. avg = avgSigma / (double) ServerLogParser.rounds.size();
  106. for(Round r : ServerLogParser.rounds.values()) {
  107. for(Integer postNo : r.getUserMap().values()) {
  108. if(max < postNo)
  109. max = postNo;
  110. if(min > postNo)
  111. min = postNo;
  112. }
  113. }
  114. System.out.println();
  115. System.out.println("postsPerUserPerRound");
  116. System.out.println("Min: " + min);
  117. System.out.println("Max: " + max);
  118. System.out.println("Avg: " + avg);
  119. }
  120. private static void messagesPerHashtagPerRound() {
  121. int min = Integer.MAX_VALUE;
  122. int max = Integer.MIN_VALUE;
  123. double avg;
  124. double avgSigma = 0;
  125. for(Round r : ServerLogParser.rounds.values()) {
  126. int total_i = r.getHashtags().values().stream().mapToInt(v -> v).sum();
  127. double avg_i = (double) total_i / (double) r.getHashtags().size();
  128. avgSigma += avg_i;
  129. }
  130. avg = avgSigma / (double) ServerLogParser.rounds.size();
  131. for(Round r : ServerLogParser.rounds.values()) {
  132. for(Integer postNo : r.getHashtags().values()) {
  133. if(max < postNo)
  134. max = postNo;
  135. if(min > postNo)
  136. min = postNo;
  137. }
  138. }
  139. System.out.println();
  140. System.out.println("messagesPerHashtagPerRound");
  141. System.out.println("Min: " + min);
  142. System.out.println("Max: " + max);
  143. System.out.println("Avg: " + avg);
  144. }
  145. private static void popularHashtagsOvertime() {
  146. List<Hashtag>[] arrOfLst = new List[ServerLogParser.rounds.size()];
  147. int[] max = new int[ServerLogParser.rounds.size()];
  148. Arrays.fill(max, Integer.MIN_VALUE);
  149. for(Round r : ServerLogParser.rounds.values()) {
  150. for(Integer v : r.getHashtags().values()) {
  151. if(v > max[r.getNo() - 1]) {
  152. max[r.getNo() - 1] = v;
  153. }
  154. }
  155. List<Hashtag> lst = new ArrayList<>();
  156. for(Map.Entry<Hashtag, Integer> e : r.getHashtags().entrySet()) {
  157. if(e.getValue().equals(max[r.getNo() - 1])) {
  158. lst.add(e.getKey());
  159. }
  160. }
  161. arrOfLst[r.getNo() - 1] = lst;
  162. }
  163. List<Hashtag> lstOfPopularHashtags = new ArrayList<>();
  164. for(List<Hashtag> l : arrOfLst) {
  165. for(Hashtag h : l) {
  166. if(!lstOfPopularHashtags.contains(h))
  167. lstOfPopularHashtags.add(h);
  168. }
  169. }
  170. System.out.println();
  171. System.out.println("popularHashtagsOvertime " + lstOfPopularHashtags.size());
  172. System.out.println("Most popular hashtags of round ");
  173. for(int i = 0; i < arrOfLst.length; i++) {
  174. Round thisRound = ServerLogParser.rounds.get(i+1);
  175. System.out.print(thisRound.getNo() + "\t");
  176. for (Hashtag h : arrOfLst[i]) {
  177. System.out.print(h.getName() + "|" + h.getRoundMap().get(thisRound) + " ");
  178. }
  179. System.out.println();
  180. }
  181. }
  182. private static void hashtagTable(int maxRound) throws IOException {
  183. String wPath = "C:\\Users\\Admin\\Desktop\\hiwi tud\\";
  184. File file = new File(wPath + "hashtag_table_" + Analyzer.roundLength + ".txt");
  185. FileWriter fw = new FileWriter(file, true);
  186. BufferedWriter bw = new BufferedWriter(fw);
  187. Map<Integer, Round> map = ServerLogParser.rounds;
  188. int num = Math.min(maxRound, map.size());
  189. bw.write("Round:[Hashtag|NumOfMessages...]");
  190. bw.newLine();
  191. for(int i = 0; i < maxRound; i++) {
  192. Round r = map.get(i+1);
  193. List<Map.Entry<Hashtag, Integer>> sortedList = new ArrayList<>(r.getHashtags().entrySet());
  194. sortedList.sort(Comparator.comparingInt(Map.Entry::getValue));
  195. bw.write(r.getNo() + ":");
  196. for(Map.Entry<Hashtag, Integer> e : sortedList) {
  197. bw.write(e.getKey().getName() + "|" + e.getValue() + " ");
  198. }
  199. bw.newLine();
  200. }
  201. bw.close();
  202. }
  203. private static void distribution1(int[] intervals) throws IOException {
  204. int[] counters = new int[intervals.length + 1];
  205. for(Round r : ServerLogParser.rounds.values()) {
  206. r.getHashtags().values().forEach(v -> {
  207. int indexMax = -1;
  208. for(int i = 0; i < intervals.length; i++) {
  209. if(v < intervals[i]) {
  210. indexMax = i;
  211. break;
  212. }
  213. }
  214. if(indexMax == -1)
  215. counters[counters.length - 1]++;
  216. else
  217. counters[indexMax]++;
  218. });
  219. }
  220. int totalCount = Arrays.stream(counters).sum();
  221. for(int i = 0; i < counters.length; i++) {
  222. String printedString;
  223. if(i == 0)
  224. printedString = "1 - " + intervals[i] + ":";
  225. else if (i == counters.length - 1)
  226. printedString = intervals[i-1] + " - MAX:";
  227. else
  228. printedString = intervals[i-1] + " - " + intervals[i] + ":";
  229. double share = ((double)counters[i]/(double) totalCount) * 100;
  230. System.out.println(printedString + "\t" + counters[i] + " " + share);
  231. }
  232. System.out.println();
  233. }
  234. private static void distribution2() {
  235. Map<Integer, Integer> map = new Hashtable<>();
  236. for(Round r : ServerLogParser.rounds.values()) {
  237. r.getHashtags().values().forEach(v -> {
  238. if(map.containsKey(v))
  239. map.replace(v, map.get(v) + 1);
  240. else
  241. map.put(v, 1);
  242. });
  243. }
  244. int kinds = map.values().stream().mapToInt(v -> v).sum();
  245. AtomicReference<Double> betterAvg = new AtomicReference<>((double) 0);
  246. map.forEach((k, v) -> {
  247. double weight = (double) v / (double) kinds;
  248. betterAvg.updateAndGet(v1 -> (v1 + k * weight));
  249. });
  250. System.out.println("betterAvg: " + betterAvg.get());
  251. }
  252. public static void trial() throws InterruptedException {
  253. Analyzer.serverLogPath = path;
  254. new Analyzer();
  255. Round round149 = ServerLogParser.rounds.get(149);
  256. round149.getHashtags().forEach((k, v) -> {
  257. System.out.println(k.getName() + " " + v);
  258. });
  259. }
  260. public static void exportDataLifetime(int[] intervals) {
  261. int maxAvgPostNo = 0;
  262. Map<Hashtag, Integer> map = new Hashtable<>();
  263. for(Hashtag h : ServerLogParser.hashtags.values()) {
  264. int totalPosts = h.getTotalPosts();
  265. //double avgPostsPerRound = (double) totalPosts / (double) roundNo;
  266. //double avgPostsPerRound = (double) totalPosts / (double) h.getRoundMap().size();
  267. if(maxAvgPostNo < totalPosts)
  268. maxAvgPostNo = (int) totalPosts + 1;
  269. map.put(h, totalPosts);
  270. }
  271. int maxAvg = maxAvgPostNo;
  272. List<Map.Entry<Hashtag, Integer>>[] arrOfLists = new List[intervals.length + 1];
  273. for(int i = 0; i < arrOfLists.length; i++) {
  274. if(i == 0) {
  275. int finalRightLimit = intervals[i];
  276. arrOfLists[i] = map.entrySet().stream().filter(e -> e.getValue() >= 0 && e.getValue() < finalRightLimit).collect(Collectors.toList());
  277. } else if(i == arrOfLists.length - 1) {
  278. int finalLeftLimit = intervals[i - 1];
  279. arrOfLists[i] = map.entrySet().stream().filter(e -> e.getValue() >= finalLeftLimit && e.getValue() < maxAvg).collect(Collectors.toList());
  280. }
  281. else {
  282. int finalLeftLimit = intervals[i-1];
  283. int finalRightLimit = intervals[i];
  284. arrOfLists[i] = map.entrySet().stream().filter(e -> e.getValue() >= finalLeftLimit && e.getValue() < finalRightLimit).collect(Collectors.toList());
  285. }
  286. }
  287. double[] avgs = new double[arrOfLists.length];
  288. for(int i = 0; i < arrOfLists.length; i++) {
  289. List<Map.Entry<Hashtag, Integer>> l = arrOfLists[i];
  290. avgs[i] = l.stream().mapToInt(e -> e.getKey().getRoundMap().size()).sum() / (double) l.size();
  291. }
  292. for(double v : avgs)
  293. System.out.println(v);
  294. }
  295. public static void exportDataPopularity(int[] intervals) {
  296. int roundNo = ServerLogParser.rounds.size();
  297. int maxAvgPostNo = 0;
  298. Map<Hashtag, Integer> map = new Hashtable<>();
  299. for(Hashtag h : ServerLogParser.hashtags.values()) {
  300. int totalPosts = h.getTotalPosts();
  301. //double avgPostsPerRound = (double) totalPosts / (double) roundNo;
  302. //double avgPostsPerRound = (double) totalPosts / (double) h.getRoundMap().size();
  303. if(maxAvgPostNo < totalPosts)
  304. maxAvgPostNo = (int) totalPosts + 1;
  305. map.put(h, totalPosts);
  306. }
  307. int maxAvg = maxAvgPostNo;
  308. List<Map.Entry<Hashtag, Integer>>[] arrOfLists = new List[intervals.length + 1];
  309. for(int i = 0; i < arrOfLists.length; i++) {
  310. if(i == 0) {
  311. int finalRightLimit = intervals[i];
  312. arrOfLists[i] = map.entrySet().stream().filter(e -> e.getValue() >= 0 && e.getValue() < finalRightLimit).collect(Collectors.toList());
  313. } else if(i == arrOfLists.length - 1) {
  314. int finalLeftLimit = intervals[i - 1];
  315. arrOfLists[i] = map.entrySet().stream().filter(e -> e.getValue() >= finalLeftLimit && e.getValue() < maxAvg).collect(Collectors.toList());
  316. }
  317. else {
  318. int finalLeftLimit = intervals[i-1];
  319. int finalRightLimit = intervals[i];
  320. arrOfLists[i] = map.entrySet().stream().filter(e -> e.getValue() >= finalLeftLimit && e.getValue() < finalRightLimit).collect(Collectors.toList());
  321. }
  322. }
  323. for(int i = 0; i < arrOfLists.length; i++) {
  324. int lstSize = arrOfLists[i].size();
  325. double percentage = ((double) lstSize / (double) ServerLogParser.hashtags.size()) * 100.00;
  326. if(i == 0)
  327. System.out.println(0 + " - " + intervals[i] + ":\t" + lstSize + " " + percentage);
  328. else if(i == arrOfLists.length - 1)
  329. System.out.println(intervals[i-1] + " - " + (maxAvg + 1) + ":\t" + lstSize + " " + percentage);
  330. else
  331. System.out.println(intervals[i-1] + " - " + intervals[i] + ":\t" + lstSize + " " + percentage);
  332. }
  333. double[][] arrOfsums = new double[arrOfLists.length][ServerLogParser.rounds.size()];
  334. for(int i = 0; i < arrOfLists.length; i++) {
  335. List<Map.Entry<Hashtag, Integer>> l = arrOfLists[i];
  336. int size = l.size();
  337. if(size == 0)
  338. continue;
  339. System.out.print("Interval " + i + "\t");
  340. for(int j = 0; j < ServerLogParser.rounds.size(); j++){
  341. Round r = ServerLogParser.rounds.get(j+1);
  342. int sum = l.stream().mapToInt(e -> {
  343. Integer temp = e.getKey().getRoundMap().get(r);
  344. return Objects.requireNonNullElse(temp, 0);
  345. }).sum();
  346. arrOfsums[i][j] = sum;
  347. System.out.print(j+1 + "|" + arrOfsums[i][j] + " ");
  348. }
  349. System.out.println();
  350. }
  351. }
  352. public static void numOfPostsEachRound() {
  353. List<Map.Entry<Integer, Round>> entries = new ArrayList<>(ServerLogParser.rounds.entrySet());
  354. entries.sort(Comparator.comparingInt(Map.Entry::getKey));
  355. for(Map.Entry<Integer, Round> e : entries) {
  356. int totalPosts = e.getValue().getUserMap().values().stream().mapToInt(v -> v).sum();
  357. System.out.print(totalPosts + ",");
  358. }
  359. }
  360. public static void activeTime() {
  361. int sumActive = ServerLogParser.rounds.values().stream().mapToInt(r -> r.getHashtags().size()).sum();
  362. double activeTime = (((double) sumActive / (double) ServerLogParser.hashtags.size()) / ServerLogParser.rounds.size()) * 100.00;
  363. System.out.println(activeTime + " active time");
  364. }
  365. }