В этом руководстве мы будем очищать веб-сайт и использовать обработку естественного языка для анализа текстовых данных.

Конечным результатом будет анализ настроений контента веб-сайта. Вот шаги, которые мы будем выполнять:

  1. Объем проекта
  2. Требуемые библиотеки
  3. Понимание парсинга веб-страниц
  4. Парсинг веб-сайта
  5. Очистка текста и предварительная обработка
  6. Анализ настроений с использованием машинного обучения
  7. Конечный результат

1. Объем проекта

Цель этого проекта — очистить веб-сайт, выполнить предварительную обработку текста, а затем применить алгоритмы машинного обучения для анализа тональности содержимого веб-сайта.

Другими словами, мы хотим определить, имеет ли текстовый контент на веб-сайте положительную, отрицательную или нейтральную окраску.

Для этого мы будем использовать Python и несколько библиотек для парсинга веб-страниц и машинного обучения.

2. Необходимые библиотеки

Для этого проекта потребуются следующие библиотеки:

  • запросы: делать HTTP-запросы на сайт
  • BeautifulSoup: для анализа документов HTML и XML
  • pandas: для работы с фреймами данных
  • nltk: для обработки естественного языка
  • scikit-learn: для обучения моделей машинного обучения

Вы можете установить эти библиотеки с помощью pip:

pip install requests beautifulsoup4 pandas nltk scikit-learn

3. Понимание парсинга веб-страниц

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

Поэтому мы используем программное обеспечение для автоматизации процесса. В Python мы используем такие библиотеки, как requests и BeautifulSoup, для парсинга веб-сайтов.

Существует два типа парсинга веб-страниц:

  • Статический парсинг: мы извлекаем веб-сайт с фиксированным содержанием.
  • Динамический парсинг: мы извлекаем данные с веб-сайта, содержание которого часто меняется или создается динамически.

Для этого проекта мы будем выполнять статическую очистку.

4. Парсинг веб-сайта

Для начала нам нужно найти веб-сайт, который мы хотим парсить. Для этого урока мы будем собирать новостные статьи из BBC News. Мы будем очищать раздел «Технологии» веб-сайта.

Вот код для парсинга сайта:

import requests
from bs4 import BeautifulSoup

url = "https://www.bbc.com/news/technology"
response = requests.get(url)

soup = BeautifulSoup(response.text, "html.parser")
articles = soup.find_all("article")

for article in articles:
    headline = article.find("h3").text.strip()
    summary = article.find("p").text.strip()
    print(headline)
    print(summary)
    print()

Давайте разберем этот код:

  • Сначала мы импортируем запросы и библиотеки BeautifulSoup.
  • Мы определяем URL-адрес веб-сайта, который мы хотим очистить
  • Мы используем request.get(), чтобы сделать HTTP-запрос на веб-сайт и получить HTML-контент.
  • Мы создаем объект BeautifulSoup из содержимого HTML
  • Мы используем find_all(), чтобы получить все статьи на странице.
  • Мы перебираем каждую статью и извлекаем заголовок и резюме.
  • Печатаем заголовок и резюме для каждой статьи

Когда мы запустим этот код, мы должны увидеть заголовки и резюме статей, напечатанных в консоли.

5. Очистка текста и предварительная обработка

Прежде чем мы сможем выполнить анализ настроений, нам нужно очистить и предварительно обработать текстовые данные. Это включает в себя следующие шаги:

  • Удаление тегов HTML
  • Преобразование всего текста в нижний регистр
  • Удаление знаков препинания
  • Удаление стоп-слов (обычные слова, такие как «the», «a», «an» и т. д.)
  • Выделение или лемматизация текста (приведение слов к их корневой форме)

Вот код для очистки текста и предварительной обработки:

import re
from nltk.corpus import stopwords
from nltk.stem import SnowballStemmer
from nltk.tokenize import word_tokenize

stemmer = SnowballStemmer("english")
stop_words = set(stopwords.words("english"))

def clean_text(text):
    # Remove HTML tags
    text = re.sub(r"<.*?>", "", text)
    # Convert to lowercase
    text = text.lower()
    # Remove punctuation
    text = re.sub(r"[^\w\s]", "", text)
    # Remove stopwords and stem words
    tokens = word_tokenize(text)
    tokens = [stemmer.stem(word) for word in tokens if word not in stop_words]
    # Join tokens back into a string
    text = " ".join(tokens)
    return text

