Вопрос или проблема
Я делаю небольшой ПOC, в котором я обучил свою модель машинного обучения (Наивный Байес) и сохранил в формате “.pkl” (pickle). Теперь моя следующая задача — разработать веб-приложение, которое будет запрашивать у пользователя ввод текста для анализа классификации текста. Этот новый (от пользователя) “ТЕКСТ” будет тестовым набором данных, который можно подать модели Наивного Байеса, которую я построил на предыдущем этапе, и сделать предсказание.
Существует ли способ преобразовать текст (взятый от пользователя) в массив numpy, а затем преобразовать этот массив numpy с помощью CountVectorizer()
(который использовался для обучающего набора данных) и затем подать его в сохраненную модель для предсказаний?
Я хочу создать приложение на Angular, такое как это, где входные данные — это изображение, которое можно преобразовать в пиксели.
В моем случае это простой текст, который необходимо преобразовать в массив NumPy в приложении Angular, прежде чем я подам его в обученную модель Наивного Байеса.
При развертывании модели в производственной среде аналогичные шаги трансформации данных должны выполняться как во время обучения, так и во время предсказания.
Scikit-learn имеет класс Pipeline, который упрощает эту задачу.
Что-то вроде:
import pickle
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import GaussianNB
from sklearn.pipeline import Pipeline
pipeline = Pipeline(
[
("vect", CountVectorizer()),
("clf", GaussianNB()),
]
)
# Обучение
pipe.fit(X_train, y_train)
saved_model = pickle.dumps(clf)
# Предсказание в приложении
pipe = pickle.loads(saved_model)
pipe.predict(X)
Ответ или решение
Интеграция NLP и Angular приложения
Ваша задача по созданию веб-приложения для классификации текста на основе модели машинного обучения звучит увлекательно и имеет потенциал для значительного расширения. Давайте рассмотрим, как можно интегрировать вашу модель Naive Bayes, которая была сохранена в формате .pkl
, с приложением на Angular.
1. Архитектура решения
Ваша архитектура будет включать два основных компонента:
- Фронтенд: Angular-приложение, предназначенное для захвата текста от пользователя и отображения результатов.
- Бэкенд: Серверное приложение, которое будет выполнять работу по предсказанию, используя вашу модель.
2. Выбор технологий для бэкенда
Рекомендую использовать такие популярные технологии, как Flask или Django (Python), поскольку они обеспечивают простую интеграцию с библиотеками для машинного обучения, такими как Scikit-learn.
Пример использования Flask:
-
Создайте виртуальную среду и установите зависимости:
python -m venv venv source venv/bin/activate pip install flask scikit-learn flask-cors
-
Импортируйте необходимые библиотеки и загружайте модель:
import pickle from flask import Flask, request, jsonify from sklearn.feature_extraction.text import CountVectorizer app = Flask(__name__) # Загружаем модель with open('model.pkl', 'rb') as model_file: model = pickle.load(model_file) @app.route('/predict', methods=['POST']) def predict(): data = request.get_json() text = data['text'] prediction = model.predict([text]) return jsonify({'prediction': prediction[0]})
-
Запустите сервер:
if __name__ == '__main__': app.run(debug=True)
3. Реализация Angular приложения
Теперь перейдем к фронтенду. Вам нужно создать Angular-приложение, которое будет отправлять текст на сервер и получать прогноз.
Шаги по созданию Angular-приложения:
-
Создайте новое Angular приложение:
ng new text-classification-app cd text-classification-app ng serve
-
Добавьте сервис для общения с API:
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class PredictionService { private apiUrl = 'http://localhost:5000/predict'; constructor(private http: HttpClient) {} getPrediction(text: string): Observable<any> { return this.http.post(this.apiUrl, { text }); } }
-
Создайте компонент для ввода текста и отображения результата:
import { Component } from '@angular/core'; import { PredictionService } from './prediction.service'; @Component({ selector: 'app-root', template: ` <div> <h1>Классификация текста</h1> <textarea [(ngModel)]="userInput"></textarea> <button (click)="getPrediction()">Предсказать</button> <p>Результат: {{ prediction }}</p> </div> `, styles: [] }) export class AppComponent { userInput: string = ''; prediction: string = ''; constructor(private predictionService: PredictionService) {} getPrediction() { this.predictionService.getPrediction(this.userInput).subscribe(response => { this.prediction = response.prediction; }); } }
4. Переход к формату NumPy
Ваш вопрос о преобразовании текста в массив NumPy и применении CountVectorizer
в Angular вводит некоторые сложности, поскольку CountVectorizer
– это компонент Python, а не JavaScript. Вместо этого работа по векторизации текста должна быть выполнена на стороне бэкенда. Бэкенд будет обрабатывать входящий текст, используя CountVectorizer
, перед тем как передать его в модель, что гарантирует, что используемые шаги совпадают с этапами тренировки.
Заключение
Ваша интеграция NLP и Angular-приложения требует четкого разделения задач и использования двух технологий: фронтенда и бэкенда. С помощью этого подхода вы сможете полноценно использовать вашу обученную модель на базе Naive Bayes. Не забывайте о важности этапов векторизации и предсказания, которые должны проходить на серверной стороне, что обеспечит корректность и стабильность работы системы.