📄 activity.c
字号:
/** * @file * Activity scores for classes. * * This is not a real classifier. It is supposed to be used with a combiner. * It ignores the message content. * Folders which have not had any mails in a long time will be * considered less probable. * Keep average (or max) time between two messages for a class. * If the time since the last message is significantly higher than this, * call the class inactive. * Also frequency might be considered in the activity score. * * @author Mikael Ylikoski * @date 2002 */#include <stdlib.h>#include <string.h>#include "activity.h"#include "doc_classifier.h"#include "utility.h"/** * Class activity. */typedef struct { int nom; /**< Number of messages */ //float average; /**< Average delta */ int max; /**< Maximum delta */ int last; /**< Last time */} activity;/** * Activity database. */struct activity_db_ { int time; /**< Current time */ activity *act; /**< Activities */ int noa; /**< Number of activities */};/** * Create a new activity database. * * @param size the initial number of classes * @return The new activity database. */activity_db *activity_new_db (int size) { activity_db *db; db = my_malloc (sizeof(activity_db)); db->act = my_calloc (size, sizeof(activity)); db->time = 0; db->noa = size; return db;}/** * Register a new message. * * @param db activity database to use * @param class class of message * @return 0 if ok; != 0 otherwise. */intactivity_new_msg (activity_db *db, int class) { activity *a; if (class >= db->noa) { a = my_realloc (db->act, (class + 1) * sizeof(activity)); db->act = a; memset (&db->act[db->noa], 0, (class + 1 - db->noa) * sizeof(activity)); db->noa = class + 1; } db->time++; db->act[class].nom++; if (db->time > 0 && db->act[class].last > 0) if (db->time - db->act[class].last > db->act[class].max) db->act[class].max = db->time - db->act[class].last; db->act[class].last = db->time; return 0;}/** * Get activity score for a class. * * @param db activity database to use * @param class class to get score for * @return The activity score. */doubleactivity_score (activity_db *db, int class) { if (db->act[class].nom < 3) return 1; if (db->time - db->act[class].last > 5 * db->act[class].max) return 0; return 1;}/** * Get activity scores for all classes. * * @param db activity database to use * @return An array of activity scores. */double *activity_score_list (activity_db *db) { double *d; int i; d = my_malloc (db->noa * sizeof(double)); for (i = 0; i < db->noa; i++) d[i] = activity_score (db, i); return d;}void *activity_new_doc (const char *opts) { return activity_new_db (0);}intactivity_learn_doc (void *db, void *data, int class) { activity_db *adb; adb = (activity_db *)db; return activity_new_msg (adb, class);}double *activity_classify_doc_score (void *db, void *data) { activity_db *adb; adb = (activity_db *)db; return activity_score_list (db);}/** * Keep cygwin happy. */intmain (void) { return 0;}//const char *my_doc_classifier_name = "Activity";const doc_classifier_functions my_functions = { .new = activity_new_doc, .learn = activity_learn_doc, .classify_score = activity_classify_doc_score};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -