/* TagRecommender: A framework to implement and evaluate algorithms for the recommendation of tags. Copyright (C) 2013 Dominik Kowald This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package file.preprocessing; import java.util.ArrayList; import java.util.HashSet; import common.Bookmark; import file.BookmarkReader; public class CoreFiltering { private BookmarkReader reader; public CoreFiltering(BookmarkReader reader) { this.reader = reader; } public BookmarkReader filterOrphansIterative(int level) { return filterOrphansIterative(level, level, level); } public BookmarkReader filterOrphansIterative(int userLevel, int resLevel, int tagLevel) { HashSet<Integer> userIDs = new HashSet<Integer>(); for (int i = 0; i < this.reader.getUsers().size(); i++) { int count = this.reader.getUserCounts().get(i); if (count >= userLevel) { userIDs.add(i); } } System.out.println("User IDs determined ..."); HashSet<Integer> resIDs = new HashSet<Integer>(); for (int i = 0; i < this.reader.getResources().size(); i++) { int count = this.reader.getResourceCounts().get(i); if (count >= resLevel) { resIDs.add(i); } } System.out.println("Res IDs determined ..."); HashSet<Integer> tagIDs = new HashSet<Integer>(); if (tagLevel > 0) { for (int i = 0; i < this.reader.getTags().size(); i++) { int count = this.reader.getTagCounts().get(i); if (count >= tagLevel) { tagIDs.add(i); } } System.out.println("Tag IDs determined ..."); } System.out.println("Start removing ..."); ArrayList<Bookmark> keepData = new ArrayList<Bookmark>(); for (Bookmark data : this.reader.getBookmarks()) { int resID = data.getResourceID(); int userID = data.getUserID(); if (resIDs.contains(resID) && userIDs.contains(userID)) { if (tagLevel > 0) { ArrayList<Integer> tags = new ArrayList<Integer>(); for (Integer tag : data.getTags()) { if (tagIDs.contains(tag)) { tags.add(tag); } } if (tags.size() > 0) { data.setTags(tags); keepData.add(data); } } else { keepData.add(data); } } } System.out.println("Kept lines: " + keepData.size()); this.reader.setBookmarks(keepData); return this.reader; } }