Модель проблемного обучения в keras с многоклассовым текстом

#python #keras #deep-learning #nlp

#python #keras #глубокое обучение #nlp

Вопрос:

Я использую данные из следующего: https://raw.githubusercontent.com/susanli2016/NLP-with-Python/master/data/title_conference.csv Я сам выполняю всю обработку, чтобы лучше учиться и понимать НЛП. Вот мой код.

 import nltk 
nltk.download('punkt')
nltk.download('averaged_perception_tagger')
nltk.download('stopwords')
stopwords = nltk.corpus.stopwords.words('english')
from nltk.corpus import stopwords 

from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np 
from sklearn.utils import shuffle
from keras.preprocessing import sequence 
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation 
from keras.layers import Embedding, LSTM, SpatialDropout1D
from keras.layers import Conv1D, Flatten, MaxPooling1D
from keras.preprocessing.sequence import pad_sequences 
from keras.utils.np_utils import to_categorical
from keras.preprocessing import text 
import tensorflow as tf
from nltk.tokenize import word_tokenize 

with open('/Multi Class Text Classification.txt') as f:
  data = f.read().splitlines()

conference_name = []
description = []
for row in data[1:]:
  conference_name.append(row.split()[-1].split(',')[1])
  description.append(row.split('.')[0])

import string 
stop_words = set(stopwords.words('english')) 
words = []
for row in description:
  for word in row.split():
    word = word.translate(str.maketrans('','',string.punctuation))
    if word not in stop_words and len(word) > 1:
      words.append(word.lower())

words_unique = sorted(list(set(words)))


count = 0 
word_idx = {}
for word in words_unique:
  count  =1
  if word not in word_idx:
    word_idx[word] = count

text_to_sequences = []
#Replace description with the index of each word
for row in description:
  empty = []
  for word in row.split():
    word = word.translate(str.maketrans('','',string.punctuation))
    word = word.lower()
    if word not in stop_words and len(word) > 1:
      empty.append(word_idx.get(word))
  text_to_sequences.append(empty)

def pad_sequences(text_sequences:list, length:int): #pad sequences
  padded_sequences = []
  max_len = length #choose an arbritrary number 
  for text_sequence in text_sequences:
    length = len(text_sequence)
    i = 0 
    while  length   i < max_len:
      text_sequence.insert(i,0)
      i  = 1
    padded_sequences.append(text_sequence)
  return padded_sequences 

train_x = pad_sequences(text_to_sequences,20)
train_x = np.array(train_x)
print(train_x)

 #Create labels 
unique_labels = list(set(conference_name))
labels = []


for i in conference_name:
  if i in unique_labels:
    labels.append(unique_labels.index(i))
labels = np.array(labels)


#Creating the LSTM model 
import keras
from tensorflow.keras import layers 

model = keras.models.Sequential()
model.add(layers.Embedding(len(words),32,input_length = 10))
model.add(SpatialDropout1D(0.2))
model.add(layers.LSTM(196, dropout = 0.1, recurrent_dropout=0.1))

model.add(layers.Dense(1,activation = 'sigmoid'))

model.summary()

loss = keras.losses.BinaryCrossentropy(from_logits=False)
optim = keras.optimizers.Adam(lr = 0.0001)
metrics = ['accuracy']

model.compile(loss = loss , optimizer= optim, metrics = metrics)
model.fit(train_x,labels,epochs=35, verbose = 2)
 

Я не получаю ошибку при обучении своей модели, но точность и потери застряли на:

  loss: -3.8982e 01 - accuracy: 0.2058
 

Я предполагаю, что это связано с тем, как я предварительно обработал данные. Я был бы признателен за любую помощь, поскольку я новичок в NLP и tensorflow.

Ответ №1:

Используйте встроенные функции Keras для предварительной обработки. Вы можете найти примеры здесь последовательности токенизации и заполнения.

Если это все то же самое, я бы использовал категориальную кросс-энтропию с активацией softmax