Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Osadzanie słów

Zobacz na TensorFlow.org Wyświetl źródło na GitHub Pobierz notatnik

Ten samouczek zawiera wprowadzenie do osadzania słów. Będziesz trenować własne osadzanie słów, używając prostego modelu Keras do zadania klasyfikacji sentymentów, a następnie wizualizować je w Projektorze osadzania (pokazanym na poniższym obrazku).

Zrzut ekranu projektora osadzającego

Przedstawianie tekstu jako liczb

Modele uczenia maszynowego przyjmują wektory (tablice liczb) jako dane wejściowe. Podczas pracy z tekstem pierwszą rzeczą, którą musisz zrobić, jest wymyślenie strategii konwersji ciągów znaków na liczby (lub „wektoryzacji” tekstu) przed przesłaniem go do modelu. W tej sekcji przyjrzymy się trzem strategiom.

Kodowanie na gorąco

Na początek możesz zakodować każde słowo w swoim słowniku „na gorąco”. Rozważ zdanie „Kot usiadł na macie”. Słownictwo (lub unikalne słowa) w tym zdaniu to (cat, mat, on, sat, the). Aby przedstawić każde słowo, utworzysz wektor zerowy o długości równej słownikowi, a następnie umieścisz jedynkę w indeksie, który odpowiada temu słowu. To podejście pokazano na poniższym diagramie.

Schemat kodowania na gorąco

Aby utworzyć wektor zawierający kodowanie zdania, można następnie połączyć jeden-gorący wektor dla każdego słowa.

Zakoduj każde słowo unikalnym numerem

Drugim podejściem, które możesz wypróbować, jest zakodowanie każdego słowa przy użyciu unikalnej liczby. Kontynuując powyższy przykład, możesz przypisać 1 do „kota”, 2 do „mat” i tak dalej. Możesz wtedy zakodować zdanie „Kot usiadł na macie” jako gęsty wektor, taki jak [5, 1, 4, 3, 5, 2]. To podejście jest skuteczne. Zamiast rzadkiego wektora masz teraz gęsty (w którym wszystkie elementy są pełne).

Takie podejście ma jednak dwie wady:

  • Kodowanie liczb całkowitych jest dowolne (nie obejmuje żadnego związku między słowami).

  • Kodowanie liczb całkowitych może być trudne do interpretacji modelu. Na przykład klasyfikator liniowy uczy się pojedynczej wagi dla każdej cechy. Ponieważ nie ma związku między podobieństwem dowolnych dwóch słów a podobieństwem ich kodowania, ta kombinacja cech i wag nie ma znaczenia.

Osadzanie słów

Osadzanie słów pozwala nam na użycie wydajnej, gęstej reprezentacji, w której podobne słowa mają podobne kodowanie. Co ważne, nie musisz ręcznie określać tego kodowania. Osadzanie to gęsty wektor wartości zmiennoprzecinkowych (długość wektora to parametr określony przez użytkownika). Zamiast ręcznie określać wartości do osadzania, są to parametry dające się trenować (wagi wyuczone przez model podczas treningu, w ten sam sposób model uczy się wag dla gęstej warstwy). Często zdarza się, że osadzanie słów jest 8-wymiarowe (dla małych zbiorów danych), do 1024 wymiarów podczas pracy z dużymi zbiorami danych. Osadzanie wyższego wymiaru może uchwycić drobnoziarniste relacje między słowami, ale wymaga więcej danych do nauczenia.

Schemat osadzania

Powyżej znajduje się schemat osadzania słów. Każde słowo jest reprezentowane jako 4-wymiarowy wektor wartości zmiennoprzecinkowych. Innym sposobem myślenia o osadzaniu jest „tablica przeglądowa”. Po nauczeniu się tych wag możesz zakodować każde słowo, wyszukując w tabeli gęsty wektor, któremu odpowiada.

Ustawiać

import io
import os
import re
import shutil
import string
import tensorflow as tf

from datetime import datetime
from tensorflow.keras import Model, Sequential
from tensorflow.keras.layers import Activation, Dense, Embedding, GlobalAveragePooling1D
from tensorflow.keras.layers.experimental.preprocessing import TextVectorization

Pobierz zestaw danych IMDb

W samouczku będziesz używać zestawu danych przeglądu dużego filmu . Wyszkolisz model klasyfikatora opinii na tym zbiorze danych i nauczysz się osadzania od podstaw. Aby dowiedzieć się więcej o ładowaniu zestawu danych od podstaw, zobacz samouczek dotyczący ładowania tekstu .

