Что если бы вы могли запустить полный, сквозной конвейер анализа настроений — от исходного текста до окончательного прогноза — всего за три простых шага? Именно для решения этой проблемы я и разработал свой новый пакет на Python, quick_sentiments . Он обрабатывает все сложные и трудоемкие задачи очистки текста, векторизации и машинного обучения «под капотом» , позволяя вам сосредоточиться на результатах, а не на рутинной работе.
Если вы создавали проект анализа настроений с нуля, вы знаете, с чего начать. Вам приходится одновременно импортировать библиотеки из nltk, scikit-learn и других, и вы надеетесь, что обновление библиотеки не нарушит вашу среду. quick_sentiments разработан для решения этой проблемы. Он абстрагирует процесс настройки, управляя всеми зависимостями и сложными вызовами функций за вас.
Вы можете установить этот пакет в Python, используя приведенный ниже код.
!pip install quick-sentiments
#ИЛИ
git clone https://github.com/AlabhyaMe/quick_sentiments.gitp
ШАГ 1: Предварительная обработка
Итак, перейдем к первому шагу: предварительной обработке. Прежде чем модель сможет понимать текст, его необходимо очистить. Это критически важный, но трудоемкий этап, включающий в себя целый ряд задач: удаление HTML-тегов, удаление эмодзи и знаков препинания, обработка стоп-слов, лемматизация и стандартизация регистра. Чистый текст — это необходимая основа для любой высококачественной векторизации и, в конечном итоге, для точной модели.
Как видно из примера, использование pre_processфункций невероятно просто.
import polars as pl
#IMPORT pre_process from quick_sentiments
from quick_sentiments import pre_process
df_train = pl.read_csv( "yourpath.csv" ,encoding= 'ISO-8859-1' )
response_column = "reviewText"
sentiment_column = "sentiment"
#USING pre_process
df_train = df_train.with_columns(
pl.col(response_column).map_elements( lambda x: pre_process(x, remove_brackets= True )).alias( "processed" ) #add inside the map_elements
)
Подумайте, что обычно требуется для очистки текста с нуля. Вам придётся импортировать reрегулярное выражение для обработки URL-адресов, ещё одно регулярное выражение для HTML-тегов, импортировать модуль nltkдля загрузки и инициализации списка стоп-слов, ещё один nltk модуль для лемматизатора… это долгая и утомительная настройка, которую приходится писать для каждого проекта.
quick_sentimentsЭтот инструмент сводит весь процесс к одной легко настраиваемой функции. Просто посмотрите на возможности управления, которые открываются сразу после установки:
def pre_process ( doc,
remove_brackets = True ,
remove_urls = True ,
remove_html = True , lemmatize = True , remove_stop_words = True , remove_nums = False , ... # и многое другое return_string = True ) : #КОД ДЛЯ ВСЕГО ЭТОГО НАПИСАНО ВАМИ ВНУТРИ ПАКЕТА.
Вы также можете посмотреть код здесь .
Эта единственная функция представляет собой полный конвейер очистки. В нашем polarsпримере мы использовали значения по умолчанию, но специально установили remove_brackets=True. Что делать, если вашей конкретной задаче необходимо сохранять числа в тексте? Просто передайте remove_nums=False. Хотите пропустить этап лемматизации, чтобы ускорить процесс? lemmatize=False.
От нормализации символов Юникода и удаления эмодзи до токенизации и лемматизации — pre_processобрабатывает весь список задач одним простым и понятным вызовом.
Эта чистая, токенизированная строка теперь является идеальной основой для нашего следующего шага: векторизации.
ШАГ 2: Разделение данных, запуск векторизации, модели машинного обучения, точность.
Теперь перейдём к мощной части пакета quick_sentiments. После предварительной обработки остаётся «сложная середина» машинного обучения: разделение данных, векторизация, обучение модели и оценка. Именно здесь большинство проектов замедляются, и здесь вступает в действие функция run_pipeline() .
Эта единственная функция берет на себя всю эту сложность. Что особенно важно, она выполняет разделение на обучающую и тестовую выборки перед векторизацией, что является правильным способом предотвращения утечки данных и получения надежной оценки производительности вашей модели.
Вам нужно лишь предоставить данные, назвать столбцы и — что наиболее важно — выбрать эксперимент.
Хотите протестировать классический TF-IDF с помощью логистической регрессии? Или сразу перейти к 100-мерным эмбеддингам GloVe с использованием нейронной сети? Или пойти дальше и использовать 300-мерный Word2Vec? Просто спросите.
Ниже представлен полный список методов векторизации и моделей машинного обучения, которые уже созданы и готовы к использованию:
- Методы векторизации (
vectorizer_name): "bow"Мешок слов"tf"Частота терминов"tfidf": TF-IDF"wv": Word2Vec (обучено на ваших данных) (Загрузится, если у вас его еще нет)"glove_25","glove_50","glove_100","glove_200": Предварительно обученные эмбеддинги GloVe в различных измерениях- Модели машинного обучения (
model_name): "logit": Логистическая регрессия"rf": Случайный лес"xgb": XGBoost"nn"Простая нейронная сеть
Вся эта мощь заключена в одном простом вызове функции:
dt = run_pipeline(
vectorizer_name = "glove_25" , # BOW, tf, tfidf, wv, glove_25,glove_50, glove_100, gl0ve_200
model_name = "logit" , # logit, rf, XGB, nn
df = df_train,
text_column_name = "processed" , # это имя столбца текстовых данных,
sentiment_column_name = "sentiment" ,
perform_tuning = False # установите значение true, если хотите выполнить настройку гиперпараметров, это займет больше времени и
# может привести к нехватке памяти, если набор данных большой
)
Код можно найти здесь .
#ЭТО ТО, ЧТО возвращает run_pipeline. Это важно для прогнозирования.
return {
"model_object" : trained_model_object,
"vectorizer_name" : vectorizer_name,
"vectorizer_object" : fitted_vectorizer_object,
"label_encoder" : label_encoder,
"y_test" : y_test,
"y_pred" : y_pred,
"accuracy" : accuracy_score(y_test, y_pred),
"report" : classification_report(y_test, y_pred, output_dict= True , target_names=label_encoder.classes_)
}
Ещё одна ключевая особенность функции run_pipeline заключается не только в том, что она делает, но и в том, что она вам возвращает. После завершения функция возвращает единый, мощный словарь Python, содержащий все ваши обученные «артефакты».
Это означает, что обученный векторизатор, обученная модель, кодировщик меток и даже названия столбцов — всё это упаковано и возвращается. Это невероятно важно, потому что это «мозг», который вы только что обучили, сохранённый в коробке и готовый к использованию на новых, ранее не встречавшихся данных.
Таким образом, на данном этапе наш основной рабочий процесс анализа настроений завершен всего двумя функциями. С помощью всего лишь pre_process и run_pipeline мы успешно очистили, векторизовали, обучили и оценили модель на нашем исходном наборе данных.
Но как насчет прогнозирования на совершенно новых данных? Именно здесь quick_sentiments упрощает следующий шаг. Хотя вам, конечно, потребуется пропустить ваш новый необработанный текст через ту же функцию pre_process, вам не придется ничего переобучать. Объект «artifact», который возвращает run_pipeline, содержит все необходимые компоненты для мгновенного применения правильной векторизации и модели к вашим новым данным, обеспечивая согласованность всего процесса от начала до конца.
ШАГ 3: Результат — Прогнозирование на основе новых, ранее не встречавшихся данных
#ПРЕДВАРИТЕЛЬНАЯ ОБРАБОТКА НОВЫХ ДАННЫХ
new_data = new_data.with_columns(
pl.col(response_column).map_elements( lambda x: pre_process(x, remove_brackets= True )).alias( "processed" ) #добавьте внутрь map_elements
)
Мы успешно обучили и оценили модель на нашем наборе данных, и наша run_pipeline()функция вернула словарь Python (который мы сохранили как dt), содержащий все наши обученные «артефакты».
Теперь пришло время применить этот натренированный «мозг» к совершенно новым, реальным данным.
Это последний шаг, и quick_sentimentsон делает все так же просто, как и первые два. После того, как вы пропустили свой новый, необработанный текст через ту же pre_process()функцию (чтобы убедиться в идентичности очистки), вы готовы к финальной команде в одну строку:
# Объект 'dt' — это словарь, возвращаемый вызовом run_pipeline()
predictions_df = make_predictions(
new_data=new_data,
text_column_name= "processed" ,
vectorizer=dt[ "vectorizer_object" ],
best_model=dt[ "model_object" ],
label_encoder=dt[ "label_encoder" ],
prediction_column_name= "sentiment_predictions" # Вы можете присвоить имя выходному столбцу
)
Что происходит «под капотом»?
Именно в этом одном make_predictions()вызове проявляется вся мощь конвейера. Давайте рассмотрим аргументы, чтобы понять, почему он так надежен:
vectorizer=dt["vectorizer_object"]Вы передаете фактический обученный векторизатор , созданный на ваших данных.best_model=dt["model_object"]Вы передаете фактически обученную модель .label_encoder=dt["label_encoder"]Вы передаете в качестве входных данных кодировщик меток , чтобы правильно сопоставить выходные данные с вашими исходными метками (например, «положительный», «отрицательный»).
Эта конструкция избавляет от необходимости писать весь повторяющийся код для векторизации и прогнозирования. Но что еще важнее, она устраняет наиболее распространенные и опасные ошибки в машинном обучении.
Как? Передавая подобранные детали , вы исключаете возможность ошибки. Вам не о чем беспокоиться:
- «Я случайно перенастроил векторизатор под новые данные?»
- «Использую ли я те же самые данные
ngram_range,max_featuresчто и для обучения?» - «Использую ли я модель с наилучшими гиперпараметрами или только с параметрами по умолчанию?»
Эта make_predictions()функция гарантирует, что ваши новые данные будут обработаны точно таким же, согласованным способом, как и исходные обучающие данные. Риск ошибки здесь сводится к нулю, поскольку вся сложная работа выполняется за вас «под капотом».
Таким образом, у вас появляется новый фрейм данных с новым столбцом прогнозов. Всего за три основных шага — pre_process(), run_pipeline(), и make_predictions()— мы завершили весь процесс анализа настроений, от исходного текста до реальных, надежных прогнозов.
Полный исходный код можно найти по адресу: https://github.com/AlabhyaMe/quick_sentiments







