Бинарная классификация текста с помощью SpaCy

Вопрос или проблема

У меня есть набор данных из двух папок. Одна из них содержит документы (текст, PDF), связанные с личной информацией (например, имя, электронная почта, адрес и т. д.), другая содержит неперсонализированную информацию.

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

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

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

Я уже немного поработал с кодом ниже

import spacy
from spacy import displacy
from spacy.util import minibatch, compounding

train_data = [("Это содержит имена, электронные письма, адреса", {'cats': {'POSITIVE': 1}}), ("Это содержит игры, еду и т.д.", {'cats': {'POSITIVE': 0}})]

nlp = spacy.load('en_core_web_sm')

if 'textcat' not in nlp.pipe_names:
    textcat = nlp.create_pipe("textcat")
    nlp.add_pipe(textcat, last=True)
else:
    textcat = nlp.get_pipe("textcat")

textcat.add_label('POSITIVE')

other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'textcat']

n_iter = 1

with nlp.disable_pipes(*other_pipes):
    optimizer = nlp.begin_training()
    print("Обучение модели...")
    for i in range(n_iter):
        losses = {}
        batches = minibatch(train_data, size=compounding(4,32,1.001))
        for batch in batches:
            texts, annotations = zip(*batch)
            nlp.update(texts, annotations, sgd=optimizer,
                      drop=0.2, losses=losses)

В приведённом выше коде я обучил модель, используя два простых предложения. Мне нужно обучиться на двух папках, как упоминалось в вопросе. Этот код просто говорит, что модель была обучена. И также, как я могу сохранить эту модель и протестировать её на документах для предсказания?

Вы очень близки к тому, чтобы у вас был работающий скрипт. Пример обучения textcat в репозитории spacy показывает, как сохранить модель, перезагрузить её и запустить на новом тексте: https://github.com/explosion/spaCy/blob/master/examples/training/train_textcat.py

Примерно с 103 строки:

    # протестировать обученную модель
    test_text = "Этот фильм был ужасен"
    doc = nlp(test_text)
    print(test_text, doc.cats)

    if output_dir is not None:
        with nlp.use_params(optimizer.averages):
            nlp.to_disk(output_dir)
        print("Модель сохранена в", output_dir)

        # протестировать сохранённую модель
        print("Загрузка из", output_dir)
        nlp2 = spacy.load(output_dir)
        doc2 = nlp2(test_text)
        print(test_text, doc2.cats)
```

Ответ или решение

Классификация текста с использованием SpaCy: Пошаговое руководство

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

1. Подготовка данных

Для начала вам потребуется собрать данные из двух папок. Одна папка содержит документы, связанные с личной информацией (например, имена, адреса и электронные почты), а другая – с непростой информацией. Вам нужно будет загрузить эти документы и преобразовать их в формат, используемый SpaCy для обучения.

import os
from pathlib import Path

def load_data(pos_folder, neg_folder):
    train_data = []

    # Загружаем положительные примеры
    for filename in os.listdir(pos_folder):
        with open(os.path.join(pos_folder, filename), 'r', encoding='utf-8') as file:
            text = file.read()
            train_data.append((text, {'cats': {'PERSONAL': 1, 'NON_PERSONAL': 0}}))

    # Загружаем отрицательные примеры
    for filename in os.listdir(neg_folder):
        with open(os.path.join(neg_folder, filename), 'r', encoding='utf-8') as file:
            text = file.read()
            train_data.append((text, {'cats': {'PERSONAL': 0, 'NON_PERSONAL': 1}}))

    return train_data

pos_folder = 'path/to/personal_info'
neg_folder = 'path/to/non_personal_info'
train_data = load_data(pos_folder, neg_folder)

2. Обучение модели

Теперь, когда ваши данные готовы, можно перейти к обучению модели. Ниже представлен код, который создает и обучает модель классификации текста с использованием SpaCy.

import spacy
from spacy.util import minibatch, compounding

# Загрузка модели SpaCy
nlp = spacy.load('en_core_web_sm')

# Создание класса текстовой классификации
if 'textcat' not in nlp.pipe_names:
    textcat = nlp.create_pipe("textcat")
    nlp.add_pipe(textcat, last=True)
else:
    textcat = nlp.get_pipe("textcat")

# Добавление меток
textcat.add_label('PERSONAL')
textcat.add_label('NON_PERSONAL')

# Обучение модели
n_iter = 10  # количество итераций для обучения
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'textcat']

with nlp.disable_pipes(*other_pipes):  # Отключаем остальные пайплайны
    optimizer = nlp.begin_training()
    print("Обучение модели...")
    for i in range(n_iter):
        losses = {}
        batches = minibatch(train_data, size=compounding(4, 32, 1.001))
        for batch in batches:
            texts, annotations = zip(*batch)
            nlp.update(texts, annotations, sgd=optimizer, drop=0.2, losses=losses)
        print(f"Итерация {i + 1}/{n_iter} - Убытки: {losses}")

3. Сохранение модели

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

output_dir = 'path/to/save/model'
nlp.to_disk(output_dir)
print("Модель сохранена в", output_dir)

4. Тестирование модели

Теперь вы можете загрузить модель и протестировать ее на новых документах.

# Загрузка сохраненной модели
nlp2 = spacy.load(output_dir)

# Пример тестирования
test_text = "Моя электронная почта example@example.com и адрес 123 Main St."
doc = nlp2(test_text)

# Вывод предсказаний
print(f"Тестовый текст: {test_text}")
print(f"Предсказания: {doc.cats}")

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...