Pobierz zestaw danych za pomocą narzędzia plików Keras i przejrzyj katalogi.

url = "https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz"

dataset = tf.keras.utils.get_file("aclImdb_v1.tar.gz", url,
                                    untar=True, cache_dir='.',
                                    cache_subdir='')

dataset_dir = os.path.join(os.path.dirname(dataset), 'aclImdb')
os.listdir(dataset_dir)
Downloading data from https://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
84131840/84125825 [==============================] - 7s 0us/step

['imdbEr.txt', 'README', 'test', 'imdb.vocab', 'train']

Spójrz na katalog train/ . Zawiera foldery pos i neg z recenzjami filmów oznaczonymi odpowiednio jako pozytywne i negatywne. Będziesz używać recenzji z folderów pos i neg do trenowania binarnego modelu klasyfikacji.

train_dir = os.path.join(dataset_dir, 'train')
os.listdir(train_dir)
['labeledBow.feat',
 'urls_pos.txt',
 'urls_neg.txt',
 'urls_unsup.txt',
 'unsup',
 'neg',
 'pos',
 'unsupBow.feat']

Katalog train zawiera również dodatkowe foldery, które należy usunąć przed utworzeniem zbioru danych szkoleniowych.

remove_dir = os.path.join(train_dir, 'unsup')
shutil.rmtree(remove_dir)

Następnie utwórz tf.data.Dataset za pomocą tf.keras.preprocessing.text_dataset_from_directory . Możesz przeczytać więcej o używaniu tego narzędzia w tym samouczku klasyfikacji tekstu .

Użyj katalogu train aby utworzyć zestawy danych pociągu i walidacji z podziałem 20% na potrzeby walidacji.

batch_size = 1024
seed = 123
train_ds = tf.keras.preprocessing.text_dataset_from_directory(
    'aclImdb/train', batch_size=batch_size, validation_split=0.2, 
    subset='training', seed=seed)
val_ds = tf.keras.preprocessing.text_dataset_from_directory(
    'aclImdb/train', batch_size=batch_size, validation_split=0.2, 
    subset='validation', seed=seed)
Found 25000 files belonging to 2 classes.
Using 20000 files for training.
Found 25000 files belonging to 2 classes.
Using 5000 files for validation.

Spójrz na kilka recenzji filmów i ich etykiety (1: positive, 0: negative) ze zbioru danych pociągu.

for text_batch, label_batch in train_ds.take(1):
  for i in range(5):
    print(label_batch[i].numpy(), text_batch.numpy()[i])
