Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Sanaesine | Osio
Luonnollisen Kielen Käsittely

bookSanaesine

Pyyhkäise näyttääksesi valikon

Bag of words (BoW) -malli esittää dokumentit vektoreina, joissa jokainen ulottuvuus vastaa yksittäistä sanaa. Jokainen ulottuvuus voi kuvata joko sanan esiintymistä dokumentissa (1 jos esiintyy, 0 jos ei) tai sen frekvenssiä (sanamäärä). Näin ollen BoW-mallit voivat olla joko binäärisiä tai frekvenssipohjaisia.

Tarkastellaan, miten sama lause (dokumentti) esitetään kummallakin tavalla:

Binäärinen malli esittää tämän dokumentin vektorina [1, 1, 1], kun taas frekvenssipohjainen malli esittää sen muodossa [2, 1, 2], ottaen huomioon sanan esiintymistiheyden.

BoW-toteutus

BoW-mallin toteutus on suoraviivaista, erityisesti sklearn (scikit-learn) -kirjaston ja sen CountVectorizer-luokan avulla.

Tässä on esimerkki binäärisen bag of words -mallin toteutuksesta:

12345678910111213
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a binary Bag of Words model vectorizer = CountVectorizer(binary=True) # Generate a BoW matrix bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix into a dense array print(bow_matrix.toarray())
copy

Jokainen matriisin rivi vastaa dokumenttia ja jokainen sarake tokenia (sanaa). Jotta se olisi helpompi havainnollistaa, muunsimme tämän harvan matriisin tiheäksi kaksiulotteiseksi taulukoksi käyttämällä .toarray()-metodia.

Note
Lisätietoa

Harva matriisi on matriisi, jossa suurin osa alkioista on nollia. Sitä käytetään tehokkaaseen datan esittämiseen ja käsittelyyn, kun nolla-arvojen määrä on suuri, säästäen muistia ja laskentaresursseja tallentamalla vain ei-nolla alkiot.

Jotta voidaan luoda frekvenssipohjainen bag of words -malli, tarvitsee vain poistaa parametri binary=True, koska sen oletusarvo on False:

1234567891011
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a frequency-based Bag of Words model vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) print(bow_matrix.toarray())
copy

Matriisin muuntaminen DataFrameksi

On usein kätevää muuntaa muodostettu bag of words -matriisi pandas DataFrame-rakenteeksi. Lisäksi CountVectorizer-instanssi tarjoaa get_feature_names_out() -menetelmän, joka palauttaa taulukon uniikkeja sanoja (piirrenimiä), joita malli käyttää. Näitä piirrenimiä voidaan käyttää DataFrame-rakenteen sarakkeina:

12345678910111213
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix to a DataFrame bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) print(bow_df)
copy

Tämän esityksen avulla voidaan helposti tarkastella paitsi tietyn dokumentin vektoria, myös tietyn sanan vektoria:

12345678910111213
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # Print the vector for 'global' as a NumPy array print(f"Vector for the word 'global': {bow_df['global'].values}")
copy

Koska jokainen yksilöllinen sana vastaa saraketta, sanavektorin hakeminen on yhtä yksinkertaista kuin sarakkeen hakeminen DataFrame-rakenteesta määrittämällä sana (esimerkiksi 'global'). Käytämme myös values-attribuuttia saadaksemme tulokseksi taulukon Series-olion sijaan.

question-icon

Mitä BoW-matriisin eri komponentit edustavat?

Rows:
Columns:

A particular element of the matrix:

Click or drag`n`drop items and fill in the blanks

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 20

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 1. Luku 20
some-alt