File size: 2,195 Bytes
cc8a450
ae51d62
 
b4f3263
 
 
 
d5114e6
ae51d62
 
 
 
 
 
 
 
 
 
 
 
d5114e6
 
 
 
cc8a450
 
 
 
 
ae51d62
d5114e6
 
 
 
ae51d62
d5114e6
 
 
 
 
 
ae51d62
 
 
 
 
 
 
b4f3263
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d5114e6
 
 
 
 
b4f3263
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
from fastapi import FastAPI, Response, status
from pydantic import BaseModel
from hypothesis import BaseModelHypothesis
from random_forest_dependencies import RandomForestDependencies
from random_forest_model import RandomForestModel
from main_model import PredictMainModel
import numpy as np
from typing import List

app = FastAPI()


class PredictRequest(BaseModel):
    question: str
    answer: str
    backspace_count: int
    typing_duration: int
    letter_click_counts: dict[str, int]


class RequestModel(BaseModel):
    instances: List[PredictRequest]


@app.get("/health")
async def is_alive():
    return Response(status_code=status.HTTP_200_OK)


@app.post("/predict")
async def predict(request: RequestModel):
    responses = [process_instance(data) for data in request.instances]
    return {"predictions": responses}


def process_instance(data: PredictRequest):
    question = data.question
    answer = data.answer
    backspace_count = data.backspace_count
    typing_duration = data.typing_duration
    letter_click_counts = data.letter_click_counts

    hypothesis = BaseModelHypothesis()
    features_normalized_text_length = hypothesis.calculate_normalized_text_length_features(
        answer)
    features_not_normalized = hypothesis.calculate_not_normalized_features(
        answer)

    combined_additional_features = np.concatenate(
        (features_normalized_text_length, features_not_normalized), axis=1)

    main_model = PredictMainModel()
    main_model_probability = main_model.predict(
        answer, combined_additional_features)

    random_forest_features = RandomForestDependencies()
    secondary_model_features = random_forest_features.calculate_features(
        question, answer, main_model_probability, backspace_count, typing_duration, letter_click_counts)

    secondary_model = RandomForestModel()
    secondary_model_prediction = secondary_model.predict(
        secondary_model_features)

    return {
        "prediction_class": "AI" if secondary_model_prediction == 1 else "HUMAN",
        "details": {
            "main_model_probability": main_model_probability,
            "final_prediction": secondary_model_prediction
        }
    }