0 b"Oh My God! Please, for the love of all that is holy, Do Not Watch This Movie! It it 82 minutes of my life I will never get back. Sure, I could have stopped watching half way through. But I thought it might get better. It Didn't. Anyone who actually enjoyed this movie is one seriously sick and twisted individual. No wonder us Australians/New Zealanders have a terrible reputation when it comes to making movies. Everything about this movie is horrible, from the acting to the editing. I don't even normally write reviews on here, but in this case I'll make an exception. I only wish someone had of warned me before I hired this catastrophe"
1 b'This movie is SOOOO funny!!! The acting is WONDERFUL, the Ramones are sexy, the jokes are subtle, and the plot is just what every high schooler dreams of doing to his/her school. I absolutely loved the soundtrack as well as the carefully placed cynicism. If you like monty python, You will love this film. This movie is a tad bit "grease"esk (without all the annoying songs). The songs that are sung are likable; you might even find yourself singing these songs once the movie is through. This musical ranks number two in musicals to me (second next to the blues brothers). But please, do not think of it as a musical per say; seeing as how the songs are so likable, it is hard to tell a carefully choreographed scene is taking place. I think of this movie as more of a comedy with undertones of romance. You will be reminded of what it was like to be a rebellious teenager; needless to say, you will be reminiscing of your old high school days after seeing this film. Highly recommended for both the family (since it is a very youthful but also for adults since there are many jokes that are funnier with age and experience.'
0 b"Alex D. Linz replaces Macaulay Culkin as the central figure in the third movie in the Home Alone empire. Four industrial spies acquire a missile guidance system computer chip and smuggle it through an airport inside a remote controlled toy car. Because of baggage confusion, grouchy Mrs. Hess (Marian Seldes) gets the car. She gives it to her neighbor, Alex (Linz), just before the spies turn up. The spies rent a house in order to burglarize each house in the neighborhood until they locate the car. Home alone with the chicken pox, Alex calls 911 each time he spots a theft in progress, but the spies always manage to elude the police while Alex is accused of making prank calls. The spies finally turn their attentions toward Alex, unaware that he has rigged devices to cleverly booby-trap his entire house. Home Alone 3 wasn't horrible, but probably shouldn't have been made, you can't just replace Macauley Culkin, Joe Pesci, or Daniel Stern. Home Alone 3 had some funny parts, but I don't like when characters are changed in a movie series, view at own risk."
0 b"There's a good movie lurking here, but this isn't it. The basic idea is good: to explore the moral issues that would face a group of young survivors of the apocalypse. But the logic is so muddled that it's impossible to get involved.<br /><br />For example, our four heroes are (understandably) paranoid about catching the mysterious airborne contagion that's wiped out virtually all of mankind. Yet they wear surgical masks some times, not others. Some times they're fanatical about wiping down with bleach any area touched by an infected person. Other times, they seem completely unconcerned.<br /><br />Worse, after apparently surviving some weeks or months in this new kill-or-be-killed world, these people constantly behave like total newbs. They don't bother accumulating proper equipment, or food. They're forever running out of fuel in the middle of nowhere. They don't take elementary precautions when meeting strangers. And after wading through the rotting corpses of the entire human race, they're as squeamish as sheltered debutantes. You have to constantly wonder how they could have survived this long... and even if they did, why anyone would want to make a movie about them.<br /><br />So when these dweebs stop to agonize over the moral dimensions of their actions, it's impossible to take their soul-searching seriously. Their actions would first have to make some kind of minimal sense.<br /><br />On top of all this, we must contend with the dubious acting abilities of Chris Pine. His portrayal of an arrogant young James T Kirk might have seemed shrewd, when viewed in isolation. But in Carriers he plays on exactly that same note: arrogant and boneheaded. It's impossible not to suspect that this constitutes his entire dramatic range.<br /><br />On the positive side, the film *looks* excellent. It's got an over-sharp, saturated look that really suits the southwestern US locale. But that can't save the truly feeble writing nor the paper-thin (and annoying) characters. Even if you're a fan of the end-of-the-world genre, you should save yourself the agony of watching Carriers."
0 b'I saw this movie at an actual movie theater (probably the $2.00 one) with my cousin and uncle. We were around 11 and 12, I guess, and really into scary movies. I remember being so excited to see it because my cool uncle let us pick the movie (and we probably never got to do that again!) and sooo disappointed afterwards!! Just boring and not scary. The only redeeming thing I can remember was Corky Pigeon from Silver Spoons, and that wasn\'t all that great, just someone I recognized. I\'ve seen bad movies before and this one has always stuck out in my mind as the worst. This was from what I can recall, one of the most boring, non-scary, waste of our collective $6, and a waste of film. I have read some of the reviews that say it is worth a watch and I say, "Too each his own", but I wouldn\'t even bother. Not even so bad it\'s good.'

Skonfiguruj zestaw danych pod kątem wydajności

Są to dwie ważne metody, których należy używać podczas ładowania danych, aby upewnić się, że operacje wejścia / wyjścia nie staną się blokujące.

.cache() przechowuje dane w pamięci po ich załadowaniu z dysku. Dzięki temu zestaw danych nie stanie się wąskim gardłem podczas trenowania modelu. Jeśli zestaw danych jest zbyt duży, aby zmieścić się w pamięci, możesz również użyć tej metody do utworzenia wydajnej pamięci podręcznej na dysku, która jest bardziej wydajna do odczytu niż wiele małych plików.

.prefetch() nakłada się na przetwarzanie .prefetch() danych i wykonywanie modelu podczas uczenia.

Możesz dowiedzieć się więcej o obu metodach, a także o tym, jak buforować dane na dysku w przewodniku po wydajności danych .

AUTOTUNE = tf.data.experimental.AUTOTUNE

train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

Korzystanie z warstwy Osadzanie

Keras ułatwia osadzanie słów. Spójrz na warstwę osadzania .