Давайте разберем этот код:

  • Сначала мы импортируем библиотеку регулярных выражений (re), корпус стоп-слов и SnowballStemmer из библиотеки NLTK и функцию word_tokenize из модуля nltk.tokenize.
  • Мы определяем объект SnowballStemmer с языком, установленным на «английский», который будет использоваться для вывода слов.
  • Мы определяем набор стоп-слов, которые необходимо удалить из текстовых данных.
  • Мы определяем функцию с именем clean_text(), которая принимает строку текста.
  • Внутри функции мы используем регулярные выражения для удаления любых тегов HTML.
  • Мы преобразуем текст в нижний регистр, используя метод lower().
  • Убираем знаки препинания с помощью регулярных выражений
  • Мы разбиваем текст на отдельные слова, используя метод word_tokenize() из модуля nltk.tokenize.
  • Мы определяем каждое слово с помощью объекта SnowballStemmer и удаляем стоп-слова.
  • Наконец, мы соединяем слова с основой обратно в строку, используя метод join().

6. Анализ настроений с использованием машинного обучения

Теперь, когда мы очистили и предварительно обработали текстовые данные, мы можем выполнить анализ тональности с помощью машинного обучения.

Мы будем использовать библиотеку scikit-learn для анализа настроений.

Во-первых, нам нужно разделить данные на наборы для обучения и тестирования. Мы будем использовать 80 % данных для обучения и 20 % для тестирования.

Вот код для разделения данных:

from sklearn.model_selection import train_test_split

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(df["text"], df["sentiment"], test_size=0.2, random_state=42)

Давайте разберем этот код:

  • Мы импортируем функцию train_test_split() из scikit-learn.
  • Мы разделяем текстовые данные (хранящиеся в столбце «текст» фрейма данных) и данные настроений (хранящиеся в столбце «настроения» фрейма данных) на наборы для обучения и тестирования с помощью функции train_test_split().
  • Мы используем test_size 0,2, что означает, что 20% данных будут использоваться для тестирования, и random_state 42 для воспроизводимости.

Затем нам нужно преобразовать текстовые данные в числовые векторы, которые можно использовать в качестве входных данных для алгоритма машинного обучения.

Для этого мы будем использовать векторизатор TF-IDF.

Вот код для преобразования текстовых данных:

from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(ngram_range=(1,2))
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)

Давайте разберем этот код:

  • Мы импортируем класс TfidfVectorizer из scikit-learn.
  • Мы создаем объект TfidfVectorizer и устанавливаем для ngram_range значение (1,2), что означает, что мы хотим учитывать как униграммы (отдельные слова), так и биграммы (пары соседних слов) в текстовых данных.
  • Мы подгоняем векторизатор к обучающим данным с помощью метода fit_transform(), который вычисляет оценку TF-IDF для каждого слова в корпусе и преобразует текстовые данные в разреженную матрицу числовых признаков.
  • Мы преобразуем тестовые данные с помощью метода transform(), который применяет такое же преобразование к тестовым данным, используя словарь, извлеченный из обучающих данных.

Теперь, когда мы преобразовали текстовые данные в числовые признаки, мы можем обучить модель машинного обучения предсказывать тональность текста.

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

Вот код для обучения модели:

from sklearn.linear_model import LogisticRegression

clf = LogisticRegression(max_iter=1000)
clf.fit(X_train_vec, y_train)

Давайте разберем этот код:

  • Мы импортируем класс LogisticRegression из scikit-learn
  • Мы создаем объект LogisticRegression и устанавливаем для max_iter значение 1000, что означает, что мы позволяем алгоритму выполнять до 1000 итераций для сходимости.
  • Мы обучаем модель на обучающих данных, используя метод fit(), который изучает параметры модели, которые можно использовать для прогнозирования тональности новых текстовых данных.

Наконец, мы можем оценить производительность модели на тестовых данных, вычислив оценку точности, точность, полноту и оценку F1.

Вот код для оценки модели:

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

y_pred = clf.predict(X_test_vec)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average="macro")
recall = recall_score(y_test, y_pred, average="macro")
f1 = f1_score(y_test, y_pred, average="macro")

print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 score:", f1)

Давайте разберем этот код:

  • Мы импортируем функции precision_score, precision_score, Recall_score и f1_score из scikit-learn.
  • Мы используем метод predict() объекта LogisticRegression, чтобы предсказать тональность тестовых данных.
  • Мы вычисляем точность, воспроизводимость, полноту и оценку F1 модели, используя соответствующие функции из scikit-learn.
  • Мы печатаем показатели производительности.

Вот оно! Мы успешно выполнили веб-скрапинг, очистку текста, предварительную обработку и анализ тональности с помощью машинного обучения в Python.

Если вам понравилось читать эту статью и она оказалась полезной, поддержите меня в Купи мне кофе 😎

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.