doc2vec

Egy korábbi bejegyzésünkben megismertünk egy Neurális Hálózaton alapuló számítógépes nyelvészeti eljárást a word2vec-et. Ma ennek egy egyenesági leszármazotját fogjuk górcső alá venni, a “doc2vec”-et.


A probléma

Egy évvel a word2vec publikálása után Tomáš Mikolov újabb cikket publikált, Quoc V. Le-vel együttműködve: Distributed Representations of Sentences and Documents. A cikk egyenes ági folytatása a word2vec-ban megismert algoritmusnak, de a probléma, amire koncentrál, más jellegű.

Amíg a word2vec szavak kapcsolatát írja le, addig doc2vec ezzel szemben dokumentumok kapcsolatát akarja modellezni. Az alapvető kérdés amire válaszolni akar, hogy hosszabb szövegek milyen kapcsolatban állnak egymással.

A megvalósítás

Mikolov és Le megoldása a fenti problémára egy új bemeneti vektorral kiegészített word2vec modell. Ez az új vektor a dokumentum azonosító. A word2vec-hez hasonlóan itt is két konkrét algoritmus létezik a megvalósításra: “elosztott memória”[1] és “elosztott szózsák modell”[2].

Elosztott memória

Ezt a modellt így lehetne felvázolni:

Elosztott memóriájú doc2vec

Ahol:

  • D_i – A dokumentum azonosítója
  • Sz_0 – az 0-ik szó a mozgó ablakban.
  • T – az mozgó ablak nagysága
  • Sz_p – a szó amit

Gondolom elég egyértelmű a rokonság a word2vec-el. Az egyetlen eltérés a Bemeneti rétegen lévő új neuron, ami a dokumentum azonosítót tartalmazza. A többi a szokásos: egy kétrétegű hálózat, ahol a Rejtett réteg lineáris a Kimeneti pedig egy SoftMax.

Ez egyetlen ami talán nem egyértelmű: Mi a kimenet, a Sz_p? Ez kb. az dokumentum témája. A fenti példában csak egy neuron van itt, de ha több kulcsszóval szeretnénk jellemezni a dokumentumainkat, akkor értelemszerűen használjunk több neuront.

Oké, de hogy fogjuk tanítani ezt a hálózatot? A bemenetett ismerjük, de a Kimenetről semmi információnk. Igen, ez így is van, a meglepő dolog a doc2vec-ben, hogy ez egy felügyelet nélküli tanítási rendszer. Tehát nem is kell ismernünk. Ezt annak köszönhető, hogy az algoritmus megkülönböztet két esetet:

  • korábban már látott D_i érkezik – Ekkor történik lényegében a Sz_p optimalizációja.
  • új D_i érkezik – Ez esetben egy belső függvény fut le többször “gradient descend” módon. Ez fixen tartja a SoftMax paramétereket és értelemszerűen a  Sz_0 \hdots Sz_T vektort. Ez segít a Dokumentumok elválasztásában.

Elosztott szózsák modell

A nevét meghazudtoló módon ez az eljárás a word2vec Skip-gram analógja. Így vázolhatjuk fel:

Elosztott szózsákú doc2vec

Ahol:

  • D_i – A dokumentum azonosítója
  • P_x – az x szó a szótárban
  • M – a szótárunk nagysága

Ez elég egyszerű. A dokumentum azonosítója alapján próbáljuk meghatározni mekkora a valószínűsége, hogy egyes szavak előfordulnak a szövegben. Ez egy szimpla becslése a szövegek témájának.

A word2vec Skip-gram-mal ellentétben ez az eljárás gyorsabb, mint az Elosztott memóriájú algoritmus, ugyanakkor pontatlanabb is.

Gyakorlati példa

Most, hogy ismerjük az doc2vec alapvető elemeit, nézzünk egy valós életből vett példát a megvalósításra.

Teszt adatok

A Spinger Publishing egy akadémia kiadó aminek számos Folyóirata van földrajzi témakörben. Néhány nappal ezelőtt begyűjtöttem az ilyen témájú cikkeik Kivonatát az oldalukról, és elmentettem mint csv fájlt. Ezt a fájlt fogjuk a példánkban használni. A gyakorlat célja pedig az lesz, hogy megtaláljuk az egymáshoz hasonló dokumentumokat.

Első lépésként töltsük be az adatokat, és vessünk egy pillantást rájuk:

import pandas as pd
df = pd.read_csv("Data/spinger_collected_data.csv", sep="|")
print(df.iloc[0])

Ami kimenete:

title       Algal blooms in a shallow lake with a special ...
abstract    Algal blooms are frequently observed in eutrop...
writer                                              M. Mansor
journal                                            GeoJournal
keywords    Water Temperature,Environmental Management,Hig...
url         http://link.springer.com/article/10.1007/BF002...

Mint látható 6 oszlopunk van:

  1. title – a cikk címe
  2. abstract – a cikk kivonata
  3. writer – a cikk írója
  4. journal – a folyóirat ahol megjelent a cikk
  5. keywords – a cikkhez kapcsolt kulcsszavak a Springer szerint
  6. urt – a cikk linkje

Ezek közül mi a kivonatot fogjuk felhasználni a doc2vec tanítására. Készítsünk erről az oszlopról egy másolatot és keverjük össze a dokumentumokat[3]:

# random order
shuffled_idx = np.random.permutation(len(abstract))
abstract = np.array(abstract)[shuffled_idx]
title = np.array(title)[shuffled_idx]    
ids = np.array(ids)[shuffled_idx]

Még mielőtt elkezdenénk a modellépítést végezzünk el néhány korábban már ismert szöveg normalizációs lépést. Ezt a könnyebb átláthatóság miatt nem részletezném itt[4]:

