II. rész – A vektorizációs technikák típusai

Ebben a cikkben megvitatjuk a vektorizálást – egy NLP-technikát, és megértjük jelentőségét a vektorizálás különböző típusairól szóló átfogó útmutató segítségével.

Megbeszéltük az NLP előfeldolgozás és a szövegtisztítás alapvető fogalmait. Megnéztük az NLP alapjait, különféle alkalmazásait és technikáit, mint a tokenizálás, normalizálás, szabványosítás és szövegtisztítás.

Mielőtt a vektorizálásról beszélnénk, nézzük meg, mi az a tokenizálás, és miben különbözik a vektorizálástól.

Mi az a tokenizálás?

A tokenizálás a mondatok kisebb egységekre, úgynevezett tokenekre bontásának folyamata. A Token segít a számítógépeknek a szöveg egyszerű megértésében és kezelésében.

VOLT. „Jó ez a cikk”

Tokenek- [‘This’, ‘article’, ‘is’, ‘good’.]

Mi az a vektorizálás?

Mint tudjuk, a gépi tanulási modellek és algoritmusok megértik a numerikus adatokat. A vektorizálás a szöveges vagy kategorikus adatok numerikus vektorokká alakításának folyamata. Az adatok numerikus adatokká alakításával pontosabban betaníthatja a modellt.

Miért van szükségünk vektorizálásra?

❇️ A tokenizálás és a vektorizálás eltérő jelentőséggel bír a természetes nyelvi feldolgozásban (NPL). A tokenizálás a mondatokat kis tokenekre bontja. A vektorizálás numerikus formátummá alakítja át, így a számítógép/ML modell megértheti.

❇️ A vektorizálás nem csak a numerikus formára való konvertáláshoz, hanem a szemantikai jelentés rögzítéséhez is hasznos.

❇️ A vektorizálás csökkentheti az adatok dimenzióit és hatékonyabbá teheti azokat. Ez nagyon hasznos lehet nagy adatkészleten végzett munka során.

❇️ Sok gépi tanulási algoritmus numerikus bevitelt igényel, például neurális hálózatokat, hogy a vektorizálás segítségünkre legyen.

Különféle vektorizálási technikák léteznek, amelyeket ebben a cikkben fogunk megérteni.

Szavak zsákja

Ha van egy csomó dokumentuma vagy mondata, és elemezni szeretné őket, a Szavak zsákja leegyszerűsíti ezt a folyamatot azáltal, hogy a dokumentumot szavakkal teli zsákként kezeli.

A szavak zsákja megközelítés hasznos lehet a szövegosztályozásban, a hangulatelemzésben és a dokumentumok visszakeresésében.

Tegyük fel, hogy sok szövegen dolgozik. Egy zsáknyi szó segít a szöveges adatok megjelenítésében azáltal, hogy egyedi szavakból álló szókincset hoz létre szövegadatainkban. A szókincs létrehozása után minden szót vektorként kódol a szavak gyakorisága alapján (az egyes szavak milyen gyakran jelennek meg a szövegben).

Ezek a vektorok nem-negatív számokból állnak (0,1,2…..), amelyek az adott dokumentumban található gyakoriságok számát jelentik.

A szavak zsákja három lépésből áll:

1. lépés: Tokenizálás

A dokumentumokat tokenekre bontja.

Ex – (mondat: „Imádom a pizzát és szeretem a hamburgert”)

2. lépés: Egyedi szóválasztás/szókincs létrehozása

Készítsen listát a mondataiban megjelenő összes egyedi szóról.

[“I”, “love”, “Pizza”, “and”, “Burgers”]

3. lépés: A szó előfordulásának/vektor létrehozásának számlálása

Ez a lépés megszámolja, hogy az egyes szavak hányszor ismétlődnek a szókincsből, és egy ritka mátrixban tárolják. A ritka mátrixban egy mondatvektor minden sora, amelynek hossza (a mátrix oszlopai) megegyezik a szókincs méretével.

Import CountVectorizer

Importálni fogjuk a CountVectorizert, hogy megtanítsuk a Bag of Word modellünket

