Classifier: persist message count

pull/191/head
M66B 4 years ago
parent e51aaaea84
commit de01906a46

@ -49,6 +49,7 @@ import javax.mail.internet.InternetAddress;
public class MessageClassifier {
private static boolean loaded = false;
private static boolean dirty = false;
private static final Map<Long, Map<String, Integer>> classMessages = new HashMap<>();
private static final Map<Long, Map<String, Map<String, Frequency>>> wordClassFrequency = new HashMap<>();
private static final double CHANCE_MINIMUM = 0.20;
@ -112,6 +113,8 @@ public class MessageClassifier {
load(context);
// Initialize data if needed
if (!classMessages.containsKey(folder.account))
classMessages.put(folder.account, new HashMap<>());
if (!wordClassFrequency.containsKey(folder.account))
wordClassFrequency.put(folder.account, new HashMap<>());
@ -128,6 +131,14 @@ public class MessageClassifier {
" re=" + message.auto_classified +
" elapsed=" + elapsed);
Integer m = classMessages.get(folder.account).get(folder.name);
m = (m == null ? 0 : m) + (target == null ? 1 : -1);
if (m <= 0)
classMessages.get(folder.account).remove(folder.name);
else
classMessages.get(folder.account).put(folder.name, m);
Log.i("Classifier " + folder.name + "=" + m + " msgs");
dirty = true;
// Auto classify
@ -158,12 +169,10 @@ public class MessageClassifier {
private static String classify(long account, String currentClass, String text, boolean added, Context context) {
int maxMessages = 0;
for (String word : wordClassFrequency.get(account).keySet()) {
for (String clazz : wordClassFrequency.get(account).get(word).keySet()) {
int count = wordClassFrequency.get(account).get(word).get(clazz).count;
if (count > maxMessages)
maxMessages = count;
}
for (String clazz : classMessages.get(account).keySet()) {
int count = classMessages.get(account).get(clazz);
if (count > maxMessages)
maxMessages = count;
}
State state = new State();
@ -361,6 +370,16 @@ public class MessageClassifier {
}
static JSONObject toJson() throws JSONException {
JSONArray jmessages = new JSONArray();
for (Long account : classMessages.keySet())
for (String clazz : classMessages.get(account).keySet()) {
JSONObject jmessage = new JSONObject();
jmessage.put("account", account);
jmessage.put("class", clazz);
jmessage.put("count", classMessages.get(account).get(clazz));
jmessages.put(jmessage);
}
JSONArray jwords = new JSONArray();
for (Long account : wordClassFrequency.keySet())
for (String word : wordClassFrequency.get(account).keySet()) {
@ -379,6 +398,8 @@ public class MessageClassifier {
}
JSONObject jroot = new JSONObject();
jroot.put("version", 1);
jroot.put("messages", jmessages);
jroot.put("words", jwords);
return jroot;
@ -392,6 +413,21 @@ public class MessageClassifier {
}
static void fromJson(JSONObject jroot) throws JSONException {
int version = jroot.optInt("version");
if (version < 1)
return;
JSONArray jmessages = jroot.getJSONArray("messages");
for (int m = 0; m < jmessages.length(); m++) {
JSONObject jmessage = (JSONObject) jmessages.get(m);
long account = jmessage.getLong("account");
if (!classMessages.containsKey(account))
classMessages.put(account, new HashMap<>());
String clazz = jmessage.getString("class");
int count = jmessage.getInt("count");
classMessages.get(account).put(clazz, count);
}
JSONArray jwords = jroot.getJSONArray("words");
for (int w = 0; w < jwords.length(); w++) {
JSONObject jword = (JSONObject) jwords.get(w);

Loading…
Cancel
Save