Warstwa osadzania może być rozumiana jako tabela przeglądowa, która odwzorowuje indeksy całkowite (które oznaczają określone słowa) do gęstych wektorów (ich osadzenia). Wymiarowość (lub szerokość) osadzania jest parametrem, z którym można poeksperymentować, aby zobaczyć, co działa dobrze w przypadku danego problemu, podobnie jak eksperymentowałbyś z liczbą neuronów w warstwie gęstej.

# Embed a 1,000 word vocabulary into 5 dimensions.
embedding_layer = tf.keras.layers.Embedding(1000, 5)

Podczas tworzenia warstwy osadzania wagi osadzania są inicjalizowane losowo (tak jak w przypadku każdej innej warstwy). Podczas treningu są one stopniowo regulowane poprzez propagację wsteczną. Po przeszkoleniu wyuczone osadzanie słów będzie z grubsza zakodować podobieństwa między słowami (tak jak zostały one nauczone dla konkretnego problemu, w którym trenowany jest twój model).

Jeśli przekażesz liczbę całkowitą do warstwy osadzania, wynik zastąpi każdą liczbę całkowitą wektorem z tabeli osadzania:

result = embedding_layer(tf.constant([1,2,3]))
result.numpy()
array([[ 0.04530729, -0.04243072,  0.0484405 ,  0.04020107,  0.03276834],
       [-0.03076278,  0.0217622 , -0.02262014,  0.02947016,  0.00353047],
       [ 0.02572921, -0.03171467,  0.03230127, -0.02082225, -0.02455133]],
      dtype=float32)

W przypadku problemów z tekstem lub sekwencją warstwa Osadzanie przyjmuje tensor 2D liczb całkowitych o kształcie (samples, sequence_length) , gdzie każdy wpis jest sekwencją liczb całkowitych. Może osadzać sekwencje o różnych długościach. Możesz wprowadzić do warstwy osadzającej powyżej partie kształtami (32, 10) (partia 32 sekwencji o długości 10) lub (64, 15) (partia 64 sekwencji o długości 15).

Zwrócony tensor ma jedną oś więcej niż wejście, wektory osadzające są wyrównane wzdłuż nowej ostatniej osi. Przekaż go (2, 3) wsad wejściowy, a wyjście to (2, 3, N)

result = embedding_layer(tf.constant([[0,1,2],[3,4,5]]))
result.shape
TensorShape([2, 3, 5])

Gdy jako dane wejściowe zostanie podana partia sekwencji, warstwa osadzająca zwraca trójwymiarowy tensor zmiennoprzecinkowy o kształcie (samples, sequence_length, embedding_dimensionality) . Aby przekształcić tę sekwencję o zmiennej długości w stałą reprezentację, istnieje wiele standardowych podejść. Możesz użyć warstwy RNN, Attention lub Pooling przed przekazaniem jej do warstwy gęstej. W tym samouczku zastosowano pulę, ponieważ jest najprostsza. Klasyfikacja tekstu z samouczkiem RNN jest dobrym następnym krokiem.

Wstępne przetwarzanie tekstu

Następnie zdefiniuj kroki wstępnego przetwarzania zestawu danych wymagane dla Twojego modelu klasyfikacji opinii. Zainicjuj warstwę TextVectorization z żądanymi parametrami, aby wektoryzować recenzje filmów. Więcej informacji na temat korzystania z tej warstwy można znaleźć w samouczku dotyczącym klasyfikacji tekstu .

# Create a custom standardization function to strip HTML break tags '<br />'.
def custom_standardization(input_data):
  lowercase = tf.strings.lower(input_data)
  stripped_html = tf.strings.regex_replace(lowercase, '<br />', ' ')
  return tf.strings.regex_replace(stripped_html,
                                  '[%s]' % re.escape(string.punctuation), '')

# Vocabulary size and number of words in a sequence.
vocab_size = 10000
sequence_length = 100

# Use the text vectorization layer to normalize, split, and map strings to 
# integers. Note that the layer uses the custom standardization defined above. 
# Set maximum_sequence length as all samples are not of the same length.
vectorize_layer = TextVectorization(
    standardize=custom_standardization,
    max_tokens=vocab_size,
    output_mode='int',
    output_sequence_length=sequence_length)

# Make a text-only dataset (no labels) and call adapt to build the vocabulary.
text_ds = train_ds.map(lambda x, y: x)
vectorize_layer.adapt(text_ds)

Utwórz model klasyfikacji

