Del II – Typer vektoriseringsteknikker

I denne artikkelen vil vi diskutere vektorisering – en NLP-teknikk, og forstå dens betydning med en omfattende veiledning om ulike typer vektorisering.

Vi har diskutert de grunnleggende konseptene for NLP-forbehandling og tekstrensing. Vi så på det grunnleggende om NLP, dets ulike applikasjoner og teknikker som tokenisering, normalisering, standardisering og tekstrensing.

Før vi diskuterer vektorisering, la oss revidere hva tokenisering er og hvordan det skiller seg fra vektorisering.

Hva er tokenisering?

Tokenisering er prosessen med å bryte ned setninger i mindre enheter kalt tokens. Token hjelper datamaskiner med å forstå og arbeide med tekst enkelt.

EX. «Denne artikkelen er bra»

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

Hva er vektorisering?

Som vi vet forstår maskinlæringsmodeller og algoritmer numeriske data. Vektorisering er en prosess for å konvertere tekstlige eller kategoriske data til numeriske vektorer. Ved å konvertere data til numeriske data kan du trene modellen mer nøyaktig.

Hvorfor trenger vi vektorisering?

❇️ Tokenisering og vektorisering har ulik betydning i naturlig språkbehandling (NPL). Tokenisering deler setninger i små tokens. Vektorisering konverterer det til et numerisk format slik at datamaskinen/ML-modellen kan forstå det.

❇️ Vektorisering er ikke bare nyttig for å konvertere den til numerisk form, men også nyttig for å fange semantisk betydning.

❇️ Vektorisering kan redusere dimensjonaliteten til dataene og gjøre dem mer effektive. Dette kan være veldig nyttig når du arbeider med et stort datasett.

❇️ Mange maskinlæringsalgoritmer krever numerisk input, for eksempel nevrale nettverk, slik at vektorisering kan hjelpe oss.

Det finnes forskjellige typer vektoriseringsteknikker, som vi vil forstå gjennom denne artikkelen.

Pose med ord

Hvis du har en haug med dokumenter eller setninger og du vil analysere dem, forenkler en pose med ord denne prosessen ved å behandle dokumentet som en pose som er fylt med ord.

Posen med ord-tilnærmingen kan være nyttig i tekstklassifisering, sentimentanalyse og dokumentinnhenting.

Tenk deg at du jobber med mye tekst. En pose med ord vil hjelpe deg med å representere tekstdata ved å lage et vokabular med unike ord i tekstdataene våre. Etter å ha opprettet ordforråd, vil det kode hvert ord som en vektor basert på frekvensen (hvor ofte hvert ord vises i den teksten) av disse ordene.

Disse vektorene består av ikke-negative tall (0,1,2…..) som representerer antall frekvenser i det dokumentet.

Posen med ord innebærer tre trinn:

Trinn 1: Tokenisering

Det vil bryte dokumenter i tokens.

Eks – (Setning: «Jeg elsker Pizza og jeg elsker burgere»)

Trinn 2: Unik ordseparasjon/ordforråd

Lag en liste over alle de unike ordene som vises i setningene dine.

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

Trinn 3: Telle ordforekomst/vektoroppretting

Dette trinnet vil telle hvor mange ganger hvert ord gjentas fra vokabularet og lagre det i en sparsom matrise. I den sparsomme matrisen, hver rad i en setningsvektor hvis lengde (kolonnene i matrisen) er lik størrelsen på ordforrådet.

Importer CountVectorizer

Vi skal importere CountVectorizer for å trene vår Bag of words-modell

from sklearn.feature_extraction.text import CountVectorizer

Lag Vectorizer

I dette trinnet skal vi lage modellen vår ved å bruke CountVectorizer og trene den ved å bruke vårt eksempeltekstdokument.

# 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)

Konverter til en tett matrise

I dette trinnet vil vi konvertere representasjonene våre til tett array. Vi vil også få funksjonsnavn eller ord.

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

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

La oss skrive ut dokumenttermmatrisen og funksjonsord

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

Dokument – ​​Term Matrix (DTM):

Matrise

Funksjonsnavn:

Funksjonsord

Som du kan se, består vektorene av ikke-negative tall (0,1,2……) som representerer frekvensen av ord i dokumentet.

