Вопрос или проблема
У меня есть набор данных из двух папок. Одна из них содержит документы (текст, 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 для решения различных задач обработки естественного языка. Успехов в ваших дальнейших исследованиях в области машинного обучения!