Hitz-zaku eredu

**Hitz-zaku** edo **bag-of-words** eredua informazioaren berreskuratze eta hizkuntzaren prozesamenduan erabilitako testuak errepresentatzeko modu bat da. Adierazpide honetan, testu bat (adibidez dokumentu edo esaldi bat) barnean dituen hitzen zaku edo multimultzo bat bezala adierazten da, hau da, hitzen arteko ordena eta harremana baztertzen da, baina agerpen-kontaketak mantentzen dira. Hitz-zaku eredua ikusmen artifizialean ere erabili izan da. 

Hitz-zaku eredua askotan dokumentu saenilkapenean erabiltzen da, non hitz bakoitzaren agerpen-kontaketa sailkatzailearen entrenamendu datu gisa erabiltzen den.

“Hitz-zaku” terminoaren erabilera goiztiar bat Zellig Harris-en 1954ko *Distributional Structure* artikuluan aurki daiteke.

## Inplementazio adibide bat 
Atal honetan **bag-of-words** (BOW) modeloaren inplementazio adibide bat emango dugu. Hurrengo bi dokumentuak ditugu:
```text
(1) Nereak filmak gogoko ditu. Jonek ere filmak gogoko ditu.
```

```text
(2) Asierrek pilota jardunaldiak ikustea gogoko du.
```
BOW adierazpidea lortzeko bakarrik kontatuko da hitz bakoitza zenbat aldiz agertzen den, hitzen arteko ordena edo harremana kontuan hartu gabe. Adibidez, *JSON* objektuen bidez gorde ditzakegu BOW adierazpidea:
```javascript
BoW1 = {"Nereak":1, "filmak":2, "gogoko":2, "ditu":2, "Jonek":1, "ere":1};
BoW2 = {"Asierrek":1, "pilota":1, "jardunaldiak":1, "ikustea":1, "gogoko":1, "du":1};
```
Objektu horietan hitz bakoitza dokumentuan zenbat aldiz agertzen den gordetzen da. Gainera adierazpide hau ordenarekiko independentea da, hitz bakoitzaren agerpen-kontaketak beste edozein ordenatan adierazita BoW adierazpen bera lortzen dugu. Gainera, bi dokumentuak kateatzen baditugu hurrengo esaldia lortzen da:
```text
(3) Nereak filmak gogoko ditu. Jonek ere filmak gogoko ditu. Asierrek pilota jardunaldiak ikustea gogoko du.
```
 Eta esaldi honen BoW adierazpena hau izango da: 
```javascript
BoW3 = {"Nereak":1, "filmak":2, "gogoko":3, "ditu":2, "Jonek":1, "ere":1, "Asierrek":1, "pilota":1, "jardunaldiak":1, "ikustea":1, "du":1};
```
Hitz bat dokumentu horietako bakar batean agertzen denean bere agerpen kopuru bera erabiliko da kateaketaren adierazpenean, eta bi dokumentuetan agertzen denean kontaketen batura erabiliko da. Hau bat dator multi-multzo egituren gehiketa operazioarekin.

## Aplikazioak 
Hitz-zaku modeloaren erabilera nagusia ezaugarri edo *feature*-ak generatzea da. Dokumentu baten BoW adierazpena kalkulatu ondoren testuari buruzko informazioa ematen duten hainbat metrika lortu daitezke. Metrika hauen artean arruntena termino-maiztasuna da, hau da, hitz bakoitza dokumentuan zenbat aldiz agertu den. Adibidez, goiko adibide bera erabiliz, esaldi bakoitzaren termino maiztasun lista eraiki dezakegu (terminoak BoW3 adierazpenean bezala ordenatuz): 
```javascript
(1) [1, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0]
(2) [0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1]
(3) [1, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1]
```
Horrela, hitz bakar baterako adierazpen trinkoa erabili ordez (zero maiztasunak gehitu gabe), dokumentu multzo bat badugu eta multzo osotik lortutako bokabulario bat, dokumentu bakoitzaren errepresentazioa bokabulario horretako terminoen maiztasun zerrenda izango da. Adibidez, lehen zerrendako lehen posizioan 1 zenbakia dugu ‘Nereak’ hitza behin agertzen delako lehen esaldian, eta bigarren eta hirugarren posizioetan 2 zenbakia dugu ‘filmak’ eta ‘gogoko’ hitzak bi aldiz agertzen direlako lehen esaldian.

Lista adierazpen honek ez du hitzen ordenari buruz informaziorik ematen, hau hitz-zaku ereduaren ezaugarri nagusi bat da. Adierazpen mota hau arrakastarekin erabilia izan da hainbat aplikazioetarako, adibidez email iragazketan.