import text_prep
abstract_prep = text_prep.TextPrep(abstract, memoryopt=True)
abstract_prep.merge(title)
abstract_prep.run()
train_corpus = list(abstract_prep.read_corpus(ids))

Most már készen állunk a modell tanítására:

# model
import gensim
# alpha -- tanulási ráta
# min_alpha -- a minimum tanulási ráta, 
#              lényegében a kezdeti alpha lineárisan csökken 
# vector_size -- a rejtet réteg neuronjainak száma
# negative  -- mennyi darab negatív mintavétel 
model = gensim.models.doc2vec.Doc2Vec(vector_size=50, 
                                      min_count=2, 
                                      epochs=400, 
                                      alpha=0.025, 
                                      min_alpha=0.001, 
                                      negative=10 )
model.build_vocab(train_corpus)
model.train(train_corpus, 
            total_examples=model.corpus_count, 
            epochs=model.epochs)

Kész is vagyunk.

Befejezés

Fentebb átnéztük a doc2vec alapvető működését. Most a teszt kedvéért nézzünk meg egy cikket és, hogy mi hasonlít rá a legjobban a modellünk szerint. Vegyük például a következő cikket:
“SOC storage and potential of grasslands from 2000 to 2012 in central and eastern Inner Mongolia, China”,

Ennek a kivonata:

Grassland ecosystem is an important component of the terrestrial carbon cycle system. Clear comprehension of soil organic carbon (SOC) storage and potential of grasslands is very important for the effective management of grassland ecosystems. Grasslands in Inner Mongolia have undergone evident impacts from human activities and natural factors in recent decades. To explore the changes of carbon sequestration capacity of grasslands from 2000 to 2012, we carried out studies on the estimation of SOC storage and potential of grasslands in central and eastern Inner Mongolia, China based on field investigations and MODIS image data. First, we calculated vegetation cover using the dimidiate pixel model based on MODIS-EVI images. Following field investigations of aboveground biomass and plant height, we used a grassland quality evaluation model to get the grassland evaluation index, which is typically used to represent grassland quality. Second, a correlation regression model was established between grassland evaluation index and SOC density. Finally, by this regression model, we calculated the SOC storage and potential of the studied grasslands. Results indicated that SOC storage increased with fluctuations in the study area, and the annual changes varied among different sub-regions. The SOC storage of grasslands in 2012 increased by 0.51×1012 kg C compared to that in 2000. The average carbon sequestration rate was 0.04×1012 kg C/a. The slope of the values of SOC storage showed that SOC storage exhibited an overall increase since 2000, particularly for the grasslands of Hulun Buir city and Xilin Gol League, where the typical grassland type was mainly distributed. Taking the SOC storage under the best grassland quality between 2000 and 2012 as a reference, this study predicted that the SOC potential of grasslands in central and eastern Inner Mongolia in 2012 is 1.38×1012 kg C. This study will contribute to researches on related methods and fundamental database, as well as provide a reference for the protection of grassland ecosystems and the formulation of local policies on sustainable grassland development.

Amire doc2vec szerint a következő cikkek hasonlítanak legjobban:

import re
import random
doc_id = random.randint(0, len(train_corpus) - 1) # 
for x in range(len(title)):
    if re.search("SOC storage and potential of grasslands", title[x]):
        doc_id = x
        break

shuf_id = ids[doc_id]
print('Eredeti cikk ({}): \n\t{}\n\t{}\n'.format(
       doc_id, title[doc_id], abstract[doc_id]))

# get the similar docs
sim_ids = model.docvecs.most_similar([shuf_id], topn=10)
for label, distance in sim_ids:
    matchid = np.where(ids == label)[0][0]
    print('Hasonló cikk ({}, {}): \n\t{}\n'.format(matchid, 
                                                 distance, 
                                                 title[matchid]))

Ami eredménye:

távolság cím
0.75867 Detecting the storage and change on topsoil organic carbon in grasslands of Inner Mongolia from 1980s to 2010s
0.6256 Effects of grazing intensity on soil organic carbon of rangelands in Xilin Gol League, Inner Mongolia, China
0.6192 Spatial and temporal dynamics of soil organic carbon in reserved desertification area
0.6056 Effects of grazing exclusion on soil carbon and nitrogen storage in semi-arid grassland in Inner Mongolia, China
0.5988 GIS-based analysis for hotspot identification of tradeoff between ecosystem services: A case study in Yanhe Basin, China
0.5892 Rubber plantation and its relationship with topographical factors in the border region of China, Laos and Myanmar
0.5842 Effects of grazing exclusion on plant productivity and soil carbon, nitrogen storage in alpine meadows in northern Tibet, China
0.5836 Spatial variability of soil water content and related factors across the Hexi Corridor of China
0.5805 Effects of a conversion from grassland to cropland on the different soil organic carbon fractions in Inner Mongolia, China
0.5782 Disturbance impacts of land use change on biodiversity conservation priority areas across China: 1990–2010

Ez elsőre jónak tűnik. Persze ezt így nehéz átlátni. Én ilyen esetekben szeretem gráfként ábrázolni az eredményt:

Dokumentumok kapcsolata gráfként ábrázolva

Irodalom

Endnotes

  1. angolul: “distributed memory” ↩︎
  2. angolul: “distributed bag of words” ↩︎
  3. Biztos ami biztos, ha valami szerint rendezve lennének a dokumentumok. ↩︎
  4. Akit érdekel a blog Git oldalán megtalálja a kódot és utána is lehet olvashat a blogon ↩︎
Hírdetés

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés /  Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés /  Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés /  Módosítás )

Kapcsolódás: %s