from sklearn.feature_extraction.text import CountVectorizer

Vectorizer létrehozása

Ebben a lépésben létrehozzuk a modellünket a CountVectorizer segítségével, és betanítjuk a minta szöveges dokumentumunk segítségével.

# Sample text documents
documents = [
    "This is the first document.",
    "This document is the second document.",
    "And this is the third one.",
    "Is this the first document?",
]

# Create a CountVectorizer 
cv = CountVectorizer()
# Fit and Transform
X = cv.fit_transform(documents)

Átalakítás sűrű tömbbé

Ebben a lépésben a reprezentációinkat sűrű tömbbé alakítjuk. Ezenkívül a jellemzők neveit vagy szavakat is megkapjuk.

# Get the feature names/words
feature_names = vectorizer.get_feature_names_out()

# Convert to dense array
X_dense = X.toarray()

Nyomtassuk ki a Dokumentum kifejezés mátrixát és jellemző szavakat

# Print the DTM and feature names
print("Document-Term Matrix (DTM):")
print(X_dense)
print("\nFeature Names:")
print(feature_names)

Dokumentum – Term Matrix (DTM):

Mátrix

Funkciók nevei:

Jellemző szavak

Amint látható, a vektorok nem negatív számokból állnak (0,1,2……), amelyek a szavak gyakoriságát jelentik a dokumentumban.

Négy minta szöveges dokumentumunk van, és kilenc egyedi szót azonosítottunk ezekből a dokumentumokból. Ezeket az egyedi szavakat úgy tároltuk a szókincsünkben, hogy „Feature Names”-t rendeltünk hozzájuk.

Ezután a Bag of Words modellünk ellenőrzi, hogy az első egyedi szó szerepel-e az első dokumentumunkban. Ha jelen van, akkor 1-et ad, egyébként 0-t.

Ha a szó többször előfordul (pl. 2-szer), akkor ennek megfelelően értéket rendel.

Például a második dokumentumban a „dokumentum” szó kétszer ismétlődik, így az értéke a mátrixban 2 lesz.

Ha egyetlen szót akarunk jellemzőként a szókincs kulcsában – Unigram reprezentáció.

n – gramm = Unigramok, nagyok…….stb.

Sok olyan könyvtár létezik, mint például a scikit-learn a szavak végrehajtásához: Keras, Gensim és mások. Ez egyszerű, és különböző esetekben hasznos lehet.