Vi har fire eksempeltekstdokumenter, og vi har identifisert ni unike ord fra disse dokumentene. Vi lagret disse unike ordene i vokabularet vårt ved å tilordne dem «Funksjonsnavn».

Deretter sjekker vår Bag of Words-modell om det første unike ordet er til stede i vårt første dokument. Hvis den er tilstede, tildeler den verdien 1, ellers tildeler den 0.

Hvis ordet vises flere ganger (f.eks. 2 ganger), tildeler det en verdi tilsvarende.

For eksempel, i det andre dokumentet, gjentas ordet «dokument» to ganger, så verdien i matrisen vil være 2.

Hvis vi vil ha et enkelt ord som en funksjon i vokabularnøkkelen – Unigram-representasjon.

n – gram = Unigram, bigram …….osv.

Det er mange biblioteker som scikit-learn to implementer bag of words: Keras, Gensim og andre. Dette er enkelt og kan være nyttig i forskjellige tilfeller.

Men, Bag of words er raskere, men den har noen begrensninger.

  • Den tildeler samme vekt til hvert ord, uavhengig av dets betydning. I mange tilfeller er noen ord viktigere enn andre.
  • BoW teller ganske enkelt frekvensen til et ord eller hvor mange ganger et ord vises i et dokument. Dette kan føre til en skjevhet mot vanlige ord som «den», «og», «er» osv., som kanskje ikke har mye mening.
  • Lengre dokumenter kan ha flere ord og kan skape større vektorer. Dette kan gjøre det utfordrende å sammenligne. Det kan skape en sparsom matrise, som ikke kan være bra for å utføre komplekse NLP-prosjekter.
  •   10 kundefordringer-programvare som aldri går glipp av en betaling i 2022

    For å løse dette problemet kan vi velge bedre tilnærminger, en av dem er TF-IDF. La oss, forstå i detalj.

    TF-IDF

    TF-IDF, eller Term Frequency – Inverse Document Frequency, er en numerisk representasjon for å bestemme betydningen av ord i dokumentet.

    Hvorfor trenger vi TF-IDF over Bag of Words?

    En pose med ord behandler alle ord likt og er bare opptatt av frekvensen av unike ord i setninger. TF-IDF legger vekt på ord i et dokument ved å vurdere både frekvens og unikhet.

    Ord som blir gjentatt for ofte overdøver ikke sjeldnere og viktigere ord.

    TF: Term Frequency måler hvor viktig et ord er i en enkelt setning.

    IDF: Invers dokumentfrekvens måler hvor viktig et ord er i hele dokumentsamlingen.

    TF = Frekvens av ord i et dokument / Totalt antall ord i det dokumentet

    DF = Dokument som inneholder ord m / Totalt antall dokumenter

    IDF = log(Totalt antall dokumenter / Dokumenter som inneholder ordet w)

    IDF er gjensidig av DF. Årsaken bak dette er jo mer vanlig ordet er på tvers av alle dokumenter, desto mindre betydning har det i det gjeldende dokumentet.

    Endelig TF-IDF-poengsum: TF-IDF = TF * IDF

    Det er en måte å finne ut hvilke ord som er vanlige i et enkelt dokument og unike på tvers av alle dokumenter. Disse ordene kan være nyttige for å finne hovedtemaet i dokumentet.

    For eksempel,

    Doc1 = «Jeg elsker maskinlæring»

    Doc2 = «Jeg elsker tipsbilk.net»

    Vi må finne TF-IDF-matrisen for dokumentene våre.

    Først skal vi lage et vokabular med unike ord.

    Ordforråd = [“I,” “love,” “machine,” “learning,” “Geekflare”]

    Så vi har 5 fem ord. La oss finne TF og IDF for disse ordene.

    TF = Frekvens av ord i et dokument / Totalt antall ord i det dokumentet

    TF:

    • For «I» = TF for Doc1: 1/4 = 0,25 og for Doc2: 1/3 ≈ 0,33
    • For «kjærlighet»: TF for Dok1: 1/4 = 0,25 og for Doc2: 1/3 ≈ 0,33
    • For «Maskin»: TF for Doc1: 1/4 = 0,25 og for Doc2: 0/3 ≈ 0
    • For «Læring»: TF for Doc1: 1/4 = 0,25 og for Doc2: 0/3 ≈ 0
    • For «tipsbilk.net»: TF for Doc1: 0/4 = 0 og for Doc2: 1/3 ≈ 0,33

    Nå, la oss beregne IDF.

    IDF = log(Totalt antall dokumenter / Dokumenter som inneholder ordet w)

    IDF:

    • For «I»: IDF er log(2/2) = 0
    • For «kjærlighet»: IDF er log(2/2) = 0
    • For «Maskin»: IDF er log(2/1) = log(2) ≈ 0,69
    • For «Læring»: IDF er log(2/1) = log(2) ≈ 0,69
    • For «tipsbilk.net»: IDF er log(2/1) = log(2) ≈ 0,69

    La oss nå beregne sluttresultatet til TF-IDF:

    • For «I»: TF-IDF for Doc1: 0,25 * 0 = 0 og TF-IDF for Doc2: 0,33 * 0 = 0
    • For «kjærlighet»: TF-IDF for Doc1: 0,25 * 0 = 0 og TF-IDF for Doc2: 0,33 * 0 = 0
    • For «Maskin»: TF-IDF for Doc1: 0,25 * 0,69 ≈ 0,17 og TF-IDF for Doc2: 0 * 0,69 = 0
    • For «Læring»: TF-IDF for Doc1: 0,25 * 0,69 ≈ 0,17 og TF-IDF for Doc2: 0 * 0,69 = 0
    • For «tipsbilk.net»: TF-IDF for Doc1: 0 * 0,69 = 0 og TF-IDF for Doc2: 0,33 * 0,69 ≈ 0,23

    TF-IDF matrise ser slik ut:

            I     love   machine   learning   tipsbilk.net
    Doc1    0.0   0.0    0.17      0.17       0.0
    Doc2    0.0   0.0    0.0       0.0        0.23
    

    Verdier i en TF-IDF-matrise forteller deg hvor viktig hvert begrep er i hvert dokument. Høye verdier indikerer at et begrep er viktig i et bestemt dokument, mens lave verdier antyder at begrepet er mindre viktig eller vanlig i den sammenhengen.

    TF-IDF brukes mest i tekstklassifisering, bygging av chatbot-informasjonshenting og tekstoppsummering.

    Importer TfidfVectorizer

    La oss importere TfidfVectorizer fra sklearn

    from sklearn.feature_extraction.text import TfidfVectorizer

    Lag Vectorizer

    Som du vil se, vil vi lage vår Tf Idf-modell ved å bruke TfidfVectorizer.

    # 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()

    Lag TF-IDF-matrise

    La oss trene modellen vår ved å gi tekst. Etter det vil vi konvertere den representative matrisen til tett matrise.

    # 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()

    Skriv ut TF-IDF-matrisen og funksjonsordene

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

    TF-IDF matrise:

    Funksjonsord

    Som du kan se, indikerer disse desimaltallene viktigheten av ord i spesifikke dokumenter.

    Du kan også kombinere ord i grupper på 2,3,4, og så videre ved å bruke n-gram.

    Det er andre parametere som vi kan inkludere: min_df, max_feature, subliner_tf, etc.

    Til nå har vi utforsket grunnleggende frekvensbaserte teknikker.

    Men TF-IDF kan ikke gi semantisk mening og kontekstuell forståelse av tekst.

    La oss forstå mer avanserte teknikker som har endret verden av ordinnbygging og som er bedre for semantisk mening og kontekstuell forståelse.

    Word2Vec

    Word2vec er en populær innebygging av ord (type ordvektor og nyttig for å fange semantisk og syntaktisk likhet) teknikk i NLP. Dette ble utviklet av Tomas Mikolov og teamet hans hos Google i 2013. Word2vec representerer ord som kontinuerlige vektorer i et flerdimensjonalt rom.

    Word2vec har som mål å representere ord på en måte som fanger deres semantiske betydning. Ordvektorer generert av word2vec er plassert i et kontinuerlig vektorrom.

    Eks – «Katt»- og «Hund»-vektorer ville være nærmere enn vektorer for «katt» og «jente».

    Kilde: usna.edu

    To modellarkitekturer kan brukes av word2vec for å lage ordinnbygging.

    CBOW: Kontinuerlig pose med ord eller CBOW prøver å forutsi et ord ved å beregne et gjennomsnitt av betydningen av nærliggende ord. Den tar et fast antall eller et vindu med ord rundt målordet, konverterer det deretter til numerisk form (Innebygging), gjennomsnittliggjør deretter alle, og bruker det gjennomsnittet til å forutsi målordet med det nevrale nettverket.

      Slik får du tilgang til PlayStation Plus 14 dagers prøveversjon

    Eks- forutsi mål: «Fox»

    Setningsord: «den», «rask», «brun», «hopper», «over», «den»

    Word2Vec

    • CBOW tar fast størrelse vindu (antall) av ord som 2 (2 til venstre og 2 til høyre)
    • Konverter til ordinnbygging.
    • CBOW er gjennomsnittet for ordet innebygging.
    • CBOW gir et gjennomsnitt av ordet som er innebygd i kontekstordene.
    • Gjennomsnittlig vektor prøver å forutsi et målord ved hjelp av et nevralt nettverk.

    La oss nå forstå hvordan skip-gram er forskjellig fra CBOW.

    Skip-gram: Det er en ordinnbyggingsmodell, men den fungerer annerledes. I stedet for å forutsi målordet, forutsier skip-gram kontekstordene gitt målord.

    Skip-grams er bedre til å fange de semantiske relasjonene mellom ord.

    Eks- «King – Men + Women = Queen»

    Ønsker du å jobbe med Word2Vec har du to valg: enten kan du trene din egen modell eller bruke en forhåndstrent modell. Vi skal gjennom en forhåndstrent modell.

    Importer gensim

    Du kan installere gensim ved å bruke pip install:

    pip install gensim

    Tokenize setningen ved å bruke word_tokenize:

    Først vil vi konvertere setninger til lavere. Etter det vil vi tokenisere setningene våre ved å bruke word_tokenize.

    # 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]
    

    La oss trene modellen vår:

    Vi vil trene modellen vår ved å gi tokeniserte setninger. Vi bruker 5 vinduer for denne treningsmodellen, du kan tilpasse etter ditt behov.

    # 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}")

    Ord som ligner på «avengers»:

    Word2Vec likhet

    Dette er noen av ordene som ligner på «avengers» basert på Word2Vec-modellen, sammen med deres likhetspoeng.

    Modellen beregner en likhetspoeng (for det meste cosinuslikhet) mellom ordvektorene til «avengers» og andre ord i vokabularet. Likhetsskåren indikerer hvor nært beslektede to ord er i vektorrommet.

    Eks –

    Her hjelper ordet «hjelp» med kosinuslikhet -0,005911458611011982 med ordet «avengers». Den negative verdien antyder at de kan være forskjellige fra hverandre.

    Cosinus likhetsverdier varierer fra -1 til 1, hvor:

    • 1 indikerer at de to vektorene er identiske og har positiv likhet.
    • Verdier nær 1 indikerer høy positiv likhet.
    • Verdier nær 0 indikerer at vektorene ikke er sterkt beslektet.
    • Verdier nær -1 indikerer høy ulikhet.
    • -1 indikerer at de to vektorene er totalt motsatte og har en perfekt negativ likhet.

    Besøk denne link hvis du vil ha en bedre forståelse av word2vec-modeller og en visuell representasjon av hvordan de fungerer. Det er et veldig kult verktøy for å se CBOW og skip-gram i aksjon.

    I likhet med Word2Vec har vi GloVe. GloVe kan produsere innbygginger som krever mindre minne sammenlignet med Word2Vec. La oss forstå mer om GloVe.

    Hanske

    Globale vektorer for ordrepresentasjon (GloVe) er en teknikk som word2vec. Det brukes til å representere ord som vektorer i kontinuerlig rom. Konseptet bak GloVe er det samme som Word2Vecs: det produserer kontekstuelle ordinnbygginger samtidig som man tar hensyn til Word2Vecs overlegne ytelse.

    Hvorfor trenger vi GloVe?

    Word2vec er en vindusbasert metode, og den bruker nærliggende ord for å forstå ord. Dette betyr at den semantiske betydningen av målordet bare påvirkes av de omkringliggende ordene i setninger, som er en ineffektiv bruk av statistikk.

    Mens GloVe fanger opp både global og lokal statistikk for å komme med ordinnbygging.

    Når skal man bruke GloVe?

    Bruk GloVe når du vil ha ordinnbygging som fanger bredere semantiske relasjoner og global ordassosiasjon.

    GloVe er bedre enn andre modeller for navngitte enhetsgjenkjenningsoppgaver, ordanalogi og ordlikhet.

    Først må vi installere Gensim:

    pip install gensim

    Trinn 1: Vi skal installere viktige biblioteker

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

    Trinn 2: Importer hanskemodell

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

    Trinn 3: Hent vektorordrepresentasjon for ordet «søt»

    glove_model["cute"]

    Vektor for ordet «søt»

    Disse verdiene fanger opp ordets betydning og forhold til andre ord. Positive verdier indikerer positive assosiasjoner til visse konsepter, mens negative verdier indikerer negative assosiasjoner til andre konsepter.

    I en GloVe-modell representerer hver dimensjon i ordvektoren et bestemt aspekt av ordets betydning eller kontekst.

    De negative og positive verdiene i disse dimensjonene bidrar til hvor «søt» er semantisk relatert til andre ord i modellens vokabular.

    Verdiene kan være forskjellige for ulike modeller. La oss finne noen ord som ligner på ordet «gutt»

    Topp 10 Lignende ord som modellen mener ligner mest på ordet «gutt»

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

    Topp 10 lignende ord som «gutt»

    Som du kan se, er det mest lignende ordet «gutt» «jente».

    Nå vil vi prøve å finne hvor nøyaktig modellen vil få semantisk betydning fra de oppgitte ordene.

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

    Det mest relevante ordet for «dronning»

    Vår modell er i stand til å finne perfekt forhold mellom ord.

    Definer ordliste:

    La oss nå prøve å forstå semantisk betydning eller forhold mellom ord ved å bruke et plott. Definer listen over ord du vil visualisere.

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

    Opprett innebyggingsmatrise:

    La oss skrive kode for å lage innbyggingsmatrise.

    # 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

    Definer en funksjon for t-SNE-visualisering:

      7 verktøy for å lage iøynefallende sammenligningsdiagrammer tipsbilk.net

    Fra denne koden vil vi definere funksjon for visualiseringsplottet vårt.

    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()
    

    La oss se hvordan tomten vår ser ut:

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

    t-SNE tomt

    Så, som vi kan se, er det ord som «banan», «mango», «oransje», «kokosnøtt» og «eple» på venstre side av tomten vår. Mens «ku», «hund» og «katt» ligner hverandre fordi de er dyr.

    Så modellen vår kan også finne semantisk betydning og relasjoner mellom ord!

    Ved å bare endre vokab eller lage modellen fra bunnen av, kan du eksperimentere med forskjellige ord.

    Du kan bruke denne innbyggingsmatrisen slik du vil. Den kan brukes på ordlikhetsoppgaver alene eller mates inn i et nevralt nettverks innebyggingslag.

    GloVe trener på en samforekomstmatrise for å utlede semantisk mening. Det er basert på ideen om at ord-ord-samforekomster er en essensiell del av kunnskap og at bruken av dem er en effektiv måte å bruke statistikk for å produsere ordinnbygginger. Dette er hvordan GloVe oppnår å legge til «global statistikk» til sluttproduktet.

    Og det er GloVe; En annen populær metode for vektorisering er FastText. La oss diskutere mer om det.

    Hurtigtekst

    FastText er et åpen kildekode-bibliotek introdusert av Facebooks AI Research-team for tekstklassifisering og sentimentanalyse. FastText gir verktøy for å trene innebygging av ord, som er tette vektorrepresenterer ord. Dette er nyttig for å fange opp den semantiske betydningen av dokumentet. FastText støtter både multi-label og multi-class klassifisering.

    Hvorfor FastText?

    FastText er bedre enn andre modeller på grunn av dens evne til å generalisere til ukjente ord, som hadde manglet i andre metoder. FastText gir ferdigtrente ordvektorer for ulike språk, som kan være nyttige i ulike oppgaver der vi trenger forkunnskaper om ord og deres betydning.

    FastText vs Word2Vec

    Hvordan virker det?

    Som vi diskuterte, bruker andre modeller, som Word2Vec og GloVe, ord for innebygging av ord. Men byggesteinen til FastText er bokstaver i stedet for ord. Noe som betyr at de bruker bokstaver for innbygging av ord.

    Å bruke tegn i stedet for ord har en annen fordel. Mindre data er nødvendig for trening. Etter hvert som et ord blir dets kontekst, kan det trekkes ut mer informasjon fra teksten.

    Word Embedding oppnådd via FastText er en kombinasjon av lavere nivåinnbygginger.

    La oss nå se på hvordan FastText bruker underordsinformasjon.

    La oss si at vi har ordet «lesing». For dette ordet vil tegn n-gram med lengde 3-6 bli generert som følger:

    • Begynnelsen og slutten er angitt med vinkelparenteser.
    • Hashing brukes fordi det kan være et stort antall n-gram; i stedet for å lære en embedding for hvert distinkte n-gram, lærer vi total B embeddings, hvor B står for bøttestørrelsen. Bøttestørrelsen på 2 millioner ble brukt i det originale papiret.
    • Hvert tegn n-gram, for eksempel «eadi», er kartlagt til et heltall mellom 1 og B ved å bruke denne hashing-funksjonen, og den indeksen har den tilsvarende innebyggingen.
    • Ved å beregne gjennomsnittet av disse konstituerende n-gram-innleiringene, oppnås da hele ordinnbyggingen.
    • Selv om denne hashing-tilnærmingen resulterer i kollisjoner, hjelper den i stor grad å håndtere ordforrådets størrelse.
    • Nettverket som brukes i FastText ligner på Word2Vec. Akkurat som der kan vi trene hurtigteksten i to moduser – CBOW og skip-gram. Derfor trenger vi ikke gjenta den delen her igjen.

    Du kan trene din egen modell, eller du kan bruke en forhåndstrent modell. Vi skal bruke en forhåndstrent modell.

    Først må du installere FastText.

    pip install fasttext

    Vi vil bruke et datasett som består av samtaletekst om noen få rusmidler, og vi må klassifisere disse tekstene i 3 typer. Som med den typen stoffer de er forbundet med.

    Datasett

    Nå, for å trene en FastText-modell på ethvert datasett, må vi forberede inndataene i et bestemt format, som er:

    __label__

    La oss gjøre dette for datasettet vårt også.

    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

    Vi har utelatt mye forbehandling i dette trinnet. Ellers vil artikkelen vår være for stor. I virkelige problemer er det best å gjøre forbehandling for å gjøre data egnet for modellering.

    Skriv nå forberedte datapunkter til en .txt-fil.

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

    La oss trene modellen vår.

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

    Vi vil få spådommer fra modellen vår.

    Modellen forutsier etiketten og tildeler den en konfidensscore.

    Som med alle andre modeller, er ytelsen til denne avhengig av en rekke variabler, men hvis du ønsker å få en rask ide om hva den forventede nøyaktigheten er, kan FastText være et godt alternativ.

    Konklusjon

    Avslutningsvis gir tekstvektoriseringsmetoder som Bag of Words (BoW), TF-IDF, Word2Vec, GloVe og FastText en rekke funksjoner for NLP-oppgaver.

    Mens Word2Vec fanger ordsemantikk og kan tilpasses en rekke NLP-oppgaver, er BoW og TF-IDF enkle og egnet for tekstklassifisering og anbefaling.

    For applikasjoner som sentimentanalyse tilbyr GloVe forhåndstrente innebygginger, og FastText gjør det bra på underordsnivå, noe som gjør det nyttig for strukturelt velstående språk og enhetsgjenkjenning.

    Valget av teknikk avhenger av oppgaven, dataene og ressursene. Vi vil diskutere kompleksiteten til NLP dypere etter hvert som denne serien skrider frem. God læring!

    Deretter kan du sjekke ut de beste NLP-kursene for å lære naturlig språkbehandling.