File size: 4,947 Bytes
d3530f3
 
42cffde
d3530f3
 
 
42cffde
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3530f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19d49a8
 
 
7a13735
 
 
 
e7e6099
42cffde
e7e6099
42cffde
 
 
 
e7e6099
42cffde
 
 
 
 
 
 
 
 
e7e6099
 
42cffde
e7e6099
42cffde
 
e7e6099
42cffde
 
 
 
e7e6099
42cffde
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e7e6099
42cffde
 
 
 
 
 
 
 
 
e7e6099
42cffde
 
 
 
 
 
 
 
 
 
d3530f3
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import os
from dotenv import load_dotenv
import json

load_dotenv()

def env_float(key: str, default: float) -> float:
    try:
        return float(os.getenv(key, default))
    except (TypeError, ValueError):
        return default


def env_int_list(key: str, default: list[int]) -> list[int]:
    try:
        val = os.getenv(key)
        if val is None:
            return default
        return list(map(int, json.loads(val)))
    except Exception:
        return default
    
config = {
    "app": {
        'port': os.getenv("PORT"),
    },
    "db": {
        "host": os.getenv("DB_HOST"),
        "port": os.getenv("DB_PORT"),
        "user": os.getenv("DB_USER"),
        "password": os.getenv("DB_PASSWORD"),
        "database": os.getenv("DB_DATABASE"),
        "pool_size": int(os.getenv("POOL_SIZE")) | 8,
        "max_overflow": int(os.getenv("MAX_OVERFLOW")) | 16,
        "pool_recycle": int(os.getenv("POOL_RECYCLE")),
    },
    "jwt": {
        "expired_in": int(os.getenv("JWT_EXPIRATION_DELTA")) | 24, # hour
        "algorithm": os.getenv("JWT_ALGORITHM"),
        "secret_key": os.getenv("JWT_SECRET"),
    },
    "google": {
        "api_key": os.getenv("GOOGLE_API_KEY"),
    },
    "elastic": {
        "url": os.getenv("ELASTIC_URL"),
        "api_key": os.getenv("ELASTIC_API_KEY")
    },
    "evaluation": {
        "weights": {
            "structure": env_float("WEIGHT_STRUCTURE", 0.2),
            "popularity": env_float("WEIGHT_POPULARITY", 0.2),
            "distractor": env_float("WEIGHT_DISTRACTOR", 0.4),
            "ai_adjust_factor": env_float("WEIGHT_AI_ADJUST_FACTOR", 0.8),
        },

        "penalty_for_error": {
            "structure": {
                "missing_question_text": env_float("PENALTY_MISSING_QUESTION_TEXT", 0.4),
                "missing_choice": env_float("PENALTY_MISSING_CHOICE", 0.2),
                "no_correct_answer": env_float("PENALTY_NO_CORRECT_ANSWER", 0.4),
                "empty_choice": env_float("PENALTY_EMPTY_CHOICE", 0.1),
                "duplicated_choices": env_float("PENALTY_DUPLICATED_CHOICES", 0.1),
                "grammar_error": env_float("PENALTY_GRAMMAR_ERROR", 0.05),
            }
        },

        "distractor": {
            "empty_choice_deduction": env_float("DISTRACTOR_EMPTY_CHOICE_DEDUCTION", 0.05),

            "embedding_similarity_thresholds": {
                "too_different": env_float("DISTRACTOR_EMBEDDING_SIMILARITY_TOO_DIFFERENT", 0.35),
                "moderate": env_float("DISTRACTOR_EMBEDDING_SIMILARITY_MODERATE", 0.45),
                "good": env_float("DISTRACTOR_EMBEDDING_SIMILARITY_GOOD", 0.6),
                "strong": env_float("DISTRACTOR_EMBEDDING_SIMILARITY_STRONG", 0.7),
            },

            "paragraph": {
                "length_weight": env_float("DISTRACTOR_PARAGRAPH_LENGTH_WEIGHT", 0.1),
                "difficulty_weight": env_float("DISTRACTOR_PARAGRAPH_DIFFICULTY_WEIGHT", 0.9),

                "vocab_length_thresholds": env_int_list(
                    "DISTRACTOR_PARAGRAPH_VOCAB_LENGTH_THRESHOLDS",
                    [50, 100, 200, 300]
                ),
                "other_length_thresholds": env_int_list(
                    "DISTRACTOR_PARAGRAPH_OTHER_LENGTH_THRESHOLDS",
                    [50, 100, 200, 300]
                ),

                "direct_match_sim": env_float("DISTRACTOR_PARAGRAPH_DIRECT_MATCH_SIM", 0.85),
                "paraphrase_sim": env_float("DISTRACTOR_PARAGRAPH_PARAPHRASE_SIM", 0.5),
                "difficulty_levels": env_int_list(
                    "DISTRACTOR_PARAGRAPH_DIFFICULTY_LEVELS",
                    [1, 3, 5]
                ),
            },

            "lexical_family": {
                "thresholds": {
                    "high_lemma": env_float("DISTRACTOR_LEXICAL_FAMILY_HIGH_LEMMA", 0.9),
                    "high_pos": env_float("DISTRACTOR_LEXICAL_FAMILY_HIGH_POS", 0.9),
                    "medium_high_pos": env_float("DISTRACTOR_LEXICAL_FAMILY_MEDIUM_HIGH_POS", 0.6),
                    "medium_lemma": env_float("DISTRACTOR_LEXICAL_FAMILY_MEDIUM_LEMMA", 0.7),
                    "medium_both": env_float("DISTRACTOR_LEXICAL_FAMILY_MEDIUM_BOTH", 0.4),
                    "low": env_float("DISTRACTOR_LEXICAL_FAMILY_LOW", 0.3),
                },
                "scores": {
                    "high_lemma": env_float("DISTRACTOR_LEXICAL_FAMILY_HIGH_LEMMA_SCORE", 0.75),
                    "high_pos": env_float("DISTRACTOR_LEXICAL_FAMILY_HIGH_POS_SCORE", 0.9),
                    "medium_high_pos": env_float("DISTRACTOR_LEXICAL_FAMILY_MEDIUM_HIGH_POS_SCORE", 0.7),
                    "medium_lemma": env_float("DISTRACTOR_LEXICAL_FAMILY_MEDIUM_LEMMA_SCORE", 0.6),
                    "medium_both": env_float("DISTRACTOR_LEXICAL_FAMILY_MEDIUM_BOTH_SCORE", 0.45),
                    "low": env_float("DISTRACTOR_LEXICAL_FAMILY_LOW_SCORE", 0.3),
                },
            },
        },
    }
}