#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