Użyj interfejsu Keras Sequential API, aby zdefiniować model klasyfikacji sentymentów. W tym przypadku jest to model w stylu „Ciągły worek słów”.

  • Warstwa TextVectorization przekształca ciągi znaków w indeksy słownictwa. Zainicjowałeś już vectorize_layer jako warstwę TextVectorization i zbudowałeś jej słownictwo, wywołując adapt na text_ds . Teraz vectorize_layer może być użyty jako pierwsza warstwa twojego modelu klasyfikacji od końca do końca, wprowadzając przetworzone ciągi do warstwy osadzania.
  • Warstwa Embedding pobiera słownik zakodowany w postaci liczb całkowitych i wyszukuje wektor osadzania dla każdego indeksu słów. Te wektory są uczone jako model pociągów. Wektory dodają wymiar do tablicy wyjściowej. Wynikowe wymiary to: (batch, sequence, embedding) .

  • Warstwa GlobalAveragePooling1D zwraca wektor wyjściowy o stałej długości dla każdego przykładu poprzez uśrednienie wymiaru sekwencji. Pozwala to modelowi obsługiwać dane wejściowe o zmiennej długości w najprostszy możliwy sposób.

  • Wektor wyjściowy o stałej długości jest przepuszczany przez w pełni połączoną ( Dense ) warstwę z 16 ukrytymi jednostkami.

  • Ostatnia warstwa jest gęsto połączona z jednym węzłem wyjściowym.

embedding_dim=16

model = Sequential([
  vectorize_layer,
  Embedding(vocab_size, embedding_dim, name="embedding"),
  GlobalAveragePooling1D(),
  Dense(16, activation='relu'),
  Dense(1)
])

Skompiluj i wytrenuj model

Użyjesz TensorBoard do wizualizacji metryk, w tym strat i dokładności. Utwórz tf.keras.callbacks.TensorBoard .

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir="logs")

Skompiluj i BinaryCrossentropy model przy użyciu optymalizatora Adam i utraty BinaryCrossentropy .

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])
model.fit(
    train_ds,
    validation_data=val_ds, 
    epochs=15,
    callbacks=[tensorboard_callback])
