Py.Cafe

Interactive FAQ with Flask and FuzzyWuzzy

DocsPricing
  • static/
  • app.py
  • data.txt
  • requirements.txt
app.py
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
from flask import Flask, request, jsonify, render_template
from fuzzywuzzy import process
import os

app = Flask(__name__)
@app.after_request
def apply_cors_and_security_headers(response):
    # Permite iframe DOAR pe domeniul specific
    response.headers['Content-Security-Policy'] = "frame-ancestors 'self' http://chat-widget.liveblog365.com"
    # Alte măsuri de securitate (opționale)
    response.headers['X-Content-Type-Options'] = 'nosniff'
    response.headers['X-Frame-Options'] = 'ALLOWALL'  # Permite toate iframe-urile
    return response


priority_keywords = [
    "synlab", "ioana tudora", "marin predescu", "programari", "marinescu",
    "tocilescu", "serbanica", "andrei", "bacanu", "ionescu",
    "nicolau", "tarciatu", "mihail tocilescu", "alexandru", "adresa",
    "laptop", "frigider", "spania", "spaniei", "franta", "frantei", "oftalmolog",
    "germania", "germaniei""grecia", "greciei", "italia", "italiei",
    "slapi", "Televizor", "Usa interior", "chirurg", "dermatolog", "neurolog"
]
exclude_keywords = {"e","la", "in", "cu", "de", "si", "etaj", "ce", "am","sunt",
                    "ma", "populatia", "capitala", "luni", "marti","cumpara",
                    "miercuri", "joi", "vineri", "suprafata", "sa", "tel", "mea",
                    "lei", "km2", "suprafata", "limba", "dr.", "dr", "doctor" }

# Ruta pentru pagina principală
@app.route('/')
def home():
    return render_template('index.html')

# Endpoint pentru chatbot
@app.route('/ask_chatbot', methods=['POST'])
def ask_chatbot():
    user_question = request.json.get('question', '').lower()

    # Calea absolută către fișierul `data.txt`
    file_path_txt = os.path.join(os.path.dirname(__file__), 'data.txt')

    try:
        # Citim și procesăm conținutul fișierului text
        with open(file_path_txt, 'r', encoding='utf-8') as file:
            site_content = file.read().lower()

        # Creăm o listă de linii din fișier
        site_lines = site_content.split('\n')

        # Împărțim întrebarea în cuvinte și căutăm keyword-uri prioritare
        question_words = user_question.split()
        matched_keywords = [word for word in question_words if word in priority_keywords]
        matched_keywords = [word for word in question_words if not word in exclude_keywords]

        # Verificăm dacă întrebarea conține cuvinte din `data.txt`
        if not any(word in site_content for word in question_words):
            response = "Îmi pare rău, nu am găsit un răspuns potrivit."
        else:
            # Dacă există keyword-uri prioritare, prioritizăm liniile care le conțin
            if matched_keywords:
                filtered_lines = [line for line in site_lines if any(keyword in line for keyword in matched_keywords)]

            else:
                # Filtrăm și liniile care conțin cuvintele din exclude_keywords
                filtered_lines = site_lines

            # Găsim cea mai bună potrivire din liniile filtrate
            best_match = process.extractOne(user_question, filtered_lines)

            # Verificăm dacă similaritatea este acceptabilă
            if best_match and best_match[1] > 56:  # Prag ajustat la 55
                response = f"{best_match[0]}"
            else:
                response = "Îmi pare rău, nu am găsit un răspuns potrivit."

    except FileNotFoundError:
        response = "Fișierul data.txt nu a fost găsit. Verificați dacă există în directorul aplicației."

    return jsonify({"answer": response})

if __name__ == '__main__':
    app.run(debug=True)