namespace Deal.Ml.Model; /// /// Пороги и константы наивно-байесовской модели по терминам (Ruling 4; 1:1 /// mlservice/model.py L20–31, L42–55, L178–181). Именованные константы вместо магических /// чисел (код-стайл этапа); значения НЕ входят в .proto-контракт (README src/contracts L164–166). /// public static class ModelConstants { /// /// Суммарно примеров по всем классам, чтобы модель «включилась» (MIN_TOTAL). /// public const double MinTotalExamples = 20.0; /// /// Минимум примеров у класса-победителя (не-спам; MIN_WINNER). /// public const double MinWinnerExamples = 6.0; /// /// Минимум примеров у класса-победителя «spam» (MIN_WINNER_SPAM). /// public const double MinWinnerSpamExamples = 4.0; /// /// Минимум различных терминов, встреченных у победителя (MIN_HITS). /// public const int MinHits = 2; /// /// Минимум примеров класса типа t:*, чтобы ML выдавал тип (MIN_TYPE_WINNER). /// public const double MinTypeWinnerExamples = 4.0; /// /// Метка класса «спам» (специальная роль — порог 4 и «корзина» карточки). /// public const string SpamLabel = "spam"; /// /// Префикс внутренних классов типа заявки (t:hire/t:order отсекаются из колонок). /// public const string TypeLabelPrefix = "t:"; /// /// Внутренний класс типа заявки «найм» (в UI — hire). /// public const string TypeClassHire = "t:hire"; /// /// Внутренний класс типа заявки «разовая сделка» (в UI — order). /// public const string TypeClassOrder = "t:order"; /// /// Множитель prior при ранжировании классов: score + 3·prior (predict L226–256). /// public const double PriorWeight = 3.0; /// /// ln-отрыв от второго класса на старте (MARGIN; адаптив 0.35/0.5/0.7 — см. ниже). /// public const double InitialMargin = 0.9; /// /// Суммарно примеров, после которых порог отрыва — 0.7. /// public const double TotalExamplesForMargin0_7 = 60.0; /// /// Суммарно примеров, после которых порог отрыва — 0.5. /// public const double TotalExamplesForMargin0_5 = 150.0; /// /// Суммарно примеров, после которых порог отрыва — 0.35. /// public const double TotalExamplesForMargin0_35 = 400.0; /// /// Адаптивный отрыв после 60 примеров. /// public const double MarginAfter60Examples = 0.7; /// /// Адаптивный отрыв после 150 примеров. /// public const double MarginAfter150Examples = 0.5; /// /// Адаптивный отрыв после 400 примеров. /// public const double MarginAfter400Examples = 0.35; /// /// Окно самооценки, которое отдаётся в /status (EVAL_WINDOW). /// public const int EvalWindowSize = 50; /// /// Сколько последних решений самооценки хранится в БД модели (EVAL_KEEP). /// public const int EvalKeepCount = 200; /// /// Сколько лучших весов классов отдаётся в predict (scores ≤ 5). /// public const int MaxScoresInReply = 5; /// /// Сколько узнанных терминов отдаётся в predict (terms ≤ 8). /// public const int MaxMatchedTerms = 8; /// /// Точность округления весов в scores (python round(…, 3)). /// public const int ScoresPrecision = 3; /// /// Точность округления весов классов в status (python round(…, 2)). /// public const int ClassesPrecision = 2; /// /// Точность округления отступа margin (python round(…, 2)). /// public const int MarginPrecision = 2; /// /// Точность округления доли верных в eval (python round(…, 3)). /// public const int AccuracyPrecision = 3; /// /// Минимальная длина токена, попадающего в модель (L83–86). /// public const int MinTokenLength = 3; /// /// Длина токена, при которой добавляется «хвостовой» префикс-термин. /// public const int MinTokenLengthForPrefix = 6; /// /// Длина префикса хвостового токена (w[:4]). /// public const int PrefixLength = 4; /// /// Префикс хвостового токена («~pyth» для «python») — не участвует в terms-подсказках. /// public const string TokenPrefixMarker = "~"; }