Описание. В этом проекте мы создадим инструмент, способный классифицировать настроение (положительное или отрицательное) заданного текста с использованием методов машинного обучения. Мы будем использовать популярную библиотеку scikit-learn для создания и обучения модели классификатора с использованием набора данных с помеченными обзорами фильмов и набор инструментов Natural Language Toolkit (NLTK) для предварительной обработки текстовых данных.

Шаг 1. Во-первых, давайте установим необходимые библиотеки и загрузим список стоп-слов NLTK.

!pip install scikit-learn nltk
!python -m nltk.downloader stopwords

Шаг 2. Затем давайте импортируем библиотеки и определим функцию для предварительной обработки текстовых данных с использованием списка стоп-слов NLTK и стеммера Porter. Эта функция принимает список строк и возвращает список предварительно обработанных строк.

from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
stop_words = stopwords.words('english')
stemmer = PorterStemmer()
def preprocess_text(texts):
  processed_texts = []
  for text in texts:
    text = text.lower()
    text = [stemmer.stem(word) for word in text.split() if word not in stop_words]
    processed_texts.append(' '.join(text))
  return processed_texts

Шаг 3. Теперь воспользуемся scikit-learn для загрузки и разделения набора данных обзора фильмов на наборы для обучения и тестирования.

from sklearn.datasets import load_files
from sklearn.model_selection import train_test_split
reviews = load_files('movie_reviews')
X, y = reviews.data, reviews.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Шаг 4. Теперь давайте предварительно обработаем текстовые данные с помощью функции, определенной на шаге 2, и векторизируем их с помощью TfidfVectorizer от scikit-learn.

from sklearn.feature_extraction.text import TfidfVectorizer
X_train = preprocess_text(X_train)
X_test = preprocess_text(X_test)
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(X_train)
X_test = vectorizer.transform(X_test)

Шаг 5. Теперь воспользуемся классификатором LogisticRegression scikit-learn для обучения модели предварительно обработанным и векторизованным текстовым данным.

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

Шаг 6. Продолжая предыдущий фрагмент кода, добавим еще несколько строк кода, чтобы оценить производительность модели классификатора на тестовом наборе.

from sklearn.metrics import accuracy_score
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Model accuracy: {accuracy:.2f}')

Шаг 7. Наконец, давайте определим функцию для классификации тональности заданного текста с использованием обученной модели. Эта функция будет принимать строку текста, предварительно обрабатывать ее с помощью функции, определенной на шаге 2, векторизовать ее с помощью TfidfVectorizer и передавать в классификатор для создания прогноза.

def classify_sentiment(text):
  preprocessed_text = preprocess_text([text])
  vectorized_text = vectorizer.transform(preprocessed_text)
  prediction = classifier.predict(vectorized_text)[0]
  return 'positive' if prediction == 1 else 'negative'

С помощью этих шагов у вас должен быть работающий инструмент анализа тональности, способный классифицировать тональность заданного текста с помощью методов машинного обучения. Вы можете поэкспериментировать с различными моделями классификаторов и методами предварительной обработки, чтобы попытаться повысить точность инструмента.