Hala ere, termino-maiztasunak askotan ez dira testuaren adierazpide egokia. Hitz arruntak, adibidez ‘the’ edo ‘to’ ingelesaren kasuan, izaten dira ia beti dokumentu luzeetan maiztasun handieneko elementuak, baina maiztasun handiko hitz hauek ez dute dokumentuari buruzko informazio esanguratsurik ematen. Arazo hau ekiditeko metodo ezagun bat da terminoen-maiztasunak ‘normalizatzea’ tf-idf teknikaren bidez. Horren helburua dokumentu guztietan zehar maiztasun handiak dituzten hitzei garrantzia txikitzea da, kasu hauetan maiztasun handia ez baita esanguratsua. Hitz hutsak edo *stop words* esaten zaie hits horiei. Hitz batek maiztasun orokor (dokumentu multzo osoan kalkulatua) txikia badu, baina dokumentu zehatz batean askotan agertzen bada, berriz, aukera handiagoarekin hitz horrek dokumentuari buruzko informazio baliotsua ematen du. Gainera, aplikazio batzuetan adierazpide bitarra (dokumentuan agertzen den edo ez) erabiltzen da maiztasunen ordez (adibidez aukera hau WEKA ikasketa automatiko software sisteman inplementatua dago).

BoW adierazpenetik lortutako termino-maiztasun zerrendak, sailkatzaile bati pasatzeko ezaugarri posibleak izateaz gain, zuzenean erabili daitezke aplikazio batzuetan. Adibidez, bi dokumenturen arteko antzekotasuna neurtzeko dokumentu horien termino-maiztasun bektoreen arteko hainbat operazio erabili daitezke. Operazio hauetako bat kosinu-antzekotasuna da. Bi bektore x,y\in \mathbb{R}^nizanda, haien arteko kosinu-antzekotasuna \frac{x . y } zenbakia izango da, non x.ybi bektoreen biderketa eskalarra den. Intuitiboki, zenbaki honek bi bektoreen arteko angeluaren kosinua adierazten du, eta -1 eta 1 artean egongo da beti. Horrela, goiko adibideko (1) eta (2) bektoreen arteko antzekotasuna neurtzeko termino-maiztasun zerrenden arteko kosinu-antzekotasuna erabil daiteke. Kasu honetan ikusten da aurreko paragrafoan azaldutako maiztasun-normalizazio tekniken garrantzia, teknika hauek erabiltzen ez badira 'the' edo 'to' motako maiztasun handiko hitzek harremanik gabeko dokumentuen arteko kosinu-antzekotasun handi bat sortu dezaketelako.

Maiztasun-kontaketak termino-dokumentu matrizeak sortzeko ere erabiltzen dira. Matrize hauetan lerro bakoitzak termino bat adierazten du, eta zutabe bakoitzak dokumentu bat. i. errenkadako eta j. zutabeko gelaxkan j dokumentuan i terminoa zenbat aldiz agertu den gordetzen da. Beste modu batean esanda, j. zutabea j. dokumentuaren termino maiztasun zerrenda izango da. Goiko adibidearen kasuan, (1) (2) eta (3) dokumentuekin osatutako termino-dokumentu matrizea hurrengoa izango da:

\begin{pmatrix} 1 & 0 & 1 \\ 2 & 0 & 2 \\ 2 & 1 & 3 \\ 2 & 0 & 2 \\ 1 & 0 & 1\\ 1 & 0 & 1 \\ 0 & 1 & 1 \\  0 & 1 & 1 \\   0 & 1 & 1 \\   0 & 1 & 1 \\   0 & 1 & 1 \\   \end{pmatrix}

Matrize honen gainean hainbat teknika desberdin erabil daitezke dokumentu edo terminoen adierazpide trinkoak lortzeko, adibidez, Ezkutuko Semantikaren Analisia.

## N-grama modeloa 
Hitz-zaku eredua ordenarik gabeko errepresentazio-sistema bat da, hitzen maiztasunak soilik erabiltzen direlako. Adibidez, ingelesez ‘John killed Mary’ eta “Mary killed John” esaldiek BoW adierazpen berdina izango dute. Aplikazio askotan ordena garrantzitsua denez, BoW adierazpidean hitzen ordena-informazioa nolabait harrapatzeko proposatu den aukera bat n-grama eredua da. Eredu honetan, dokumentu baten errepresentazioa lortzeko lehenik dokumentu horren n-grama guztiak kalkulatzen dira, eta hondoren n-grama horien agerpen-kontaketak gordetzen dira. Hau da, termino-maiztasuna erabili ordez n-gramen maiztasunak erabiltzen dira.
Goiko adibideko lehen esaldiaren kasuan, bigrama eredu baten bidez hurrengo bigramak lortuko genituzke:
```javascript
[
    "Nereak filmak",
    "filmak gogoko",
    "gogoko ditu",
    "Jonek ere",
    "ere filmak",
    "filmak gogoko",
    "gogoko ditu",
]
```
Eta adierazpena hurrengoa izango zen:
```javascript
BoWbigrama = {"Nereak filmak":1, "filmak gogoko":2, "gogoko ditu":2, "Jonek ere":1, "ere filmak":1};
```
 Kontzeptualki, BoW eredua N-grama ereduaren kasu berezi gisa ikus daiteke, n=1 denean. Esan bezala, n-grama ereduak modu sinple batean hitzen arteko harreman konplexuagoak adierazi ditzake. Adibidez, ingelesezko "John killed Mary" eta "Mary killed John" esaldiek honako BoW errepresentazio hauek edukiko lukete: 
