File size: 1,929 Bytes
86a2576
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# =======================
# IMPORTS
# =======================
import joblib
import re
from urllib.parse import urlparse
import tldextract
from PyPDF2 import PdfReader

# =======================
# LOAD MODEL
# =======================
model = joblib.load("test_model.joblib")

# =======================
# URL FEATURES
# =======================
def extract_url_features(url):
    parsed = urlparse(url)
    ext = tldextract.extract(url)
    return {
        "url_length": len(url),
        "num_dots": url.count("."),
        "has_ip": bool(re.search(r"\d+\.\d+\.\d+\.\d+", url)),
        "https": parsed.scheme == "https",
        "domain_length": len(ext.domain)
    }

# =======================
# PDF TEXT EXTRACTION
# =======================
def extract_pdf_text(pdf_path):
    text = ""
    reader = PdfReader(pdf_path)
    for page in reader.pages:
        text += page.extract_text() or ""
    return text[:500]  # limit for cloud

# =======================
# PREDICTION FUNCTION
# =======================
def predict(data):
    """

    Expects JSON input:

    {"inputs": {"text": "...", "url": "...", "pdf_path": "..."}}

    pdf_path is optional if sending a PDF file

    """
    text = data["inputs"].get("text", "")
    url = data["inputs"].get("url", "")
    pdf_path = data["inputs"].get("pdf_path", "")

    # URL features
    url_features = extract_url_features(url) if url else {}

    # PDF text (optional)
    pdf_text = extract_pdf_text(pdf_path) if pdf_path else ""

    # Combine text + PDF text
    combined_text = text + " " + pdf_text

    # ML prediction
    pred = model.predict([combined_text])[0]
    prob = model.predict_proba([combined_text])[0][1]

    return {
        "prediction": int(pred),
        "probability": float(prob),
        "url_features": url_features,
        "pdf_text_sample": pdf_text[:100]  # sample only
    }