Commit c72eba05ff71884015baf71d5052f63fb70258a5

Authored by Diego Ceccarelli
1 parent 0710465e

add file trend collector

blacklist.txt 0 → 100644
  1 +pensi
  2 +mattina
  3 +giorgio
  4 +confronto
  5 +retweet
  6 +one
  7 +fav
  8 +spree
  9 +segui
  10 +que
  11 +vorresti
  12 +ritwittano
  13 +quelli
  14 +passa
  15 +metto
  16 +aumentare
  17 +aumenta
  18 +womp
  19 +vuoi
  20 +vabbe
  21 +tuoi
  22 +pochi
  23 +followers
  24 +vincere
  25 +vieni
  26 +aggiunto
  27 +trovato
  28 +trovato
  29 +tornare
  30 +segue
  31 +mette
  32 +gioca
  33 +cose
  34 +cos'e
  35 +c'e
  36 +aspetta
  37 +buonanotte
  38 +buongiorno
  39 +zia
  40 +volete
  41 +vogliamo
  42 +vede
  43 +twitter
  44 +the
  45 +tina
  46 +tini
  47 +smerdate
  48 +seguitemi
  49 +rispondere
  50 +rispondi
  51 +ritorno
  52 +partecipate
  53 +oggi
  54 +negli
  55 +gli
  56 +devi
  57 +dale
  58 +dalla
  59 +dalle
  60 +dallo
  61 +dovrebbe
  62 +cit
  63 +cita
  64 +dietro
  65 +c'era
  66 +boca
  67 +cerca
  68 +chiesto
  69 +voglio
  70 +voglia
  71 +vogliono
  72 +sullo
  73 +suoi
  74 +suso
  75 +tante
  76 +tantissimi
  77 +sto
  78 +solo
  79 +suoi
  80 +scelgo
  81 +scelto
  82 +questa
  83 +ogni
  84 +mai
  85 +lol
  86 +nelle
  87 +farti
  88 +farvi
  89 +farsi
  90 +faccio
  91 +dare
  92 +#rt
  93 +adesso
  94 +ai
  95 +al
  96 +alla
  97 +allo
  98 +allora
  99 +altre
  100 +altri
  101 +altro
  102 +anche
  103 +ancora
  104 +avere
  105 +aveva
  106 +avevano
  107 +ben
  108 +buono
  109 +che
  110 +chi
  111 +cinque
  112 +comprare
  113 +con
  114 +consecutivi
  115 +consecutivo
  116 +cosa
  117 +cui
  118 +da
  119 +del
  120 +della
  121 +dello
  122 +dentro
  123 +deve
  124 +devo
  125 +di
  126 +doppio
  127 +due
  128 +e
  129 +ecco
  130 +fare
  131 +fine
  132 +fino
  133 +fra
  134 +gente
  135 +giu
  136 +ha
  137 +hai
  138 +hanno
  139 +ho
  140 +il
  141 +indietro
  142 +invece
  143 +io
  144 +la
  145 +lavoro
  146 +le
  147 +lei
  148 +lo
  149 +loro
  150 +lui
  151 +lungo
  152 +ma
  153 +me
  154 +meglio
  155 +molta
  156 +molti
  157 +molto
  158 +nei
  159 +nella
  160 +no
  161 +noi
  162 +nome
  163 +nostro
  164 +nove
  165 +nuovi
  166 +nuovo
  167 +o
  168 +oltre
  169 +ora
  170 +otto
  171 +peggio
  172 +pero
  173 +persone
  174 +piu
  175 +poco
  176 +primo
  177 +promesso
  178 +qua
  179 +quarto
  180 +quasi
  181 +quattro
  182 +quello
  183 +questo
  184 +qui
  185 +quindi
  186 +quinto
  187 +rispetto
  188 +sara
  189 +secondo
  190 +sei
  191 +sembra
  192 +sembrava
  193 +senza
  194 +sette
  195 +sia
  196 +siamo
  197 +siete
  198 +solo
  199 +sono
  200 +sopra
  201 +soprattutto
  202 +sotto
  203 +stati
  204 +stato
  205 +stesso
  206 +su
  207 +subito
  208 +sul
  209 +sulla
  210 +tanto
  211 +te
  212 +tempo
  213 +terzo
  214 +tra
  215 +tre
  216 +triplo
  217 +ultimo
  218 +un
  219 +una
  220 +uno
  221 +va
  222 +vai
  223 +voi
  224 +volte
  225 +vostro
  226 +per
  227 +ora
  228 +dei
  229 +della
  230 +ero
  231 +suo
  232 +dal
  233 +piu
  234 +sta
  235 +non
0 236 \ No newline at end of file
... ...
project.properties
... ... @@ -5,7 +5,7 @@ dexter.rest.url=http://node1.novello.isti.cnr.it:9898/dexter-webapp/api/rest
5 5 hpc.enrich.service=http://localhost:8080/secure/rest/enrich/enrich
6 6 lucene.index=./resources/lucene
7 7 category.threshold=0.2f
8   -keyword.to.category=resources/keywords/keyword-to-category-2.tsv
  8 +keyword.to.category=src/main/resources/keywords/keyword-to-category-2.tsv
