Word embedding cho bài toán phân loại văn bản

classification
nlp

#1

Em chào mọi người, em đang tìm hiểu bài toán phân loại văn bản theo 10 thể loại. Em làm theo hướng dẫn trên mạng phần Word Embedding. Mọi người xem giúp em như vậy đã được chưa ạ?. Hiện tại em chạy thì lỗi tại

embedding_matrix[i] = embedding_vector IndexError: index 31630 is out of bounds for axis 0 with size 10088.

embeddings_index = {}
dir_path = os.path.dirname(os.path.realpath(os.getcwd()))
f = os.path.join(dir_path, "Data/vi/vi.vec")
for line in f:
    values = line.split()
    embeddings_index[values[0]] = numpy.asarray(values[1:], dtype='float32')


# create a tokenizer 

X_data = pickle.load(open('X_data.pkl', 'rb'))
X_test = pickle.load(open('X_test.pkl', 'rb'))
tokenizer = tokenizer = text.Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(X_data)    

# convert text to sequence of tokens and pad them to ensure equal length vectors 

X_train = tokenizer.texts_to_matrix(X_data)
X_test = tokenizer.texts_to_matrix(X_test)

X_train_seq = sequence.pad_sequences(X_train, maxlen=300)
X_test_seq = sequence.pad_sequences(X_test, maxlen=300)


# create token-embedding mapping

embedding_matrix = numpy.zeros((vocab_size, 100))   #this is error 
for word, i in word_index.items():
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
         embedding_matrix[i] = embedding_vector

#2

Không biết bạn paste lên đây có đúng không. Nhưng dòng số 4, 5 phải lùi vào.


#3

Dòng này bạn thiếu dấu đóng ngoặc này : tokenizer.fit_on_texts((X_data). Mình nghĩ bạn nên để ý log để có thể debug vì lỗi này khá cơ bản ko lq j đến ML


#4

Cảm ơn bạn, mình show code trên text edit nên khó nhìn ra, những lỗi này mình rà soát và chữa lại hết rồi. Mình vừa edit lại code rồi ạ!


#5

Vâng, em paste vội code nên không để ý. Em vừa chỉnh sửa lại code rồi ạ!


#6

Vậy h còn lỗi gì ko bạn?


#7

Có ạ, còn lỗi này ạ embedding_matrix = numpy.zeros(vocab_size, 100) TypeError: data type not understood.
Mình note lỗi trên code rồi đó ạ !


#8

Cái này phải là embedding_matrix = numpy.zeros((vocab_size, 100)) vì nó nhận shape đầu vào là 1 tuple hoặc int mà bạn nhập thế kia nó sẽ hiểu là size = vocab_size còn dtype = 100.


#9

Vâng, đoạn này mình mới học nên chưa hiểu rõ, mình đã sửa lại rồi a!. Bạn xem giúp mình lỗi này với ạ ! embedding_matrix[i] = embedding_vector IndexError: index 31630 is out of bounds for axis 0 with size 10088.
Trong file từ điển vecto từ vi.vec mình xem có 10088 từ ( ở đầu file ngta cũng ghi chú 10088 100 ) nên em đặt vocab_size= 10088 như vậy có đúng không ạ ?


#10

H bro, your vocab_size should be the size of your tokenizer. Check this link http://keras.io/examples/pretrained_word_embeddings/


Your pretrained embedding file doesn’t cover all words in your corpus. That’s why you get error if you set vicab_size to size of the embedding file. Hope this help


#11

Lỗi của bạn là vocab size có 10088 nhưng lại truy xuất đến index 31640 vượt quá size của embedding. Embedding truyền vào là các index và đầu ra là các dense vector.


#12

Cảm ơn câu trả lời và bài chia sẻ của anh, em đang áp dụng cho bài toán của mình. Em cảm ơn anh nhiều ạ! (em xin phép nói tiếng việt vì tiếng anh em dốt lắm! )


#13

Vâng, em đang kiểm tra lại các thông số. Em cảm ơn ạ!