logo

Nepřetržitý pytel slov (CBOW) v NLP

Aby počítač porozuměl psanému textu, můžeme slova reprezentovat jako číselné vektory. Jedním ze způsobů, jak toho dosáhnout, je použití vložení aplikace Word, která představuje způsob reprezentace slov jako číselných vektorů. Tyto vektory zachycují význam slov a jejich vztahy k jiným slovům v jazyce. Vložení slov lze generovat pomocí algoritmů učení bez dozoru, jako jsou např Word2vec, Rukavice nebo FastText .

Word2vec je metoda založená na neuronové síti pro generování vložení slov, což jsou husté vektorové reprezentace slov, které zachycují jejich sémantický význam a vztahy. Existují dva hlavní přístupy k implementaci Word2vec:



    Nepřetržitý pytlík slov (CBOW)
  • Přeskočte gram

Co je to nepřetržitý pytel slov (CBOW)?

Continuous Bag of Words (CBOW) je oblíbená technika zpracování přirozeného jazyka používaná ke generování vkládání slov. Vkládání slov je důležité pro mnoho úloh NLP, protože zachycuje sémantické a syntaktické vztahy mezi slovy v jazyce. CBOW je algoritmus založený na neuronové síti, který předpovídá cílové slovo na základě jeho okolních kontextových slov. Jedná se o typ bez dozoru učení, což znamená, že se může učit z neoznačených dat a často se používá k předtrénování vkládání slov, která lze použít pro různé úkoly NLP, jako je analýza sentimentu, strojový překlad.

Příklad modelu CBOW

Příklad modelu CBOW

Je nějaký rozdíl mezi modelem Bag-of-Words (BoW) a Continuous Bag-of-Words (CBOW)?

  • Model Bag-of-Words a Continuous Bag-of-Words model jsou oba techniky používané při zpracování přirozeného jazyka k reprezentaci textu v počítačově čitelném formátu, liší se však tím, jak zachycují kontext.
  • Model BoW představuje text jako soubor slov a jejich frekvenci v daném dokumentu nebo korpusu. Nebere v úvahu pořadí nebo kontext, ve kterém se slova objevují, a proto nemusí zachytit plný význam textu. Model BoW je jednoduchý a snadno implementovatelný, má však omezení v zachycení významu jazyka.
  • Naproti tomu model CBOW je přístup založený na neuronové síti, který zachycuje kontext slov. Učí se předvídat cílové slovo na základě slov, která se v daném kontextovém okně objevují před ním a za ním. Při zohlednění okolních slov může model CBOW lépe zachytit význam slova v daném kontextu.

Architektura modelu CBOW

Model CBOW používá cílové slovo kolem kontextového slova, aby jej předpověděl. Zvažte výše uvedený příklad Je to skvělá tanečnice. Model CBOW převádí tuto frázi na dvojice kontextových slov a cílových slov. Párování slov by vypadalo takto ([ona, a], je), ([je, skvělá], a) ([a, tanečnice], skvělá) s velikostí okna = 2.



Architektura CBOW

Architektura CBOW

Model zvažuje kontextová slova a snaží se předpovědět cílový výraz. Čtyři 1∗W vstupní vektory budou předány vstupní vrstvě, pokud mají čtyři slova jako kontextová slova použita k predikci jednoho cílového slova. Skrytá vrstva přijme vstupní vektory a poté je vynásobí maticí W∗N. Výstup 1∗N ze skryté vrstvy nakonec vstupuje do součtové vrstvy, kde jsou vektory po prvcích sečteny před provedením konečné aktivace a výstup je získán z výstupní vrstvy.

Implementace kódu CBOW

Pojďme implementovat vkládání slov, abychom ukázali podobnost slov pomocí modelu CBOW. V tomto článku jsem definoval svůj vlastní korpus slov, můžete použít libovolnou datovou sadu. Nejprve naimportujeme všechny potřebné knihovny a načteme datovou sadu. Dále provedeme tokenizaci každého slova a převedeme ho na vektor celých čísel.



avl stromy

Python3




import> tensorflow as tf> from> tensorflow.keras.models>import> Sequential> from> tensorflow.keras.layers>import> Dense,> >Embedding, Lambda> from> tensorflow.keras.preprocessing.text>import> Tokenizer> import> numpy as np> import> matplotlib.pyplot as plt> from> sklearn.decomposition>import> PCA> # Define the corpus> corpus>=> [>'The cat sat on the mat'>,> >'The dog ran in the park'>,> >'The bird sang in the tree'>]> # Convert the corpus to a sequence of integers> tokenizer>=> Tokenizer()> tokenizer.fit_on_texts(corpus)> sequences>=> tokenizer.texts_to_sequences(corpus)> print>('After converting our words>in> the corpus> into vector of integers:')> print>(sequences)>

>

>

Výstup:

After converting our words in the corpus into vector of integers: [[1, 3, 4, 5, 1, 6], [1, 7, 8, 2, 1, 9], [1, 10, 11, 2, 1, 12]]>

Nyní vytvoříme model CBOW s velikostí okna = 2.

Python3




# Define the parameters> vocab_size>=> len>(tokenizer.word_index)>+> 1> embedding_size>=> 10> window_size>=> 2> # Generate the context-target pairs> contexts>=> []> targets>=> []> for> sequence>in> sequences:> >for> i>in> range>(window_size,>len>(sequence)>-> window_size):> >context>=> sequence[i>-> window_size:i]>+>> >sequence[i>+> 1>:i>+> window_size>+> 1>]> >target>=> sequence[i]> >contexts.append(context)> >targets.append(target)> # Convert the contexts and targets to numpy arrays> X>=> np.array(contexts)> # Define the CBOW model> model>=> Sequential()> model.add(Embedding(input_dim>=>vocab_size,> >output_dim>=>embedding_size,> >input_length>=>2>*>window_size))> model.add(Lambda(>lambda> x: tf.reduce_mean(x, axis>=>1>)))> model.add(Dense(units>=>vocab_size, activation>=>'softmax'>))> model.save_weights(>'cbow_weights.h5'>)> # Load the pre-trained weights> model.load_weights(>'cbow_weights.h5'>)>

>

instanceof

>

jak zjistím velikost monitoru

Dále použijeme model k vizualizaci vložení.

Python3




# Get the word embeddings> embeddings>=> model.get_weights()[>0>]> # Perform PCA to reduce the dimensionality> # of the embeddings> pca>=> PCA(n_components>=>2>)> reduced_embeddings>=> pca.fit_transform(embeddings)> # Visualize the embeddings> plt.figure(figsize>=>(>5>,>5>))> for> i, word>in> enumerate>(tokenizer.word_index.keys()):> >x, y>=> reduced_embeddings[i]> >plt.scatter(x, y)> >plt.annotate(word, xy>=>(x, y), xytext>=>(>5>,>2>),> >textcoords>=>'offset points'>,> >ha>=>'right'>, va>=>'bottom'>)> plt.show()>

>

>

Výstup:

Vektorizovaná reprezentace slov pomocí modelu CBOW

Vektorizovaná reprezentace slov pomocí modelu CBOW

Tato vizualizace nám umožňuje pozorovat podobnost slov na základě jejich vložení. Očekává se, že slova, která mají podobný význam nebo kontext, budou v zápletce blízko sebe.