File size: 3,666 Bytes
4a36ad2
 
7c603fe
 
 
ea6fb88
7c603fe
4a36ad2
 
 
cf91668
7c603fe
4a36ad2
 
 
fa3a00b
4a36ad2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7c603fe
4a36ad2
7c603fe
 
bc8831f
4a36ad2
bc8831f
4a36ad2
bc8831f
 
4a36ad2
bc8831f
4a36ad2
bc8831f
 
4a36ad2
bc8831f
91c5333
bc8831f
 
4a36ad2
bc8831f
4a36ad2
bc8831f
91c5333
7c603fe
4a36ad2
7c603fe
 
 
4a36ad2
7c603fe
 
 
4a36ad2
 
 
 
 
 
 
7c603fe
4a36ad2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# func_ai.py

import requests
import torch
from transformers import pipeline
from deep_translator import GoogleTranslator
import time
import os
from datetime import datetime

VECTOR_API_URL = os.getenv('API_URL')

def log_message(message):
    timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"[{timestamp}] {message}")

# Инициализация моделей
def init_models():
    log_message("Инициализация моделей AI.")
    sentiment_model = pipeline(
        'sentiment-analysis',
        model='cardiffnlp/twitter-xlm-roberta-base-sentiment',
        tokenizer='cardiffnlp/twitter-xlm-roberta-base-sentiment',
        device=0 if torch.cuda.is_available() else -1
    )
    
    classifier = pipeline(
        "zero-shot-classification",
        model="valhalla/distilbart-mnli-12-6",
        device=0 if torch.cuda.is_available() else -1
    )
    return sentiment_model, classifier

sentiment_model, classifier = init_models()

def classify_comment(text):
    if not text:
        log_message("Получен пустой текст для классификации.")
        return "non-interrogative"
    log_message(f"Классификация комментария: {text}")
    try:
        translated_text = GoogleTranslator(source='auto', target="en").translate(text)
        log_message(f"Переведенный текст: {translated_text}")
    except Exception as e:
        log_message(f"Ошибка при переводе: {e}")
        return "non-interrogative"
    if not translated_text:
        log_message("Перевод вернул пустой текст.")
        return "non-interrogative"
    
    try:
        result = classifier(translated_text, ["interrogative", "non-interrogative"], clean_up_tokenization_spaces=True)
        log_message(f"Результат классификации: {result}")
    except Exception as e:
        log_message(f"Ошибка при классификации: {e}")
        return "non-interrogative"
    
    top_class = result['labels'][0]
    log_message(f"Верхний класс: {top_class}")
    return top_class

def analyze_sentiment(comments):
    log_message("Начинаем анализ настроений.")
    results = []
    for i in range(0, len(comments), 50):
        batch = comments[i:i + 50]
        log_message(f"Анализируем батч с {i} по {i + len(batch)} комментарий: {batch}")
        try:
            batch_results = sentiment_model(batch)
            log_message(f"Результаты батча: {batch_results}")
            results.extend(batch_results)
        except Exception as e:
            log_message(f"Ошибка при анализе настроений батча: {e}")
        time.sleep(1)  # Задержка для предотвращения перегрузки
    log_message("Анализ настроений завершен.")
    return results

def retrieve_from_vdb(query):
    log_message(f"Отправка запроса к FastAPI сервису: {query}")
    try:
        response = requests.post(f"{VECTOR_API_URL}/search/", json={"query": query})
        if response.status_code == 200:
            results = response.json().get("results", [])
            log_message(f"Получено {len(results)} результатов: {results}")
            return results
        else:
            log_message(f"Ошибка при поиске: {response.text}")
            return []
    except Exception as e:
        log_message(f"Ошибка при запросе к векторной базе данных: {e}")
        return []