```javascript
BoW = {"John":1,"killed":1, "Mary":1};
```
Honek esan nahi du BoW erabiltzen bada, nahiz eta kalitate handizko ereduak erabili, eredu horiek ez direla gai izango bi esaldi hauen artean bereizteko, adierazpen berdin-berdina baitute. Beraz argi dago BoW ereduak gabezia garrantzitsuak dituela, eta esaldiei buruzko informazio sakona behar duten aplikazioetarako desegokia izan daitekeela. Bigrama eredua erabiliz bi esaldi horien errepresentazioak hauek izango dira:
```javascript
Bigram1 = {"John killed":1,"killed Mary":1};
Bigram2 = {"Mary killed":1,"killed John":1};
```
Eta errepresentazio horiek erabiliz argi geratzen da zein den bi esaldien esanahien arteko desberdintasuna. Horrela, n-gramen bidez testuaren errepresentazio aberatsago bat lortu daiteke.

N-gramen beste erabilera bat OOV edo bokabularioz kanpoko hitzak tratatzea da. Terminoak edo terminoen n-gramak erabili ordez errepresentazioa lortzeko, posible da karaktereen n-gramak erabiltzea unitate moduan eta unitate horien adierazpideak eraikitzea. Horrela, hizkuntza prozesamenduko aplikazioetan bokabularioz kanpoko hitz bat aurkitzen denean, posible da hitz hori baztertu ordez hitz horren adierazpen bat lortzea osatzen duten n-gramen adierazpenak erabiliz. Adibidez, "zakur" bokabularioz kanpoko hitz bat bada ez da adierazpenik egongo gordeta "zakur" hitzerako, baina "zak", "aku" eta "kur" 3-gramen adierazpenak baditugu posible izango litzateke eragiketa baten bitartez "zakur" hitzaren errepresentazio bat lortzea. Adibidez, hitz-embeddingak lortzeko fastText softwarean hitzak osatzen dituzten n-gramen adierazpenak erabil daitezke entrenatutako embedding-en kalitatea hobetzeko, bereziki morfologikoki aberatsak diren hizkuntzentzat, non hitz-forma batzuk korpusetan maiztasun oso txikiarekin agertuko diren.

## Hashing trukoa 
Adierazpenak gordetzeko hiztegiak erabili ordez askotan ezaugarri hashing-a edo *hashing trick* deritzona erabiltzen da, hitzak zuzenean indizeetara mapatzeko. Horrela memoria aurrezten da, baina hash kolisioen arriskua sortzen da. Hash kolisioen arazoa normalean hash kubo kopurua handitzen konpontzen da. Praktikan, *hashing* erabiltzean hitz-zaku ereduen inplementazioa errazten da eta eskalagarritasuna hobetzen da.

Aplikazioak atalean ikusi den bezala, BoW adierazpenak askotan termino-dokumentu matrizeak eraikitzeko erabiltzen dira, eta matrize hauetan lerro bakoitzak hitz bat adierazten du. Jakiteko hitz bakoitzari ze zutabe dagokion, soluzio erraz bat hiztegiak erabiltzea da. Horrela, goiko adibidearen kasuan hurrengo hiztegia eraikiko zen:

Eta taula honen bidez zehaztuta geratzen da zein den termino-dokumentu matrizeko errenkada bakoitzari dagokion hitza. Baina dokumentu handiak tratatzean hiztegi hauek memoria asko beharko dute.

Hiztegi hauek erabili ordez, posible da hash funtzio bat aplikatzea hitzei, eta zuzenean funtzio horren emaitza hitz horren indize gisa erabiltzea. Horrela, termino-matrizea eraikitzean dokumentu batean hitz berri bat aurkitzen denean, hiztegi bat kontsultatu ordez hash funtzio baten bidez lortuko da hitz horri dagokion indizea, eta indize hori erabiliko da termino-dokumentu matrizea eguneratzeko.

Praktikan, mota honetako teknikak erabiliak izan dira spam iragazkien arazoan, emaitza positiboekin. 

## Erabilera adibide bat: spam iragazkia 
Spam iragazki Bayesiarretan e-posta mezu bat probabilitate banaketa batetik sortutako ordenatu gabeko hitz multzo bat bezala adierazten da. Probabilitate banaketa hau bitako bat izan daiteke: spam mezuetan erabiltzen diren hitzek sortzen dutena, edo benetako mezuetan erabiltzen diren hitzek sortzen dutena.

Eredu Bayesiar hauek suposatzen dute mezuko **hitz-zakua** bi banaketa hauetako batek sortua izan dela, eta metodo Bayesiarrak erabiltzen dira erabakitzeko bietako zein izan den.

## Erreferentziak 
## Ikus, gainera 
* Bag-of-words eredua ikusmen artifizialean
* Dokumentuen sailkapena
* Dokumentu-termino matrizea
* Ezaugarri erauzketa
* Hashing trukoa
* Ikasketa automatikoa
* MinHash
* n-grama
* Hizkuntza naturalaren prozesamendua
* Bektore espazio eredua
* w-shingling
* Ezkutuko semantikaren analisia
## Kanpo estekak