Я пытаюсь выполнить классификацию текста на наборе данных римского урду, используя word2ve c модель вложения слов и глубокого обучения . Мой подход основан прежде всего на
загрузке корпуса и очистке данных, разбивке предложений и последующих предложений на слова.
токенизированные данные обучаются на модели word2ve c с использованием библиотеки gensim с размером вектора 300 и размером окна 3.
Позднее эти вложения слова используются для получения вектора признаков для каждого документа получить среднее значение вектора слов.
После этого полученные векторы do c разделяются на данные обучения и тестирования и, наконец, отправляются в модель глубокого обучения для классификации текста (Positive, Negative, Нейтральная).
Я получаю точность не более 44%, может кто-нибудь подсказать, что не так с моим подходом.
Ниже приведен мой код для справки.
model_w2v = Word2Vec(sentences = sentences, size = 500, sg = 1, window = 3, min_count = 1, iter = 10, workers = Pool()._processes)
model_w2v.init_sims(replace = True)
Создание векторов do c (взяв среднее из векторов слов):
docs_vectors = pd.DataFrame()
#stopwords = nltk.corpus.stopwords.words('english') # removing stop words
stopwords = ['hai','nhi','main','tum']
for doc in yelp['Reviews'].str.lower().str.replace('[^a-z ]', ''): # looping through each document and cleaning it
temp = pd.DataFrame() # creating a temporary dataframe(store value for 1st doc & for 2nd doc remove the details of 1st & proced through 2nd and so on..)
dx = cleaner(word_tokenize(doc))
for word in dx: # looping through each word of a single document and spliting through space
#if word not in stopwords: # if word is not present in stopwords then (try)
try:
word_vec = model_w2v[word] # if word is present in embeddings(goole provides weights associate with words(300)) then proceed
temp = temp.append(pd.Series(word_vec), ignore_index = True) # if word is present then append it to temporary dataframe
except:
pass
doc_vector = temp.mean() # take the average of each column(w0, w1, w2,........w300)
docs_vectors = docs_vectors.append(doc_vector, ignore_index = True) # append each document value to the final dataframe
docs_vectors.shape
Моя модель глубокого обучения:
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import LeakyReLU
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
# fix random seed for reproducibility
numpy.random.seed(7)
# load the dataset but only keep the top n words, zero the rest
top_words = 32401
##(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
# truncate and pad input sequences
max_review_length = 500
#X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
#X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)
# create the model
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(LSTM(120))
#model.add(LeakyReLU(alpha=0.1))
model.add(Dense(1, activation='relu'))
#model.add(LeakyReLU(alpha=0.1))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(train_x, train_y, epochs=3, batch_size=64)
# Final evaluation of the model
scores = model.evaluate(test_x, test_y, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))