Skipgram – Einführung + Implementierung mit Indo4b Dataset | von Denaya | Juni 2023

0
25


Der Zweck dieses Artikels besteht darin, eine Schritt-für-Schritt-Anleitung für SkipGram bereitzustellen, einen Algorithmustyp, der in der Verarbeitung natürlicher Sprache (NLP) und insbesondere bei Worteinbettungen verwendet wird, sowie ein Beispiel für die Implementierung mithilfe des Indo4b-Datensatzes.

Skip-Gram ist eine Artwork Algorithmus, der in der Verarbeitung natürlicher Sprache (NLP) und insbesondere bei Worteinbettungen verwendet wird. Worteinbettungen sind dichte Vektordarstellungen von Wörtern, die deren semantische und syntaktische Bedeutung erfassen.

Der Skip-Gram-Algorithmus ist ein neuronales Netzwerkmodell, das diese Worteinbettungen lernt, indem es die Kontextwörter eines Zielworts vorhersagt. Es benötigt einen großen Textkorpus als Eingabe und zielt darauf ab, die Verteilungseigenschaften von Wörtern zu lernen. Die Grundidee besteht darin, die umgebenden Wörter innerhalb eines bestimmten Kontextfensters basierend auf einem Zielwort vorherzusagen.

Während des Trainings passt der Skip-Gram-Algorithmus die Parameter des neuronalen Netzwerks an, um die Wahrscheinlichkeit einer korrekten Vorhersage der Kontextwörter zu maximieren. Dieser Prozess hilft dabei, die Beziehungen und Ähnlichkeiten zwischen Wörtern zu erfassen, da Wörter, die in ähnlichen Kontexten vorkommen, tendenziell ähnliche Bedeutungen haben.

Indo4B besteht aus etwa 4B Wörtern und etwa 250 Millionen Sätzen. Der Datensatz umfasst sowohl formelle als auch umgangssprachliche indonesische Sätze, die aus 12 Korpussen zusammengestellt wurden, von denen zwei Korpusse die indonesische Umgangssprache abdecken, acht Korpusse die formale indonesische Sprache abdecken und der Relaxation einen gemischten Stil aufweist, sowohl umgangssprachlich als auch formal.

Hier ist die Übersicht über den Indo4b-Datensatz.

banyak dari kebaya-kebaya tersebut yang mampu dikombinasikan dengan kreasi jilbab fashionable sehingga tetap dikenakan oleh para wanita muslimah.
dengan desain yang menarik dan elegan, para muslimah tetap bisa tampil dengan modis dan anggun meskipun pakaiannya tertutup.

kebaya pesta muslim saat ini memang sudah sangat bervariasi, bahkan hampir setara dengan variasi baju non muslim.
modelnya juga sangat fashionable dan tidak membosankan sehingga tetap akan memperlihatkan kesan yang modis namun tetap sopan.
dengan mannequin yang semakin bervariatif itulah para wanita berhijab tetap dapat tampil modis dengan menggunakan jilbab.
mannequin kebaya muslimah fashionable yang paling disukai saat ini yaitu yang menggunakan bahan brokat dengan motif yang beraneka ragam.
selain itu, di bagian dalamnya dilapisi baju polos yang akan berfungsi untuk menyamarkan bagian tubuh yang menerawang.

In diesem Abschnitt erstellen wir unser eigenes Skipgram-Modell mithilfe des Indo4b-Datensatzes.

Als erstes möchten wir Wortpaare bilden. Dieses Paar dient dazu, ein Wort mit seinen Nachbarn im Satz zu speichern.

import nltk
from nltk.tokenize import word_tokenize
from datetime import datetime

# Outline the context window measurement
window_size = 2
word_pairs = []

# Open the textual content file
with open('/dataset_all_uncased_blankline.txt', 'r') as file:
# Iterate over every line within the file
now = datetime.now()
for l, line in enumerate(file):
# Tokenize the road into phrases
phrases = word_tokenize(line)

# Generate phrase pairs
for i, target_word in enumerate(phrases):
for j in vary(i - window_size, i + window_size + 1):
if j != i and j >= 0 and j < len(phrases):
context_word = phrases[j]
word_pairs.append((target_word, context_word))

if ( l + 1 ) % 100000 == 0:
print(f"processed {l+1} information in : {datetime.now() - now}")
now = datetime.now()

Hier ist das Ausgabebeispiel

processed 100000 information in : 0:00:11.460808
processed 200000 information in : 0:00:11.395777
processed 300000 information in : 0:00:11.460874
processed 400000 information in : 0:00:11.362851

Nachdem wir die Wortpaare haben, erstellen wir eine Zuordnung von word2idx und idx2word und konvertieren die Wortpaare in die numerische Darstellung

# Create word-to-index and index-to-word mappings
phrases = set([pair[0] for pair in word_pairs] + [pair[1] for pair in word_pairs])
word_to_index = {phrase: index for index, phrase in enumerate(phrases)}
index_to_word = {index: phrase for index, phrase in enumerate(phrases)}

# Convert phrase pairs to numerical representations
numeric_pairs = [(word_to_index[pair[0]], word_to_index[pair[1]]) for pair in word_pairs]

# Convert numeric pairs to numpy arrays
target_words = np.array([pair[0] for pair in numeric_pairs])
context_words = np.array([pair[1] for pair in numeric_pairs])

