Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Sanojen Pussi | Perustekstin Mallit
Johdatus NLP:hen

bookSanojen Pussi

BoW-mallin ymmärtäminen

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

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

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

BoW-mallin 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 hahmottaa, 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 tiedon esittämiseen ja käsittelyyn silloin, kun nolla-arvojen määrä on suuri. Tämä säästää muistia ja laskentaresursseja tallentamalla vain nollasta poikkeavat alkiot.

Jotta voidaan luoda frekvenssipohjainen bag of words -malli, tarvitsee vain poistaa parametri binary=True, sillä 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 -muotoon. Lisäksi CountVectorizer-instanssi tarjoaa get_feature_names_out() -metodin, joka palauttaa taulukon uniikkeja sanoja (ominaisuuksien nimet), joita mallissa käytetään. Näitä ominaisuuksien nimiä voidaan käyttää DataFrame-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 voimme nyt 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 osat 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 3. Luku 3

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Suggested prompts:

Can you explain the difference between binary and frequency-based BoW models in more detail?

How does the CountVectorizer handle punctuation and capitalization?

Can you show how to access the vector for a different word in the DataFrame?

Awesome!

Completion rate improved to 3.45

bookSanojen Pussi

Pyyhkäise näyttääksesi valikon

BoW-mallin ymmärtäminen

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

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

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

BoW-mallin 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 hahmottaa, 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 tiedon esittämiseen ja käsittelyyn silloin, kun nolla-arvojen määrä on suuri. Tämä säästää muistia ja laskentaresursseja tallentamalla vain nollasta poikkeavat alkiot.

Jotta voidaan luoda frekvenssipohjainen bag of words -malli, tarvitsee vain poistaa parametri binary=True, sillä 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 -muotoon. Lisäksi CountVectorizer-instanssi tarjoaa get_feature_names_out() -metodin, joka palauttaa taulukon uniikkeja sanoja (ominaisuuksien nimet), joita mallissa käytetään. Näitä ominaisuuksien nimiä voidaan käyttää DataFrame-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 voimme nyt 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 osat 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 3. Luku 3
some-alt