Как повысить точность классификации текста, используя глубокое обучение и функции word2ve c> - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь выполнить классификацию текста на наборе данных римского урду, используя 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...