from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import TextAreaField, SubmitField
from wtforms.validators import DataRequired
import re
import pandas as pd
from nltk.tokenize import word_tokenize
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
# Создание экземпляра приложения Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key' # Задайте секретный ключ для защиты формы
# Функция предварительной обработки текста
def clean_text(text):
# Приведение текста к нижнему регистру
text = text.lower()
# Удаление лишних символов и знаков препинания
text = re.sub(r"[^а-яА-Яa-zA-Z0-9ёЁ]+", ' ', text)
return text
# Функция токенизации текста
def tokenize_text(text):
# Токенизация текста
tokens = word_tokenize(text)
return tokens
# Функция обучения модели классификации
def train_classifier(features, labels):
# Используем метод опорных векторов (SVM) для классификации
model = SVC(kernel='linear')
model.fit(features, labels)
return model
# Загрузка данных из файла Excel
file_path = r"C:\Users\Stepan\Documents\WS.xlsx" # Укажите путь к вашему файлу Excel
df = pd.read_excel(file_path)
# Предварительная обработка и векторизация текста из датасета
texts = df["Текст"].tolist()
texts = [clean_text(text) for text in texts]
texts = [' '.join(tokenize_text(text)) for text in texts]
tfidf_vectorizer = TfidfVectorizer()
tfidf_features = tfidf_vectorizer.fit_transform(texts)
# Обучение модели классификации
model = train_classifier(tfidf_features, df["Категория"])
# Функция определения категории для нового текста
def determine_category(text):
# Предварительная обработка и векторизация нового текста
cleaned_text = clean_text(text)
tokenized_text = tokenize_text(cleaned_text)
vectorized_text = tfidf_vectorizer.transform([' '.join(tokenized_text)])
# Предсказание категории
category = model.predict(vectorized_text)
return category[0]
# Создание формы ввода текста
class TextForm(FlaskForm):
text = TextAreaField('Введите текст обращения', validators=[DataRequired()])
submit = SubmitField('Отправить')
# Устанавливаем папку для статических файлов
app.static_folder = 'static'
# Определение маршрута для обработки запросов
@app.route('/', methods=['GET', 'POST'])
def index():
form = TextForm()
category = None
if form.validate_on_submit():
text = form.text.data
category = determine_category(text)
return render_template('index.html', form=form, category=category)
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ЖКХ Обращения</title>
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
</head>
<body>
<div class="container">
<h1 class="title">Определение категории обращения ЖКХ</h1>
<div class="form-container">
<form method="POST" action="/">
{{ form.hidden_tag() }}
<div class="input-group">
<label for="text">Введите текст обращения:</label><br>
{{ form.text(size=50) }}<br>
</div>
<button type="submit" class="submit-btn">Отправить</button>
</form>
</div>
{% if category %}
<div class="category-container">
<h2 class="category">Категория: {{ category }}</h2>
</div>
{% endif %}
</div>
</body>
</html>