9 9 hpc.rest.service=http://localhost:8080/secure/rest
10 10 trends.twitter.core=./resources/trends/trends-new-5.json
11   -resiltec.trend.service=yonose
12 11 \ No newline at end of file
  12 +resiltec.trend.service=yonose
... ...
src/main/java/it/cnr/isti/hpc/trends/Bucket.java
... ... @@ -91,9 +91,7 @@ public class Bucket {
91 91 if (tweetIds == null)
92 92 return Collections.emptyList();
93 93 List<Status> tweetList = new ArrayList<Status>();
94   - if (tweetIds.size() > 12)
95   - tweetIds = tweetIds.subList(0, 12);
96   - // ROTFL
  94 +
97 95 for (Long id : tweetIds) {
98 96 tweetList.add(tweets.get(id));
99 97 }
... ...
src/main/java/it/cnr/isti/hpc/trends/TrendDetector.java
... ... @@ -16,7 +16,9 @@
16 16 package it.cnr.isti.hpc.trends;
17 17  
18 18 import it.cnr.isti.hpc.trends.output.Trend;
  19 +import it.cnr.isti.hpc.trends.output.TrendCollector;
19 20  
  21 +import java.io.IOException;
20 22 import java.util.ArrayList;
21 23 import java.util.List;
22 24  
... ... @@ -40,12 +42,29 @@ public class TrendDetector {
40 42  
41 43 Bucket currentBucket;
42 44 RecentBuckets bucketHistory = new RecentBuckets();
  45 + List<TrendCollector> collectors = new ArrayList<TrendCollector>();
43 46  
44 47 public TrendDetector setMinFreq(int minFreq) {
45 48 this.minFreq = minFreq;
46 49 return this;
47 50 }
48 51  
  52 + public TrendDetector addCollector(TrendCollector collector) {
  53 + collectors.add(collector);
  54 + return this;
  55 + }
  56 +
  57 + public void closeCollectors() {
  58 + for (TrendCollector c : collectors) {
  59 + try {
  60 + c.close();
  61 + } catch (IOException e) {
  62 + // TODO Auto-generated catch block
  63 + e.printStackTrace();
  64 + }
  65 + }
  66 + }
  67 +
49 68 public TrendDetector setBucketInterval(int intervalInMinutes) {
50 69 this.bucketInterval = intervalInMinutes * 1000 * 60;
51 70 return this;
... ... @@ -62,7 +81,20 @@ public class TrendDetector {
62 81 // compute trend;
63 82 List<Trend> trends = updateTrends(bucketHistory);
64 83 for (Trend trend : trends) {
65   - System.out.println(trend.asString());
  84 + // secure: check if it has secure entities, otherwise filter out
  85 + // TODO do not do this here, remove after the project
  86 + // if (!trend.getEntities().isEmpty()) {
  87 + trend.reduceTweets(12);
  88 + // send the trend to the collectors
  89 + for (TrendCollector tc : collectors) {
  90 + try {
  91 + tc.add(trend);
  92 + } catch (IOException e) {
  93 + // TODO Auto-generated catch block
  94 + e.printStackTrace();
  95 + }
  96 + }
  97 + // }
66 98  
67 99 }
68 100 currentBucket = new Bucket(status, bucketInterval);
... ... @@ -103,12 +135,15 @@ public class TrendDetector {
103 135 List<Trend> trends = new ArrayList<Trend>();
104 136 Bucket current = rb.getCurrentBucket();
105 137 for (String keyword : current.getKeywords()) {
106   - if (isTrend(rb, keyword)) {
  138 + double zscore = getZscore(rb, keyword);
  139 + if (isTrend(rb, keyword, zscore)) {
107 140 Trend trend = new Trend(keyword,
108 141 current.getKeywordFrequency(keyword));
109 142 trend.setTweets(current.getKeywordTweets(keyword));
  143 + trend.setZscore(zscore);
110 144 trends.add(trend);
111 145 trend.setAtTime(current.getTime());
  146 +
112 147 }
113 148  
114 149 }
... ... @@ -124,12 +159,14 @@ public class TrendDetector {
124 159 //
125 160 // }
126 161  
127   - private boolean isTrend(RecentBuckets rb, String keyword) {
128   - double zscore = getZscore(rb, keyword);
129   - if (zscore > 2.5d) {
  162 + private boolean isTrend(RecentBuckets rb, String keyword, double zscore) {
  163 +
  164 + if (zscore > 3d) {
130 165 int baseFreq = rb.getCurrentBucket().getKeywordFrequency(keyword);
  166 +
131 167 if (baseFreq > minFreq) {
132 168 return true;
  169 +
133 170 }
134 171 }
135 172 return false;
... ...
src/main/java/it/cnr/isti/hpc/trends/listener/TwitterFileListener.java
... ... @@ -20,6 +20,7 @@ import it.cnr.isti.hpc.io.reader.RecordReader;
20 20 import it.cnr.isti.hpc.property.ProjectProperties;
21 21 import it.cnr.isti.hpc.trends.Bucket;
22 22 import it.cnr.isti.hpc.trends.TrendDetector;
  23 +import it.cnr.isti.hpc.trends.output.FileTrendCollector;
23 24 import it.cnr.isti.hpc.trends.util.StatusJSONImpl;
24 25  
25 26 import java.io.File;
... ... @@ -31,8 +32,6 @@ import org.slf4j.LoggerFactory;
31 32  
32 33 import twitter4j.Status;
33 34  
34   -import com.google.gson.Gson;
35   -
36 35 /**
37 36 * @author Diego Ceccarelli <diego.ceccarelli@isti.cnr.it>
38 37 *
... ... @@ -82,6 +81,7 @@ public class TwitterFileListener extends AbstractTwitterListener {
82 81 }
83 82 if (target.isDirectory()) {
84 83 for (File f : target.listFiles()) {
  84 + logger.info("processing file {} ", f.getAbsolutePath());
85 85 if (f.isFile()) {
86 86 addAll(f);
87 87 }
... ... @@ -95,9 +95,9 @@ public class TwitterFileListener extends AbstractTwitterListener {
95 95 + " does not exist");
96 96  
97 97 RecordReader<StatusJSONImpl> reader = new RecordReader<StatusJSONImpl>(
98   - f.getAbsolutePath(), StatusJSONImpl.class)
  98 + f.getAbsolutePath(), new StatusJSONImpl.Parser())
99 99 .filter(new ItalianFilter());
100   - Gson gson = new Gson();
  100 +
101 101 for (Status s : reader) {
102 102  
103 103 collect(s);
... ... @@ -106,10 +106,17 @@ public class TwitterFileListener extends AbstractTwitterListener {
106 106 }
107 107  
108 108 public static void main(String[] args) throws InvalidActivityException {
109   - TwitterFileListener listener = new TwitterFileListener(
110   - new TrendDetector().setMinFreq(15).setBucketInterval(30));
111   - listener.setTarget(new File("/tmp/italian-tweets-20150201.json.gz"));
  109 + TrendDetector td = new TrendDetector()
  110 + .setMinFreq(15)
  111 + .setBucketInterval(30)
  112 + .addCollector(new FileTrendCollector("/tmp/output-all.json"))
  113 + .addCollector(
  114 + new FileTrendCollector("/tmp/plain-all.txt").asPlain());
  115 + TwitterFileListener listener = new TwitterFileListener(td);
  116 + listener.setTarget(new File("/tmp/tweets"));
  117 +
112 118 listener.run();
  119 + td.closeCollectors();
113 120  
114 121 }
115 122  
... ...
src/main/java/it/cnr/isti/hpc/trends/output/EntityTag.java
... ... @@ -6,41 +6,56 @@ public class EntityTag {
6 6  
7 7 private int id;
8 8 private String name;
  9 + private int tagCount;
9 10 private Date createDate;
10 11 private Date lastUpdate;
11   -
12   - public EntityTag(){
13   -
  12 +
  13 + public EntityTag() {
  14 +
14 15 }
15   -
16   - public EntityTag(String tag){
  16 +
  17 + public EntityTag(String tag) {
17 18 name = tag;
18 19 }
19   -
  20 +
20 21 public int getId() {
21 22 return id;
22 23 }
  24 +
23 25 public void setId(int id) {
24 26 this.id = id;
25 27 }
  28 +
26 29 public String getName() {
27 30 return name;
28 31 }
  32 +
29 33 public void setName(String name) {
30 34 this.name = name;
31 35 }
  36 +
32 37 public Date getCreateDate() {
33 38 return createDate;
34 39 }
  40 +
35 41 public void setCreateDate(Date createDate) {
36 42 this.createDate = createDate;
37 43 }
  44 +
38 45 public Date getLastUpdate() {
39 46 return lastUpdate;
40 47 }
  48 +
41 49 public void setLastUpdate(Date lastUpdate) {
42 50 this.lastUpdate = lastUpdate;
43 51 }
44   -
  52 +
  53 + public int getTagCount() {
  54 + return tagCount;
  55 + }
  56 +
  57 + public void setTagCount(int tagCount) {
  58 + this.tagCount = tagCount;
  59 + }
45 60  
46 61 }
... ...
src/main/java/it/cnr/isti/hpc/trends/output/FileTrendCollector.java 0 → 100644
  1 +/**
  2 + * Copyright 2015 Diego Ceccarelli
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package it.cnr.isti.hpc.trends.output;
  17 +
  18 +import it.cnr.isti.hpc.io.IOUtils;
  19 +import it.cnr.isti.hpc.trends.util.StatusJSONImpl;
  20 +
  21 +import java.io.BufferedWriter;
  22 +import java.io.IOException;
  23 +import java.lang.reflect.Type;
  24 +
  25 +import twitter4j.Status;
  26 +
  27 +import com.google.gson.Gson;
  28 +import com.google.gson.GsonBuilder;
  29 +import com.google.gson.JsonDeserializationContext;
  30 +import com.google.gson.JsonDeserializer;
  31 +import com.google.gson.JsonElement;
  32 +import com.google.gson.JsonParseException;
  33 +import com.google.gson.JsonSerializationContext;
  34 +import com.google.gson.JsonSerializer;
  35 +
  36 +/**
  37 + * @author Diego Ceccarelli <diego.ceccarelli@isti.cnr.it>
  38 + *
  39 + * Created on Feb 7, 2015
  40 + */
  41 +public class FileTrendCollector extends TrendCollector {
  42 +
  43 + public enum Format {
  44 + JSON, PLAIN
  45 + };
  46 +
  47 + private static Gson gson = new GsonBuilder().registerTypeAdapter(
  48 + StatusJSONImpl.class, new StatusSerializer()).create();
  49 + Format format = Format.JSON;
  50 + BufferedWriter bw;
  51 +
  52 + public FileTrendCollector(String file) {
  53 + bw = IOUtils.getPlainOrCompressedUTF8Writer(file);
  54 + }
  55 +
  56 + public FileTrendCollector asPlain() {
  57 + format = Format.PLAIN;
  58 + return this;
  59 + }
  60 +
  61 + @Override
  62 + public void add(Trend t) throws IOException {
  63 + String out = (format == Format.JSON) ? gson.toJson(t) : t.asString();
  64 + bw.write(out);
  65 + bw.newLine();
  66 + }
  67 +
  68 + @Override
  69 + public void close() throws IOException {
  70 + bw.close();
  71 +
  72 + }
  73 +
  74 + public static class StatusSerializer implements JsonSerializer<Status>,
  75 + JsonDeserializer<Status> {
  76 +
  77 + public JsonElement serialize(Status src, Type typeOfSrc,
  78 + JsonSerializationContext context) {
  79 + StatusJSONImpl i = (StatusJSONImpl) src;
  80 + return gson.fromJson(i.getJson(), JsonElement.class);
  81 + }
  82 +
  83 + public Status deserialize(JsonElement json, Type typeOfT,
  84 + JsonDeserializationContext context) throws JsonParseException {
  85 + // TODO Auto-generated method stub
  86 + return null;
  87 + }
  88 +
  89 + }
  90 +
  91 +}
... ...
src/main/java/it/cnr/isti/hpc/trends/output/Trend.java
... ... @@ -4,16 +4,22 @@
4 4 */
5 5 package it.cnr.isti.hpc.trends.output;
6 6  
  7 +import it.cnr.isti.hpc.trends.secure.Category;
  8 +import it.cnr.isti.hpc.trends.secure.KeywordClassifier;
  9 +
7 10 import java.util.ArrayList;
8 11 import java.util.Collections;
9 12 import java.util.Date;
10 13 import java.util.HashMap;
11 14 import java.util.List;
  15 +import java.util.Map;
12 16  
13 17 import twitter4j.Status;
14 18  
15 19 public class Trend {
16 20  
  21 + private static final KeywordClassifier classifier = new KeywordClassifier();
  22 + private transient double zscore = 0;
17 23 private String id;
18 24 private Date atTime;
19 25 private Date circa;
... ... @@ -66,6 +72,33 @@ public class Trend {
66 72 return circa;
67 73 }
68 74  
  75 + private void classify() {
  76 + Map<Category, Integer> counter = new HashMap<Category, Integer>();
  77 + for (Status s : getTweets()) {
  78 + List<Category> categories = classifier.classify(s.getText());
  79 + for (Category c : categories) {
  80 + if (!counter.containsKey(c))
  81 + counter.put(c, 0);
  82 + counter.put(c, counter.get(c) + 1);
  83 + }
  84 + }
  85 + for (Map.Entry<Category, Integer> entry : counter.entrySet()) {
  86 + if (entry.getValue() > 5) {
  87 + Entity e = new Entity();
  88 + e.setCreateDate(atTime);
  89 + e.setLastUpdate(atTime);
  90 + EntityTag tag = new EntityTag(entry.getKey().getName());
  91 + tag.setLastUpdate(atTime);
  92 + tag.setTagCount(entry.getValue());
  93 + List<EntityTag> tags = new ArrayList<EntityTag>();
  94 + tags.add(tag);
  95 + e.setEntityTag(tags);
  96 + entities.add(e);
  97 + }
  98 + }
  99 +
  100 + }
  101 +
69 102 public void setCirca(Date circa) {
70 103 this.circa = circa;
71 104 }
... ... @@ -181,6 +214,7 @@ public class Trend {
181 214 t.put("Tweets", tweets);
182 215  
183 216 eventResource.add(t);
  217 + classify();
184 218 }
185 219  
186 220 public String asString() {
... ... @@ -188,14 +222,22 @@ public class Trend {
188 222 sb.append("------------------------------------\n");
189 223 sb.append("trend: ").append(description).append('\n');
190 224 sb.append("freq: ").append(eventTag.get(0).getTagCount()).append('\n');
  225 + sb.append("zscore: ").append(zscore).append('\n');
191 226 sb.append("date: ").append(atTime).append('\n');
192   -
  227 + sb.append("entities:\n ");
  228 + for (Entity e : getEntities()) {
  229 + sb.append("\t")
  230 + .append(e.getEntityTag().get(0).getName() + " ["
  231 + + e.getEntityTag().get(0).getTagCount() + "]")
  232 + .append('\n');
  233 + }
193 234 sb.append("tweets:\n");
194 235 for (Status status : getTweets()) {
195 236 sb.append("\t")
196 237 .append(status.getText().replaceAll("[\n\r\t]", " "))
197 238 .append('\n');
198 239 }
  240 +
199 241 sb.append("\n");
200 242 return sb.toString();
201 243  
... ... @@ -204,6 +246,7 @@ public class Trend {
204 246 public List<Status> getTweets() {
205 247 if (eventResource.isEmpty())
206 248 return Collections.emptyList();
  249 +
207 250 return eventResource.get(0).get("Tweets");
208 251 }
209 252  
... ... @@ -219,6 +262,16 @@ public class Trend {
219 262 return eventTag;
220 263 }
221 264  
  265 + public void reduceTweets(int n) {
  266 + List<Status> tweets = getTweets();
  267 + if (tweets.size() > n)
  268 + tweets = tweets.subList(0, n);
  269 + HashMap<String, List<Status>> t = new HashMap<String, List<Status>>();
  270 + t.put("Tweets", tweets);
  271 + eventResource.clear();
  272 + eventResource.add(t);
  273 + }
  274 +
222 275 public void setEventTag(List<EventTag> eventTag) {
223 276 this.eventTag = eventTag;
224 277 }
... ... @@ -247,4 +300,12 @@ public class Trend {
247 300  
248 301 }
249 302  
  303 + public double getZscore() {
  304 + return zscore;
  305 + }
  306 +
  307 + public void setZscore(double zscore) {
  308 + this.zscore = zscore;
  309 + }
  310 +
250 311 }
... ...
src/main/java/it/cnr/isti/hpc/trends/output/TrendCollector.java 0 → 100644
  1 +/**
  2 + * Copyright 2015 Diego Ceccarelli
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package it.cnr.isti.hpc.trends.output;
  17 +
  18 +import java.io.IOException;
  19 +import java.util.Collection;
  20 +
  21 +/**
  22 + * @author Diego Ceccarelli <diego.ceccarelli@isti.cnr.it>
  23 + *
  24 + * Created on Feb 7, 2015
  25 + */
  26 +public abstract class TrendCollector {
  27 +
  28 + public abstract void add(Trend t) throws IOException;
  29 +
  30 + public abstract void close() throws IOException;
  31 +
  32 + public void addAll(Collection<Trend> t) throws IOException {
  33 + for (Trend trend : t) {
  34 + add(trend);
  35 + }
  36 + }
  37 +
  38 +}
... ...
src/main/java/it/cnr/isti/hpc/trends/secure/KeywordClassifier.java
... ... @@ -60,7 +60,6 @@ public class KeywordClassifier {
60 60  
61 61 }
62 62 }
63   -
64 63 }
65 64  
66 65 public List<Category> classify(String text) {
... ...
src/main/java/it/cnr/isti/hpc/trends/util/CleanAndTokenizeTweet.java
... ... @@ -4,7 +4,6 @@
4 4 package it.cnr.isti.hpc.trends.util;
5 5  
6 6 import java.util.ArrayList;
7   -import java.util.Arrays;
8 7 import java.util.Collection;
9 8 import java.util.HashSet;
10 9 import java.util.List;
... ... @@ -18,29 +17,8 @@ import net.sf.junidecode.Junidecode;
18 17 */
19 18 public class CleanAndTokenizeTweet {
20 19  
21   - private final static Set<String> stopItalian = new HashSet<String>(
22   - Arrays.asList(new String[] { "adesso", "ai", "al", "alla", "allo",
23   - "allora", "altre", "altri", "altro", "anche", "ancora",
24   - "avere", "aveva", "avevano", "ben", "buono", "che", "chi",
25   - "cinque", "comprare", "con", "consecutivi", "consecutivo",
26   - "cosa", "cui", "da", "del", "della", "dello", "dentro",
27   - "deve", "devo", "di", "doppio", "due", "e", "ecco", "fare",
28   - "fine", "fino", "fra", "gente", "giu", "ha", "hai",
29   - "hanno", "ho", "il", "indietro", "invece", "io", "la",
30   - "lavoro", "le", "lei", "lo", "loro", "lui", "lungo", "ma",
31   - "me", "meglio", "molta", "molti", "molto", "nei", "nella",
32   - "no", "noi", "nome", "nostro", "nove", "nuovi", "nuovo",
33   - "o", "oltre", "ora", "otto", "peggio", "pero", "persone",
34   - "piu", "poco", "primo", "promesso", "qua", "quarto",
35   - "quasi", "quattro", "quello", "questo", "qui", "quindi",
36   - "quinto", "rispetto", "sara", "secondo", "sei", "sembra",
37   - "sembrava", "senza", "sette", "sia", "siamo", "siete",
38   - "solo", "sono", "sopra", "soprattutto", "sotto", "stati",
39   - "stato", "stesso", "su", "subito", "sul", "sulla", "tanto",
40   - "te", "tempo", "terzo", "tra", "tre", "triplo", "ultimo",
41   - "un", "una", "uno", "va", "vai", "voi", "volte", "vostro",
42   - "per", "ora", "dei", "della", "ero", "suo", "dal", "piu",
43   - "sta", "non" }));
  20 + private final static WordSet stopItalian = WordSet
  21 + .fromFile("./blacklist.txt");
44 22  
45 23 /**
46 24 *
... ...
src/main/java/it/cnr/isti/hpc/trends/util/StatusJSONImpl.java
... ... @@ -36,6 +36,8 @@ package it.cnr.isti.hpc.trends.util;
36 36 * limitations under the License.
37 37 */
38 38  
  39 +import it.cnr.isti.hpc.io.reader.RecordParser;
  40 +
39 41 import java.util.Date;
40 42  
41 43 import twitter4j.GeoLocation;
... ... @@ -50,6 +52,8 @@ import twitter4j.User;
50 52 import twitter4j.UserMentionEntity;
51 53 import twitter4j.internal.logging.Logger;
52 54  
  55 +import com.google.gson.Gson;
  56 +
53 57 /**
54 58 * A data class representing one single status of a user.
55 59 *
... ... @@ -91,6 +95,16 @@ public class StatusJSONImpl implements Status, java.io.Serializable {
91 95 private SymbolEntity[] symbolEntities;
92 96 private long currentUserRetweetId = -1L;
93 97  
  98 + private String json = "";
  99 +
  100 + public String getJson() {
  101 + return json;
  102 + }
  103 +
  104 + public void setJson(String json) {
  105 + this.json = json;
  106 + }
  107 +
94 108 public static Logger getLogger() {
95 109 return logger;
96 110 }
... ... @@ -327,4 +341,20 @@ public class StatusJSONImpl implements Status, java.io.Serializable {
327 341 return false;
328 342 }
329 343  
  344 + private static Gson gson = new Gson();
  345 +
  346 + public static class Parser implements RecordParser<StatusJSONImpl> {
  347 +
  348 + public StatusJSONImpl decode(String json) {
  349 + StatusJSONImpl rec = gson.fromJson(json, StatusJSONImpl.class);
  350 + rec.setJson(json);
  351 + return rec;
  352 + }
  353 +
  354 + public String encode(StatusJSONImpl arg0) {
  355 + return arg0.getJson();
  356 + }
  357 +
  358 + }
  359 +
330 360 }
... ...
src/main/java/it/cnr/isti/hpc/trends/util/WordSet.java 0 → 100644
  1 +/**
  2 + * Copyright 2015 Diego Ceccarelli
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package it.cnr.isti.hpc.trends.util;
  17 +
  18 +import it.cnr.isti.hpc.io.IOUtils;
  19 +
  20 +import java.io.File;
  21 +import java.util.HashSet;
  22 +import java.util.List;
  23 +import java.util.Set;
  24 +
  25 +import org.slf4j.Logger;
  26 +import org.slf4j.LoggerFactory;
  27 +
  28 +/**
  29 + * @author Diego Ceccarelli <diego.ceccarelli@isti.cnr.it>
  30 + *
  31 + * Created on Feb 9, 2015
  32 + */
  33 +public class WordSet {
  34 +
  35 + private static final Logger logger = LoggerFactory.getLogger(WordSet.class);
  36 +
  37 + Set<String> words;
  38 +
  39 + public WordSet() {
  40 + words = new HashSet<String>();
  41 + }
  42 +
  43 + public boolean contains(String word) {
  44 + return words.contains(word);
  45 + }
  46 +
  47 + public static WordSet fromFile(String f) {
  48 + return fromFile(new File(f));
  49 + }
  50 +
  51 + public static WordSet fromFile(File f) {
  52 + if (!f.exists()) {
  53 + logger.error("{} does not exist", f.getAbsolutePath());
  54 + return new WordSet();
  55 + }
  56 + List<String> words = IOUtils.getLines(f.getAbsolutePath());
  57 + WordSet ws = new WordSet();
  58 + ws.words.addAll(words);
  59 + logger.info("loaded {} keywords", ws.words.size());
  60 + return ws;
  61 + }
  62 +
  63 +}
... ...
src/main/resources/keywords/keyword-to-category-2.tsv 0 → 100644
  1 +Alluvione Alluvione
  2 +Armi Armi
  3 +Attacco_armato Attacco_armato
  4 +Attentato Attentato
  5 +Bestemmiare Bestemmiare
  6 +Bomba Bomba
  7 +Bombardamento Bombardamento
  8 +Combattere Combattere
  9 +Danneggiamento_infrastruttura Danneggiamento_infrastruttura
  10 +Danneggiamento_monumento Danneggiamento_monumento
  11 +Danneggiamento_pensilina_bus Danneggiamento_pensilina_bus
  12 +Danneggiamento_pompa_di_benzina Danneggiamento_pompa_di_benzina
  13 +Danneggiamento_quadro_elettrico Danneggiamento_quadro_elettrico
  14 +Danneggiamento_veicolo Danneggiamento_veicolo
  15 +Dirottamento Dirottamento
  16 +Disastro_aereo Disastro_aereo
  17 +Disastro_ferroviario Disastro_ferroviario
  18 +Disastro_naturale Disastro_naturale
  19 +Esplosione Esplosione
  20 +Estorcere Estorcere
  21 +Fuoriuscita_chimica Fuoriuscita_chimica
  22 +Fuoriuscita_di_petrolio Fuoriuscita_di_petrolio
  23 +Fuoriuscita Incidente_industriale
  24 +Fuoriuscita_chimica Incidente_industriale
  25 +Fuoriuscita_di_petrolio Incidente_industriale
  26 +Furto Furto
  27 +Graffitare Graffitare
  28 +Incendiare_cassonetto Incendiare_cassonetto
  29 +Incendiare_cassonetto Danneggiamento_infrastruttura
  30 +Incendio Incendio
  31 +Incendio_doloso Incendio_doloso
  32 +Incidente Incidente
  33 +Incisione Incisione
  34 +Incisione Danneggiamento_monumento
  35 +Ingiurie Ingiurie
  36 +Ingiurie Violenza_verbale
  37 +Manifestazione Manifestazione
  38 +Manifestazione Comportamenti_anomali
  39 +Minacciare Minacciare
  40 +Minacciare Violenza_verbale
  41 +Mordere Mordere
  42 +Mordere Violenza_fisica
  43 +Naufragio Naufragio
  44 +Naufragio Incidente_nei_trasporti
  45 +Petardo Petardo
  46 +Petardo Esplosione
  47 +Razzo Razzo
  48 +Razzo Esplosione
  49 +Ricatti Ricatti
  50 +Ricatti Violenza_verbale
  51 +Ricettazione Ricettazione
  52 +Sabotaggio Sabotaggio
  53 +Sabotaggio_Impianto Sabotaggio_Impianto
  54 +Sabotaggio_Macchinario Sabotaggio_Macchinario
  55 +Sabotaggio_Materiali Sabotaggio_Materiali
  56 +Cavi_elettrici_tranciati Sabotaggio_Impianto
  57 +Colla_serratura Sabotaggio_Impianto
  58 +Danneggiamento_quadro_elettrico Sabotaggio_Impianto
  59 +Sabotaggio_Impianto Sabotaggio
  60 +Sabotaggio_Macchinario Sabotaggio
  61 +Sabotaggio_Materiali Sabotaggio
  62 +Scarico_estintore Sabotaggio_Impianto
  63 +Sommossa Sommossa
  64 +Sommossa Comportamenti_anomali
  65 +Spaccare_vetrata Spaccare_vetrata
  66 +Spaccare_vetrata Danneggiamento_infrastruttura
  67 +Stracciare_manifesti Stracciare_manifesti
  68 +Stracciare_manifesti Danneggiamento_infrastruttura
  69 +Suicidio Suicidio
  70 +Suicidio Comportamenti_anomali
  71 +Tamponamento_a_catena Tamponamento_a_catena
  72 +Tromba_aria Tromba_aria
  73 +Tromba_aria Disastro_naturale
  74 +Uccidere Ucciderei
  75 +Uccidere Violenza_fisica
  76 +Uragano Uragano
  77 +Uragano Disastro_naturale
  78 +Veicolo Veicolo
  79 +Veicolo Furto
  80 +Violenza Violenza
  81 +Violenza_fisica Violenza
  82 +Violenza_psicologica Violenza
  83 +Violenza_verbale Violenza
  84 +Schiaffeggiare Violenza_fisica
  85 +schiaffeggiare Violenza_fisica
  86 +Screditare Violenza_verbale
  87 +screditare Violenza_verbale
  88 +Ricatti Violenza_verbale
  89 +ricatti Violenza_verbale
  90 +ricatto Violenza_verbale
  91 +Prendere_a_calci Violenza_fisica
  92 +Mordere Violenza_fisica
  93 +mordere Violenza_fisica
  94 +Molestare Violenza_verbale
  95 +molestare Violenza_verbale
  96 +Mobbing Violenza_psicologica
  97 +mobbing Violenza_psicologica
  98 +Minacciare Violenza_verbale
  99 +minacciare Violenza_verbale
  100 +Lanciare_sassi Violenza_fisica
  101 +Lanciare_molotov Violenza_fisica
  102 +Ingiurie Violenza_verbale
  103 +ingiurie Violenza_verbale
  104 +Incolpare Violenza_verbale
  105 +incolpare Violenza_verbale
  106 +Estorcere Violenza_fisica
  107 +estorcere Violenza_fisica
  108 +Escludere Violenza_psicologica
  109 +escludere Violenza_psicologica
  110 +Combattere Violenza_fisica
  111 +combattere Violenza_fisica
  112 +Bestemmiare Violenza_verbale
  113 +bestemmiare Violenza_verbale
  114 +afghanistan Bombardamento
  115 +agent Violenza
  116 +assassino Violenza
  117 +bomba Armi
  118 +bombe Armi
  119 +cocain Ricettazione
  120 +contrabbandier Ricettazione
  121 +criminal Attacco_armato
  122 +danneggiamento Vandalismo
  123 +dannegiamento Vandalismo
  124 +danni Vandalismo
  125 +danno Vandalismo
  126 +decapit Violenza
  127 +digos Violenza
  128 +estintore Scarico_estintore
  129 +gendarmer Violenza
  130 +guardia Violenza
  131 +guerr Attacco_armato
  132 +hamas Attacco_armato
  133 +islam Attacco_armato
  134 +jihad Attacco_armato
  135 +morti Uccidere
  136 +morto Uccidere
  137 +nuclear Armi
  138 +ostaggio Ricatti
  139 +pattugl Violenza
  140 +polizziott Violenza
  141 +radioatt Armi
  142 +rivolta Sommossa
  143 +sbirr Violenza
  144 +schiaffo Violenza
  145 +sparator Violenza
  146 +stalking Violenza
  147 +violenz Violenza
  148 +manifestazion Manifestazione
  149 +casapound Manifestazione
  150 +casa_pound Manifestazione
  151 +corteo Manifestazione
  152 +radioattivo Fuga_radioattiva
  153 +radioattive Fuga_radioattiva
  154 +manifestare Manifestazione
  155 +manifestanti Manifestazione
  156 +nucleare Fuga_radioattiva
  157 +reattore Fuga_radioattiva
  158 +armi Armi
  159 +vandalici Danneggiamento_infrastruttura
  160 +guerra Attacco_armato
  161 +protestare Manifestazione
  162 +dissenso Manifestazione
  163 +aggredito Molestare
  164 +striscione Manifestazione
  165 +bombe Bomba
  166 +bomba Bomba
  167 +cobas Manifestazione
  168 +aggressioni Violenza_fisica
  169 +aggressione Violenza_fisica
  170 +presidio Manifestazione
  171 +incendio Incendio
  172 +attacco Attacco_armato
  173 +aggrediti Violenza_fisica
  174 +writers Graffitare
  175 +bombolette Graffitare
  176 +occupanti Manifestazione
  177 +occupanti Danneggiamento_infrastruttura
  178 +danni Danneggiamento_infrastruttura
  179 +danneggiament Danneggiamento_infrastruttura
  180 +borseggi Furto
  181 +antagonista Manifestazione
  182 +sabotare Sabotaggio
  183 +minacce Violenza
  184 +minaccia Violenza
  185 +intimidazioni Violenza_verbale
  186 +intimidazione Violenza_verbale
  187 +estremisti Sommossa
  188 +ricettazione Ricettazione
  189 +pugno Violenza_fisica
  190 +violenze Violenza_fisica
  191 +malmenare Violenza_fisica
  192 +fukushima Fuga_radioattiva
  193 +anarco-insurrezionalisti Comportamenti_anomali
  194 +agitatori Comportamenti_anomali
  195 +ubriaco Comportamenti_anomali
  196 +ubriachezza Comportamenti_anomali
  197 +tumefazioni Violenza_fisica
  198 +torturati Violenza_fisica
  199 +tifoserie Comportamenti_anomali
  200 +sgombero Comportamenti_anomali
  201 +protest Manifestazione
  202 +esplosione Attentato
  203 +attacco_armato Attentato
  204 +attacco_chimico Attentato
  205 +attacco_radioattivo Attentato
  206 +attacco_nucleare Attentato
  207 +incendio_doloso Attentato
  208 +scippo Furto
  209 +rapina Furto
  210 +ricettazione_macchinar Ricettazione
  211 +affollamento Comportamenti_anomali
  212 +sommossa Comportamenti_anomali
  213 +oggetto_abbandonato Comportamenti_anomali
  214 +individuo_camuffato Comportamenti_anomali
  215 +suicidio Comportamenti_anomali
  216 +violenza Violenza
  217 +incidente_nei_trasporti Incidente
  218 +incidente_industriale Incidente
  219 +crollo Incidente
  220 +terremoto Disastro_naturale
  221 +tsunami Disastro_naturale
  222 +eruzione Disastro_naturale
  223 +uragano Disastro_naturale
  224 +alluvione Disastro_naturale
  225 +frana Disastro_naturale
  226 +ciclone Disastro_naturale
  227 +tromba_d'aria Disastro_naturale
  228 +tifone Disastro_naturale
  229 +inondazione Disastro_naturale
  230 +allagamento Disastro_naturale
  231 +esplosione Esplosione
  232 +degrado Crollo
  233 +incendio Incendio_Doloso
  234 +fuoriuscita_chimica Incidente_industriale
  235 +fuoriuscita_di_petrolio Incidente_industriale
  236 +fuoriuscita_chimica Incidente_industriale
  237 +incendio Incidente
  238 +disastro_aereo Incidente_nei_trasporti
  239 +disastro_ferroviario Incidente_nei_trasporti
  240 +naufragio Incidente_nei_trasporti
  241 +tamponamento_a_catena Incidente_nei_trasporti
  242 +spaccare_vetrata Danneggiamento_infrastruttura
  243 +petardo Esplosione
  244 +bombardamento Attacco_armato
  245 +dirottamento Attacco_armato
... ...