De a Bag of Word gyorsabb, de vannak korlátai.

  • Minden szónak azonos súlyt tulajdonít, függetlenül annak fontosságától. Sok esetben egyes szavak fontosabbak, mint mások.
  • A BoW egyszerűen megszámolja egy szó gyakoriságát, vagy azt, hogy egy szó hányszor jelenik meg a dokumentumban. Ez elfogultsághoz vezethet az olyan gyakori szavak iránt, mint a „a”, „és”, „van” stb., amelyeknek nem sok értelme van.
  • A hosszabb dokumentumok több szót tartalmazhatnak, és nagyobb vektorokat hozhatnak létre. Ez megnehezítheti az összehasonlítást. Ritka mátrixot tud létrehozni, ami nem lehet jó összetett NLP projektek végrehajtására.
  • A probléma megoldására jobb megoldásokat is választhatunk, ezek egyike a TF-IDF. Nézzük, értsük meg részletesen.

      Részletes útmutató a cseppkampányhoz marketingeseknek

    TF-IDF

    A TF-IDF vagy Term Frequency – Inverse Document Frequency, egy numerikus ábrázolás, amely meghatározza a szavak fontosságát a dokumentumban.

    Miért van szükségünk a TF-IDF-re a Bag of Words helyett?

    Egy zsáknyi szó minden szót egyformán kezel, és csak az egyedi szavak gyakoriságára vonatkozik a mondatokban. A TF-IDF fontosságot tulajdonít a szavaknak egy dokumentumban, figyelembe véve mind a gyakoriságot, mind az egyediséget.

    A túl gyakran ismétlődő szavak nem győzik le a ritkábban előforduló és fontosabb szavakat.

    TF: A kifejezés gyakorisága azt méri, hogy egy szó mennyire fontos egyetlen mondatban.

    IDF: Az inverz dokumentumgyakoriság azt méri, hogy egy szó mennyire fontos a teljes dokumentumgyűjteményben.

    TF = Szavak gyakorisága egy dokumentumban / A szavak teljes száma a dokumentumban

    DF = w szót tartalmazó dokumentum / Dokumentumok teljes száma

    IDF = napló (dokumentumok teljes száma / w szót tartalmazó dokumentumok)

    Az IDF a DF reciprokja. Ennek az az oka, hogy minél gyakoribb a szó az összes dokumentumban, annál kisebb a jelentősége az aktuális dokumentumban.

    Végső TF-IDF pontszám: TF-IDF = TF * IDF

    Ez egy módja annak, hogy megtudja, mely szavak közösek egyetlen dokumentumon belül, és mely szavak egyediek az összes dokumentumban. Ezek a szavak hasznosak lehetnek a dokumentum fő témájának megtalálásához.

    Például,

    Doc1 = „Szeretem a gépi tanulást”

    Doc2 = „Imádom a etoppc.com-t”

    Meg kell találnunk a dokumentumainkhoz a TF-IDF mátrixot.

    Először is létrehozunk egy egyedi szavak szótárát.

    Szókincs = [“I,” “love,” “machine,” “learning,” “Geekflare”]

    Tehát van 5 öt szavunk. Keressük ezekre a szavakra a TF-et és az IDF-et.

    TF = Szavak gyakorisága egy dokumentumban / A szavak teljes száma a dokumentumban

    TF:

    • „I” = TF esetén Doc1: 1/4 = 0,25 és Doc2 esetén: 1/3 ≈ 0,33
    • „Szerelem” esetén: TF Doc1 esetén: 1/4 = 0,25 és Doc2 esetén: 1/3 ≈ 0,33
    • „Gép” esetén: TF Doc1 esetén: 1/4 = 0,25 és Doc2 esetén: 0/3 ≈ 0
    • „Tanulás” esetén: TF Doc1 esetén: 1/4 = 0,25 és Doc2 esetén: 0/3 ≈ 0
    • „etoppc.com” esetén: TF Doc1 esetén: 0/4 = 0 és Doc2 esetén: 1/3 ≈ 0,33

    Most számoljuk ki az IDF-et.

    IDF = napló (dokumentumok teljes száma / w szót tartalmazó dokumentumok)

    IDF:

    • „I” esetén: az IDF log(2/2) = 0
    • A „szerelem” esetében: az IDF log(2/2) = 0
    • „Gép” esetén: az IDF log(2/1) = log(2) ≈ 0,69
    • „Tanulás” esetén: az IDF log(2/1) = log(2) ≈ 0,69
    • „etoppc.com” esetén: az IDF log(2/1) = log(2) ≈ 0,69

    Most számítsuk ki a TF-IDF végső pontszámát:

    • „I” esetén: TF-IDF Doc1 esetén: 0,25 * 0 = 0 és TF-IDF Doc2 esetén: 0,33 * 0 = 0
    • „Szerelem” esetén: TF-IDF Doc1 esetén: 0,25 * 0 = 0 és TF-IDF Doc2 esetén: 0,33 * 0 = 0
    • „Gép” esetén: TF-IDF Doc1-hez: 0,25 * 0,69 ≈ 0,17 és TF-IDF Doc2 esetén: 0 * 0,69 = 0
    • „Tanuláshoz”: TF-IDF Doc1 esetén: 0,25 * 0,69 ≈ 0,17 és TF-IDF Doc2 esetén: 0 * 0,69 = 0
    • „etoppc.com” esetén: TF-IDF Doc1 esetén: 0 * 0,69 = 0 és TF-IDF Doc2 esetén: 0,33 * 0,69 ≈ 0,23

    A TF-IDF mátrix így néz ki:

            I     love   machine   learning   etoppc.com
    Doc1    0.0   0.0    0.17      0.17       0.0
    Doc2    0.0   0.0    0.0       0.0        0.23
    

    A TF-IDF mátrix értékei megmutatják, hogy az egyes kifejezések mennyire fontosak az egyes dokumentumokon belül. A magas értékek azt jelzik, hogy egy kifejezés fontos egy adott dokumentumban, míg az alacsony értékek azt jelzik, hogy a kifejezés kevésbé fontos vagy gyakori ebben a kontextusban.

    A TF-IDF-et leginkább szövegosztályozásra, chatbot-információk lekérésére és szövegösszegzésre használják.

    Importálja a TfidfVektorizert

    Importáljuk a TfidfVectorizer-t a sklearnből

    from sklearn.feature_extraction.text import TfidfVectorizer

    Vectorizer létrehozása

    Amint látja, a Tf Idf modellünket a TfidfVectorizer segítségével hozzuk létre.

    # Sample text documents
    text = [
        "This is the first document.",
        "This document is the second document.",
        "And this is the third one.",
        "Is this the first document?",
    ]
    
    # Create a TfidfVectorizer 
    cv = TfidfVectorizer()

    Hozzon létre TF-IDF mátrixot

    Tanítsuk a modellünket szöveg megadásával. Ezt követően a reprezentatív mátrixot sűrű tömbbé alakítjuk.

    # Fit and transform to create the TF-IDF matrix
    X = cv.fit_transform(text)
    # Get the feature names/words
    feature_names = vectorizer.get_feature_names_out()
    
    # Convert the TF-IDF matrix to a dense array for easier manipulation (optional)
    X_dense = X.toarray()

    Nyomtassa ki a TF-IDF mátrixot és a jellemzőszavakat

    # Print the TF-IDF matrix and feature words
    print("TF-IDF Matrix:")
    print(X_dense)
    print("\nFeature Names:")
    print(feature_names)
    

    TF-IDF mátrix:

    Feature Words

    Amint látja, ezek a tizedesvesszőpontok a szavak fontosságát jelzik bizonyos dokumentumokban.

    Ezenkívül n-grammokkal kombinálhatja a szavakat 2, 3, 4 és így tovább.

    Vannak más paraméterek is, amelyeket megadhatunk: min_df, max_feature, subliner_tf stb.

    Eddig az alapvető frekvencia alapú technikákat fedeztük fel.

    A TF-IDF azonban nem tudja biztosítani a szöveg szemantikai jelentését és kontextuális megértését.

    Ismerjük meg azokat a fejlettebb technikákat, amelyek megváltoztatták a szóbeágyazás világát, és amelyek jobbak a szemantikai jelentés és a kontextuális megértés szempontjából.

    Word2Vec

    A Word2vec népszerű szóbeágyazás (szóvektor típusa és hasznos a szemantikai és szintaktikai hasonlóság megragadásához) technika az NLP-ben. Ezt Tomas Mikolov és csapata a Google-nál fejlesztette ki 2013-ban. A Word2vec a szavakat folyamatos vektorokként jeleníti meg egy többdimenziós térben.

    A Word2vec célja, hogy a szavakat olyan módon ábrázolja, amely megragadja azok szemantikai jelentését. A word2vec által generált szóvektorok egy folytonos vektortérben helyezkednek el.

    Pl. – A „Macska” és „Kutya” vektorok közelebb lennének, mint a „macska” és „lány” vektorok.

    Forrás: usna.edu

    A word2vec két modellarchitektúrát használhat szóbeágyazás létrehozására.

    CBOW: A folyamatos szavak vagy a CBOW megpróbálja megjósolni a szót a közeli szavak jelentésének átlagolásával. Rögzített számú vagy ablaknyi szót vesz a célszó körül, majd numerikus formává alakítja (Beágyazás), majd az összeset átlagolja, és ezt az átlagot használja a célszó előrejelzésére a neurális hálózattal.

      5 igényelt készség, amelyet megtanulhatsz a passzív jövedelemhez

    Előre megjósolt célpont: „Fox”

    Mondatszavak: „A”, „gyors”, „barna”, „ugrik”, „át”, „a”

    Word2Vec

    • A CBOW rögzített méretű ablakot (számot) vesz a szavakból, például 2 (2 balra és 2 jobbra)
    • Átalakítás szóbeágyazásra.
    • A CBOW átlagolja a beágyazás szót.
    • A CBOW átlagolja a szóbeágyazást a kontextusszavakhoz.
    • Az átlagolt vektor egy neurális hálózat segítségével próbálja megjósolni a célszót.

    Most értsük meg, miben különbözik a skip-gram a CBOW-tól.

    Skip-gram: Ez egy szóbeágyazó modell, de másképp működik. A célszó megjóslása helyett a skip-gram megjósolja a célszavakhoz adott kontextusszavakat.

    A Skip-grams jobban megragadja a szavak közötti szemantikai kapcsolatokat.

    Volt „Király – Férfiak + Nők = Királynő”

    Ha Word2Vec-cel szeretne dolgozni, két választása van: vagy saját modelljét taníthatja, vagy egy előre betanított modellt használhat. Egy előre betanított modellen megyünk keresztül.

    Import gensim

    A gensim-et a pip install segítségével telepítheti:

    pip install gensim

    Tokenizálja a mondatot a word_tokenize használatával:

    Először a mondatokat alacsonyabbra alakítjuk. Ezt követően a word_tokenize segítségével tokenizáljuk a mondatainkat.

    # Import necessary libraries
    from gensim.models import Word2Vec
    from nltk.tokenize import word_tokenize
    
    # Sample sentences
    sentences = [
        "I love thor",
        "Hulk is an important member of Avengers",
        "Ironman helps Spiderman",
        "Spiderman is one of the popular members of Avengers",
    ]
    
    # Tokenize the sentences
    tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]
    

    Tanítsuk a modellünket:

    A modellünket tokenizált mondatok biztosításával képezzük. Ehhez a képzési modellhez 5 ablakot használunk, igény szerint alkalmazkodhat.

    # Train a Word2Vec model
    model = Word2Vec(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, sg=0)
    
    # Find similar words
    similar_words = model.wv.most_similar("avengers")
    # Print similar words
    print("Similar words to 'avengers':")
    
    for word, score in similar_words:
        print(f"{word}: {score}")

    Hasonló szavak a „bosszúállók” szóhoz:

    Word2Vec hasonlóság

    Ezek olyan szavak, amelyek a Word2Vec modellen alapuló „bosszúállók”-hoz hasonlóak a hasonlósági pontszámukkal együtt.

    A modell hasonlósági pontszámot (többnyire koszinusz-hasonlóságot) számít ki a „bosszúállók” szóvektorok és a szókincsében szereplő más szavak között. A hasonlósági pontszám azt jelzi, hogy két szó milyen szorosan kapcsolódik egymáshoz a vektortérben.

    Ex-

    Itt a „segít” szó koszinusz hasonlósággal -0,005911458611011982 a „bosszúállók” szóval. A negatív érték arra utal, hogy eltérhetnek egymástól.

    A koszinusz hasonlósági értékek -1 és 1 között mozognak, ahol:

    • Az 1 azt jelzi, hogy a két vektor azonos és pozitív hasonlóságot mutat.
    • Az 1-hez közeli értékek nagy pozitív hasonlóságot jeleznek.
    • A 0-hoz közeli értékek azt jelzik, hogy a vektorok nem állnak szoros kapcsolatban egymással.
    • A -1-hez közeli értékek nagy eltérést jeleznek.
    • A -1 azt jelzi, hogy a két vektor teljesen ellentétes, és tökéletes negatív hasonlóságuk van.

    Látogassa meg ezt link ha szeretné jobban megérteni a word2vec modelleket, és vizuálisan szeretné bemutatni működésüket. Ez egy igazán klassz eszköz a CBOW és a skip-gram működés közbeni megtekintéséhez.

    A Word2Vec-hez hasonlóan nálunk is van GloVe. A GloVe a Word2Vec-hez képest kevesebb memóriát igénylő beágyazásokat képes előállítani. Tudjunk meg többet a GloVe-ről.

    Kesztyű

    A szóábrázolás globális vektorai (GloVe) egy olyan technika, mint a word2vec. Szavak vektorként való ábrázolására használják folytonos térben. A GloVe mögött meghúzódó koncepció megegyezik a Word2Vec koncepciójával: kontextuális szóbeágyazásokat hoz létre, miközben figyelembe veszi a Word2Vec kiváló teljesítményét.

    Miért van szükségünk a GloVe-re?

    A Word2vec egy ablak alapú módszer, és a közeli szavakat használja a szavak megértéséhez. Ez azt jelenti, hogy a célszó szemantikai jelentését csak a környező szavai befolyásolják a mondatokban, ami a statisztika nem hatékony felhasználása.

    Míg a GloVe globális és helyi statisztikákat is rögzít a szóbeágyazáshoz.

    Mikor kell használni a GloVe-t?

    Használja a GloVet, ha olyan szóbeágyazást szeretne, amely szélesebb szemantikai kapcsolatokat és globális szótársítást rögzít.

    A GloVe jobb, mint más modellek a megnevezett entitásfelismerési feladatokban, a szóanalógiában és a szóhasonlóságban.

    Először telepítenünk kell a Gensim-et:

    pip install gensim

    1. lépés: Fontos könyvtárakat fogunk telepíteni

    # Import the required libraries
    
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.manifold import TSNE
    import gensim.downloader as api  

    2. lépés: Importálja a Glove modellt

    import gensim.downloader as api
    glove_model = api.load('glove-wiki-gigaword-300')

    3. lépés: Keresse meg az „aranyos” szó vektoros szóábrázolását

    glove_model["cute"]

    vektor az „aranyos” szóhoz

    Ezek az értékek megragadják a szó jelentését és kapcsolatait más szavakkal. A pozitív értékek pozitív asszociációkat jeleznek bizonyos fogalmakkal, míg a negatív értékek negatív asszociációkat más fogalmakkal.

    A GloVe modellben a szóvektor minden dimenziója a szó jelentésének vagy kontextusának egy bizonyos aspektusát képviseli.

    A negatív és pozitív értékek ezekben a dimenziókban hozzájárulnak ahhoz, hogy az „aranyos” szemantikailag milyen kapcsolatban áll a modell szókincsének más szavaival.

    Az értékek a különböző modelleknél eltérőek lehetnek. Keressünk néhány hasonló szót a „fiú” szóhoz

    A 10 legjobb hasonló szó, amely a modell szerint leginkább a „fiú” szóhoz hasonlít

    # find similar word
    glove_model.most_similar("boy")

    A 10 legjobb, ehhez hasonló szó, mint a „fiú”

    Amint látja, a „fiú” szóhoz leginkább a „lány” hasonlít.

    Most megpróbáljuk megtalálni, hogy a modell milyen pontosan kap szemantikai jelentést a megadott szavakból.

    glove_model.most_similar(positive=['boy', 'queen'], negative=['girl'], topn=1)

    A „királynő” legrelevánsabb szója

    Modellünk képes tökéletes kapcsolatot találni a szavak között.

    Szójegyzék meghatározása:

    Most próbáljuk megérteni a szemantikai jelentést vagy a szavak közötti kapcsolatot egy cselekmény segítségével. Határozza meg a megjeleníteni kívánt szavak listáját.

    # Define the list of words you want to visualize
    vocab = ["boy", "girl", "man", "woman", "king", "queen", "banana", "apple", "mango", "cow", "coconut", "orange", "cat", "dog"]
    

    Beágyazási mátrix létrehozása:

    Írjunk kódot a beágyazási mátrix létrehozásához.

    # Your code for creating the embedding matrix
    EMBEDDING_DIM = glove_model.vectors.shape[1]
    word_index = {word: index for index, word in enumerate(vocab)}
    num_words = len(vocab)
    embedding_matrix = np.zeros((num_words, EMBEDDING_DIM))
    
    for word, i in word_index.items():
        embedding_vector = glove_model[word]
        if embedding_vector is not None:
            embedding_matrix[i] = embedding_vector

    Határozzon meg egy függvényt a t-SNE megjelenítéshez:

      Találkozókat hozhat létre, megoszthat SMS-ben és e-mailben, támogatja az RSVP-t és az iCloud-ot

    Ebből a kódból fogjuk meghatározni a vizualizációs diagramunk függvényét.

    def tsne_plot(embedding_matrix, words):
        tsne_model = TSNE(perplexity=3, n_components=2, init="pca", random_state=42)
        coordinates = tsne_model.fit_transform(embedding_matrix)
    
        x, y = coordinates[:, 0], coordinates[:, 1]
    
        plt.figure(figsize=(14, 8))
        for i, word in enumerate(words):
            plt.scatter(x[i], y[i])
            plt.annotate(word,
                         xy=(x[i], y[i]),
                         xytext=(2, 2),
                         textcoords="offset points",
                         ha="right",
                         va="bottom")
        plt.show()
    

    Lássuk, hogyan néz ki a cselekményünk:

    # Call the tsne_plot function with your embedding matrix and list of words
    tsne_plot(embedding_matrix, vocab)
    

    t-SNE telek

    Tehát, mint látjuk, a telkünk bal oldalán olyan szavak találhatók, mint a „banán”, „mangó”, „narancs”, „kókusz” és „alma”. Míg a „tehén”, a „kutya” és a „macska” hasonlók egymáshoz, mert állatok.

    Tehát a modellünk képes megtalálni a szemantikai jelentést és a szavak közötti kapcsolatokat is!

    A szóhasználat megváltoztatásával vagy a modell létrehozásával a semmiből kísérletezhet különböző szavakkal.

    Ezt a beágyazási mátrixot tetszés szerint használhatja. Alkalmazható szóhasonlósági feladatokra önmagában, vagy betáplálható egy neurális hálózat beágyazási rétegébe.

    A GloVe egy együttes előfordulási mátrixon tanul, hogy szemantikai jelentést kapjon. Azon az elgondoláson alapul, hogy a szó-szó együttes előfordulásai az ismeretek nélkülözhetetlen részét képezik, és felhasználásuk hatékony módja a statisztikák felhasználásának a szóbeágyazások előállítására. Így éri el a GloVe, hogy „globális statisztikákat” ad hozzá a végtermékhez.

    És ez a GloVe; Egy másik népszerű vektorizálási módszer a FastText. Beszéljünk róla bővebben.

    FastText

    A FastText egy nyílt forráskódú könyvtár, amelyet a Facebook mesterséges intelligenciakutató csapata vezetett be szövegosztályozásra és hangulatelemzésre. A FastText eszközöket biztosít a szóbeágyazás betanításához, amelyek sűrű vektoros szavak. Ez hasznos a dokumentum szemantikai jelentésének rögzítéséhez. A FastText támogatja a többcímkés és több osztályos osztályozást is.

    Miért FastText?

    A FastText jobb, mint más modellek, mert képes ismeretlen szavakra általánosítani, ami más módszerekből hiányzott. A FastText előre betanított szóvektorokat biztosít különböző nyelvekhez, amelyek hasznosak lehetnek különböző feladatokban, ahol előzetes ismeretekre van szükségünk a szavakkal és jelentésükkel kapcsolatban.

    FastText vs Word2Vec

    Hogyan működik?

    Amint azt megbeszéltük, más modellek, például a Word2Vec és a GloVe szavakat használnak a szóbeágyazáshoz. De a FastText építőköve szavak helyett betűk. Ez azt jelenti, hogy betűket használnak a szóbeágyazáshoz.

    A szavak helyett karakterek használatának van egy másik előnye is. Kevesebb adatra van szükség az edzéshez. Ahogy egy szó kontextusává válik, így több információ nyerhető ki a szövegből.

    A FastText segítségével kapott Word Embedding alacsonyabb szintű beágyazások kombinációja.

    Most nézzük meg, hogyan használja fel a FastText az alszavakat.

    Tegyük fel, hogy megvan az „olvasás” szó. Ennél a szónál a 3–6 hosszúságú n-gramm karakterek generálása a következőképpen történik:

    • A kezdetet és a végét szögletes zárójelek jelzik.
    • A kivonatolást azért használjuk, mert nagyszámú n-gram lehet; ahelyett, hogy minden egyes n-gramhoz megtanulnánk egy beágyazást, megtanuljuk a teljes B beágyazást, ahol B a vödör méretét jelenti. Az eredeti papíron a 2 milliós vödör méretet használták.
    • Minden n-gram karakter, például az „eadi”, 1 és B közötti egész számra van leképezve ezzel a hash-függvénnyel, és ez az index rendelkezik a megfelelő beágyazottsággal.
    • Ezen alkotó n-gramm beágyazások átlagolásával a teljes szó beágyazást kapjuk.
    • Még ha ez a kivonatolási megközelítés ütközéseket is eredményez, nagymértékben segít kezelni a szókincs méretét.
    • A FastTextben használt hálózat hasonló a Word2Vec-hez. Csakúgy, mint ott, a FastText-et két módban edzhetjük – CBOW és skip-gram. Így ezt a részt nem kell még egyszer megismételnünk.

    Képezheti saját modelljét, vagy használhat egy előre betanított modellt. Előre betanított modellt fogunk használni.

    Először telepítenie kell a FastText-et.

    pip install fasttext

    Egy olyan adatkészletet fogunk használni, amely néhány droggal kapcsolatos párbeszédes szövegből áll, és ezeket a szövegeket 3 típusba kell sorolnunk. Mint azokkal a drogokkal, amelyekkel kapcsolatban vannak.

    Adatkészlet

    Most, hogy egy FastText modellt bármilyen adathalmazra betaníthassunk, elő kell készítenünk a bemeneti adatokat egy bizonyos formátumban, ami a következő:

    __címke__

    Tegyük ezt meg az adatkészletünknél is.

    all_texts = train['text'].tolist()
    all_labels = train['drug type'].tolist()
    prep_datapoints=[]
    
    for i in range(len(all_texts)):
        sample="__label__"+ str(all_labels[i]) + ' '+ all_texts[i]
        prep_datapoints.append(sample)

    prep_datapoints

    Ebben a lépésben sok előfeldolgozást kihagytunk. Ellenkező esetben cikkünk túl nagy lesz. Valós problémák esetén a legjobb az előfeldolgozást elvégezni, hogy az adatok alkalmasak legyenek a modellezésre.

    Most írjon előkészített adatpontokat egy .txt fájlba.

    with open('train_fasttext.txt','w') as f:
        for datapoint in prep_datapoints:
            f.write(datapoint)
            f.write('n')
        f.close()
    

    Képezzük a modellünket.

    model = fasttext.train_supervised('train_fasttext.txt')

    A modellünkből előrejelzéseket fogunk kapni.

    A modell előrejelzi a címkét, és megbízhatósági pontszámot rendel hozzá.

    Mint minden más modellnél, ennek a modellnek a teljesítménye számos változótól függ, de ha gyorsan szeretne képet kapni arról, hogy mi az elvárt pontosság, a FastText nagyszerű választás lehet.

    Következtetés

    Összefoglalva, a szövegvektorizálási módszerek, mint például a Bag of Words (BoW), a TF-IDF, a Word2Vec, a GloVe és a FastText, számos lehetőséget biztosítanak az NLP-feladatokhoz.

    Míg a Word2Vec rögzíti a szószemantikát, és számos NLP-feladathoz adaptálható, a BoW és a TF-IDF egyszerűek, és alkalmasak szövegosztályozásra és ajánlásra.

    Az olyan alkalmazásokhoz, mint a hangulatelemzés, a GloVe előre betanított beágyazásokat kínál, a FastText pedig jól teljesít az alszavak szintjén, így hasznos a szerkezetileg gazdag nyelvek és entitásfelismerés esetén.

    A technika megválasztása a feladattól, az adatoktól és az erőforrásoktól függ. A sorozat előrehaladtával részletesebben fogunk tárgyalni az NLP bonyolultságáról. Boldog tanulást!

    Ezután tekintse meg a legjobb NLP-tanfolyamokat a természetes nyelvi feldolgozás megtanulásához.