mirror of
https://github.com/M66B/FairEmail.git
synced 2026-01-09 06:15:24 +01:00
Classifier: persist message count
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user