Abschließend erstellen wir ein Modell, um für jedes Wort Einbettungen vorzunehmen.

# Construct the skip-gram mannequin
vocab_size = len(word_to_index)
embedding_dim = 100

mannequin = Sequential()
mannequin.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=1, embeddings_initializer="glorot_uniform",))
mannequin.add(Dense(items=vocab_size, activation='softmax'))
mannequin.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy')

# Practice the mannequin
mannequin.match(target_words, context_words, epochs=5, batch_size=1028)

Der eingegebene One-Sizzling-codierte Vektor wird durch eine Einbettungsschicht geleitet. Diese Ebene ordnet den hochdimensionalen One-Sizzling-Vektor einer niedrigerdimensionalen dichten Vektordarstellung zu, die als Worteinbettung bezeichnet wird. Die Dimensionalität der Worteinbettung ist ein Hyperparameter des Modells und wird normalerweise auf einen kleineren Wert eingestellt, z. B. 100 oder 300. In diesem Fall ist die embedding_dimist 100.

Die Worteinbettung wird dann mit Softmax-Aktivierung durch eine dichte Schicht geleitet. Diese Ebene sagt die Wahrscheinlichkeitsverteilung über das gesamte Vokabular für die Kontextwörter voraus, die wahrscheinlich um das Zielwort herum auftauchen. Die Anzahl der Einheiten in dieser dichten Schicht entspricht der Größe des Wortschatzes.

Während des Trainings zielt das Skipgram-Modell darauf ab, den Unterschied zwischen der vorhergesagten Wahrscheinlichkeitsverteilung und der wahren Verteilung der Kontextwörter zu minimieren. Dies wird typischerweise mithilfe einer Kreuzentropieverlustfunktion erreicht, beispielsweise einer spärlichen kategorialen Kreuzentropie. Die Gewichte des Modells werden mithilfe eines Optimierers wie RMSprop aktualisiert, um die Vorhersagen des Modells iterativ zu verbessern.

Hier ist die Modellzusammenfassung.

Mannequin: "sequential_20"
_________________________________________________________________
Layer (kind) Output Form Param #
=================================================================
embedding_18 (Embedding) (None, 1, 100) 16773800

dense_53 (Dense) (None, 1, 167738) 16941538

=================================================================
Complete params: 33,715,338
Trainable params: 33,715,338
Non-trainable params: 0
_________________________________________________________________
None

Hier ist das Ergebnisbeispiel

Epoch 1/5
24510/24510 [==============================] - 718s 29ms/step - loss: 7.6504
Epoch 2/5
24510/24510 [==============================] - 715s 29ms/step - loss: 7.7510
Epoch 3/5
24510/24510 [==============================] - 714s 29ms/step - loss: 7.6211
Epoch 4/5
24510/24510 [==============================] - 714s 29ms/step - loss: 7.6174
Epoch 5/5
24510/24510 [==============================] - 715s 29ms/step - loss: 7.6410

Danach können wir das Modell speichern h5 Format.

mannequin.save('/dwelling/jupyter-23521027/refresh-bert/information/indo4b/skipgram_model.h5')

Um das Modell zur Erstellung eines Wortvektors zu verwenden, können wir verwenden mannequin.get_weight .

embeddings = mannequin.get_weights()[0]
word_index = word_to_index['saya']
embedding_vector = embeddings[word_index]
print(embedding_vector)

Hier sind die Worteinbettungen eines Wortes saya :

array([ 1.2882755 , -0.662414  , -0.43246198,  0.7096585 ,  0.7463746 ,
1.0194639 , 0.02189452, 1.0923231 , -0.25607622, -0.47817618,
1.9688318 , -0.15195358, 0.29373896, 0.5114178 , 1.35664 ,
0.556277 , -0.5431808 , -0.8593524 , 0.16035376, 1.0245067 ,
0.6405075 , 0.45846877, -0.83155537, -0.12158296, -0.34435052,
0.90415454, -1.0545709 , -0.860765 , -0.09879653, 0.16872129,
1.5555193 , 0.69629246, 0.53756225, 0.71354604, 0.3733634 ,
1.4315096 , -0.46435842, 1.2527927 , 0.99753696, 0.8113796 ,
1.5274674 , 1.0081507 , -1.1337119 , -0.79504544, -1.0468549 ,
-0.4446477 , 0.8331955 , 0.6257841 , 0.9288149 , 0.09011127,
0.43620077, 0.45051867, -0.5766254 , -1.5170788 , 0.7989655 ,
1.1817532 , -1.3362812 , 0.37968627, 1.2037812 , 1.580798 ,
0.34288272, 0.38945353, -0.6817445 , -0.7268138 , 1.1114049 ,
-0.31619954, -1.5543376 , -0.5461451 , 0.09831923, 1.2923497 ,
-0.857187 , -0.35269755, -0.14679237, 0.27459678, 0.24891895,
0.31137472, 0.02233857, 0.17610878, -0.8434419 , -1.581816 ,
-0.35503572, -0.35947064, -0.9334048 , 0.77110344, 0.45989272,
-0.6705412 , -1.1677887 , -0.3947946 , 1.0390584 , -1.253892 ,
0.8871168 , -0.27643403, -1.079644 , -0.7848585 , 0.07402986,
-0.5521549 , -0.71535784, 0.8540427 , 1.5293773 , -0.08399871],
dtype=float32)



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here