Python - НЛП с использованием SpaCy - включая кодирование меток - PullRequest
0 голосов
/ 06 апреля 2020

Я работал над некоторыми упражнениями в стиле kaggle и добился определенного прогресса в двух отдельных модулях. Первый - это упражнение по НЛП в классификации спам-писем, а второй - по кодированию категориальных переменных. Мне было интересно, есть ли способ включить другую функцию в оригинальное упражнение НЛП. Прямо сейчас моя модель учитывает только текст электронной почты, а учебный набор будет содержать метку «Спам» или «Хэм», что я и в конечном итоге прогнозирую. Если бы у меня была еще одна колонка, в которой классифицировалось содержимое каждого письма (скажем: финансы, фитнес, новости, политика, спорт, любовь и т. Д. c). Я хотел бы иметь возможность внести это в мою модель. Исходя из того, что я узнал в Kaggle, я полагаю, что мне следует использовать кодирование в одно касание, поскольку у категорий электронной почты нет порядка между ними. Меня беспокоит только то, что у меня будет большое количество категорий. Мой код выглядит следующим образом. Может ли кто-нибудь указать мне правильное направление работы с категориальной переменной в моей модели? Я пробовал все виды вещей, чтобы включить один горячий кодер в мою трубу, но я не могу заставить это работать. Большое спасибо!

import pandas as pd
import spacy
from spacy.util import minibatch

comments = pd.read_csv(r'C:\Users\peter\OneDrive\Documents\email.csv')

nlp = spacy.blank('en')

textcat = nlp.create_pipe(
                'textcat',
                config = {
                        'exclusive_classes': True,
                        'architecture': 'bow'})

nlp.add_pipe(textcat)
textcat.add_label('Ham')
textcat.add_label('Spam')

train_texts = comments['text'].values
train_labels = [{'cats': {'Ham': label == 'Ham',
                          'Spam': label == 'Spam'}}
                for label in comments['label']]

train_data = list(zip(train_texts, train_labels))

random.seed(1)
spacy.util.fix_random_seed(1)
optimizer = nlp.begin_training()

losses = {}

for epoch in range(10):
    random.shuffle(train_data)
    batches = minibatch(train_data, size = 8)
    for batch in batches:
        texts, labels = zip(*batch)
        nlp.update(texts, labels, sgd = optimizer, losses = losses)

        print(losses)

my_comments = pd.read_csv(r'C:\Users\peter\OneDrive\Documents\EmailValidate.csv')
my_comments = my_comments['text']

docs = [nlp.tokenizer(text) for text in my_comments]

textcat = nlp.get_pipe('textcat')
scores, _ = textcat.predict(docs)

predicted_labels = scores.argmax(axis = 1)
print([textcat.labels[label] for label in predicted_labels])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...