Epoch 1/15
 1/20 [>.............................] - ETA: 0s - loss: 0.6933 - accuracy: 0.4961WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/summary_ops_v2.py:1277: stop (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.
Instructions for updating:
use `tf.profiler.experimental.stop` instead.
20/20 [==============================] - 2s 96ms/step - loss: 0.6919 - accuracy: 0.5028 - val_loss: 0.6897 - val_accuracy: 0.4886
Epoch 2/15
20/20 [==============================] - 1s 73ms/step - loss: 0.6867 - accuracy: 0.5028 - val_loss: 0.6832 - val_accuracy: 0.4886
Epoch 3/15
20/20 [==============================] - 1s 72ms/step - loss: 0.6779 - accuracy: 0.5028 - val_loss: 0.6724 - val_accuracy: 0.4886
Epoch 4/15
20/20 [==============================] - 1s 73ms/step - loss: 0.6640 - accuracy: 0.5028 - val_loss: 0.6566 - val_accuracy: 0.4886
Epoch 5/15
20/20 [==============================] - 1s 73ms/step - loss: 0.6444 - accuracy: 0.5028 - val_loss: 0.6357 - val_accuracy: 0.4890
Epoch 6/15
20/20 [==============================] - 1s 73ms/step - loss: 0.6193 - accuracy: 0.5267 - val_loss: 0.6105 - val_accuracy: 0.5480
Epoch 7/15
20/20 [==============================] - 1s 73ms/step - loss: 0.5895 - accuracy: 0.6035 - val_loss: 0.5823 - val_accuracy: 0.6154
Epoch 8/15
20/20 [==============================] - 1s 74ms/step - loss: 0.5568 - accuracy: 0.6758 - val_loss: 0.5532 - val_accuracy: 0.6644
Epoch 9/15
20/20 [==============================] - 1s 73ms/step - loss: 0.5233 - accuracy: 0.7263 - val_loss: 0.5251 - val_accuracy: 0.7028
Epoch 10/15
20/20 [==============================] - 1s 73ms/step - loss: 0.4910 - accuracy: 0.7606 - val_loss: 0.4995 - val_accuracy: 0.7338
Epoch 11/15
20/20 [==============================] - 1s 73ms/step - loss: 0.4611 - accuracy: 0.7844 - val_loss: 0.4771 - val_accuracy: 0.7502
Epoch 12/15
20/20 [==============================] - 1s 73ms/step - loss: 0.4343 - accuracy: 0.8032 - val_loss: 0.4581 - val_accuracy: 0.7642
Epoch 13/15
20/20 [==============================] - 1s 73ms/step - loss: 0.4104 - accuracy: 0.8171 - val_loss: 0.4422 - val_accuracy: 0.7718
Epoch 14/15
20/20 [==============================] - 1s 73ms/step - loss: 0.3893 - accuracy: 0.8297 - val_loss: 0.4289 - val_accuracy: 0.7826
Epoch 15/15
20/20 [==============================] - 1s 73ms/step - loss: 0.3705 - accuracy: 0.8401 - val_loss: 0.4178 - val_accuracy: 0.7900

<tensorflow.python.keras.callbacks.History at 0x7fb7f045bc50>

Przy takim podejściu model osiąga dokładność walidacji około 84% (należy zauważyć, że model jest nadmiernie dopasowany, ponieważ dokładność treningu jest wyższa).

Możesz zajrzeć do podsumowania modelu, aby dowiedzieć się więcej o każdej warstwie modelu.

model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
text_vectorization (TextVect (None, 100)               0         
_________________________________________________________________
embedding (Embedding)        (None, 100, 16)           160000    
_________________________________________________________________
global_average_pooling1d (Gl (None, 16)                0         
_________________________________________________________________
dense (Dense)                (None, 16)                272       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 17        
=================================================================
Total params: 160,289
Trainable params: 160,289
Non-trainable params: 0
_________________________________________________________________

Wizualizuj metryki modelu w TensorBoard.

%tensorboard --logdir logs

embeddings_classifier_accuracy.png

Pobierz wyuczone osadzenia słów i zapisz je na dysku

Następnie pobierz osadzenia słów, których nauczyłeś się podczas treningu. Osadzenia to wagi warstwy osadzania w modelu. Macierz wag ma kształt (vocab_size, embedding_dimension) .

vocab = vectorize_layer.get_vocabulary()
print(vocab[:10])
# Get weights matrix of layer named 'embedding'
weights = model.get_layer('embedding').get_weights()[0]
print(weights.shape) 
['', '[UNK]', 'the', 'and', 'a', 'of', 'to', 'is', 'in', 'it']
(10000, 16)

Zapisz wagi na dysku. Aby skorzystać z Projektora osadzania , prześlesz dwa pliki w formacie rozdzielanym zakładkami: plik wektorów (zawierający osadzenie) i plik metadanych (zawierający słowa).

  out_v = io.open('vecs.tsv', 'w', encoding='utf-8')
  out_m = io.open('meta.tsv', 'w', encoding='utf-8')

  for num, word in enumerate(vocab):
    if num == 0: continue # skip padding token from vocab
    vec = weights[num]
    out_m.write(word + "\n")
    out_v.write('\t'.join([str(x) for x in vec]) + "\n")
  out_v.close()
  out_m.close()

  try:
    from google.colab import files
  except ImportError:
    pass
  else:
    files.download('vecs.tsv')
    files.download('meta.tsv')

Jeśli korzystasz z tego samouczka w Colaboratory , możesz użyć następującego fragmentu kodu , aby pobrać te pliki na komputer lokalny (lub skorzystać z przeglądarki plików, Widok -> Spis treści -> Przeglądarka plików ).

Wizualizuj osadzenia

Aby zwizualizować osadzenia, prześlij je do projektora osadzania.

Otwórz Projektor osadzania (można go również uruchomić w lokalnej instancji TensorBoard).

  • Kliknij „Wczytaj dane”.

  • Prześlij dwa utworzone powyżej pliki: vecs.tsv i meta.tsv .

Zostaną wyświetlone wyuczone osadzenia. Możesz wyszukiwać słowa, aby znaleźć najbliższych sąsiadów. Na przykład spróbuj wyszukać „piękny”. Możesz zobaczyć sąsiadów jak „cudowni”.

Następne kroki

W tym samouczku pokazano, jak trenować i wizualizować osadzanie słów od podstaw na małym zestawie danych.

  • Aby dowiedzieć się więcej na temat osadzania słów i ich matematycznych reprezentacji, zapoznaj się z tą notatką Stanforda.

  • Aby dowiedzieć się więcej o zaawansowanym przetwarzaniu tekstu, przeczytaj model Transformer do rozumienia języka .