2019. július 28., vasárnap

Szövegelemzés Python -nal

Szövegelemzési fogalmak:

 TF-IDF : term frequency - inverse document frequency. Ez az érték jellemzi egy szó fontosságát az adott dokumentumban. A fontosság növekszik a szó újabb és újabb előfordulásával, de csökken, ha az adott korpuszon belül egyre több dokumentumban jelenik meg. Az alábbi esetben a dokumentum egy darab hozzászólás, a korpusz pedig a hozzászólások halmaza.
Használat során a magas tf-idf érték magas kifejezés gyakorisággal és alacsony dokumentum gyakorisággal jár együtt, tehát így kiszűrhetőek a gyakori kifejezések. Egy-egy kifejezés tf-idf értéke akkor nagyobb, mint 0, ha az idf logaritmus belsejében az érték nagyobb, mint 1.
Attól függően, hogy a nevezőhöz hozzáadunk-e 1-et, egy olyan kifejezésnek, amely minden dokumentumban szerepel, nulla vagy negatív lesz a tf-idf értéke.



Absztrakt adattípus : amely absztrakt adatok halmazát  adja meg (definiálja), nem törődve a konkrét gépi megvalósítással.
Pl.: tömb, lista, verem, sor, halmaz, kupac, fa, gráf, hálózat, binomiális kupac


Algoritmus : meghatározott számítási eljárás, a számítási probléma megoldási eszköze
Karakterizáló paramétere 
1.A kiinduló adatok lehetséges halmaza
2.A lehetséges eredmények halmaza
3.A lehetséges közbülső eredmények halmaza
4.A kezdési szabály
5.A közvetlen átalakítási szabályok
6.A befejezési szabály
7.Az eredmény kiolvasási szabály




Algoritmus hatékonysági jellemzője:
A egy algoritmust, x egy bemenő adatot, n=|x | a bemenő adat méretét,D a lehetséges bemenő adatok halmazát.
Legyen TA(x) az A algoritmus végrehajtásának időigénye,  SA(x) az A algoritmus tárigénye az x bemenet esetén.
 Az algoritmus időbonyolultsága és tárkapacitás bonyolultsága


Az olyan halmazt, amely az őt felhasználó algoritmus során változik (bővül, szűkül, módosul) dinamikus halmaznak nevezzük. A dinamikus halmazok elemei tartalmazhatnak:- kulcsmezőt, - mutatókat (pointereket), amelyek más elemekre mutatnak. (pl: a következő elemre) 



A verem (stack) olyan dinamikus halmaz, amelyben előre meghatározott az az elem, melyet a TÖRÖL eljárással eltávolítunk. Ez az elem mindig a legutoljára a struktúrába elhelyezett elem lesz.



A láncolt lista (linked list) olyan dinamikus halmaz, melyben az objektumok, elemek lineáris sorrendben követik egymást. A lista minden eleme mutatót tartalmaz a következő elemre. 



Azt a rendező eljárást, melynek végén az azonos értékű kulcsok sorrendje megegyezik az eredetivel. stabil eljárásnak nevezzük.



Shell rendezés módszere: 

A buborékrendezésnél tapasztalt lassú helyrekerülést igyekszik felgyorsítani azáltal, hogy egymástól távol álló elemeket hasonlít és cserél fel. A távolságot fokozatosan csökkenti, míg az 1 nem lesz. Minden növekmény esetén beszúrásos rendezést végez az adott növekménynek megfelelő távolságra álló elemekre. Mire a növekmény 1 lesz, sok elem már majdnem a helyére kerül.


Négyzetes rendezés módszere:
Felosztjuk az a forrás tömböt √n számú √n elemet tartalmazó részre (alcsoportra). Mindegyikből kiemeljük a legkisebbet. (Ez lesz a főcsoport.) Kiválasztjuk a legkisebbek legkisebbikét (a legkisebbet a főcsoportból) és azt az eredmény tömbbe írjuk, a főcsoportból eltávolítjuk. Helyére abból az alcsoportból ahonnan ő jött újabb legkisebbiket emelünk be a főcsoportba. Az eljárást folytatjuk, míg az elemek el nem fogynak.



Számjegyes rendezés módszere:
Azonos hosszúságú szavak, stringek rendezésére használhatjuk. (Dátumok, számjegyekből álló számok, kártyák, stb.) Legyen d a szó hossza, k pedig az egy karakteren, mezőben előforduló jegyek, jelek lehetséges száma, n pedig az adatok száma. 



 Edényrendezés módszere:
Feltételezzük, hogy a bemenet a [0, 1) intervallumon egyenletes eloszlású számok sorozata. Felosztjuk a [0, 1) intervallumot n egyenlő részre (edények). A bemenetet szétosztjuk az edények között, minden edényben egy listát kezelve. Az azonos edénybe esőket beszúrásos módon rendezzük. A végén a listákat egybefűzzük az elsővel kezdve. 


A szöveg elemzési módszerek között megkülönböztetünk:

 - inkrementális
 - dekrementális módszereket.


Az inkrementális módszerek lényege, hogy egy új hivatkozást azonnal osztályhoz rendel, vagy új osztályt hoz belőle létre, ha az mindentől nagyon távol esik.


Az inkrementális hozzárendelés lépései: 
Azonosítás: - a hivatkozási helyek és szövegrészek kiemelése.
Normalizálás: - a hivatkozó szövegek transzformációja (egységes alakra hozása és tisztítása) és részekre bontás.
Távolságképzés: - az adott kiemelt hivatkozási hely és az osztályok reprezentánsai távolságának kiszámítás.
Hozzárendelés: - a hivatkozási helyek (és ezzel a hozzászólás) osztályhoz rendelése (vagy új osztály létrehozása).
Reprezentálás: - új osztály létrehozása vagy régi osztály bővítése esetén reprezentáns választása.


A szövegek közötti távolság számítására többféle metrikát használhatunk.

Hamming távolság: az azonos pozícióban lévő, de eltérő betűk száma. Az egyik leggyorsabb algoritmus, a hosszabbik szöveg hosszával arányos időigényű. Használata akkor előnyös, ha egy eltérés felismerése sokkal több megkülönböztető információt hordoz, mint az, hogy ténylegesen hány helyen van eltérés.

def hamming_distance(s1, s2):
   diffs = 0
   for ch1, ch2 in zip(s1, s2):
       if ch1 != ch2:
             diffs += 1
   return diffs



Levenshtein távolság: szövegszerkesztési műveletek számában mért távolság, ahol a beszúrás, törlés, és elütés egyforma hibának számít. A távolság Damerau változata a két szomszédos betű felcserélését is egy hibának számolja.
Mindkét algoritmus dinamikus programozási feladatként oldható meg, így legrosszabb esetben a két szöveg hosszának szorzatával arányos időigényű. A természetes szöveghasonlóság számításának alapja. Rövid szövegek, vagy hosszabb, de kevésbé eltérő szövegek esetén alkalmazható. Illetve akkor, ha tudni kell a két szöveg egymásba alakításának pontos módját.

Az egyes szerkesztési műveletek költsége eltérően súlyozható.

def levenshtein_distance(s1,s2):
   n, m = len(s1), len(s2)
   if n > m:
       # Make sure n <= m, to use O(min(n,m)) space
       s1,s2 = s2,s1
       n,m = m,n
       
   current = range(n+1)
   for i in range(1,m+1):
       previous, current = current, [i]+[0]*n
       for j in range(1,n+1):
           add, delete = previous[j]+1, current[j-1]+1
           change = previous[j-1]
           if s1[j-1] != s2[i-1]:
               change = change + 1
           current[j] = min(add, delete, change)
           
   return current[n]



Jaro távolság: az egyező betűk számát, illetve a betűfelcseréléseket veszi figyelembe a távolság számításakor. A lényege, hogy akkor hasonlít jobban két szöveg egymáshoz, ha a rész betűsorozatai megfeleltethetőek egymásnak.
Kimondottan rövid szövegekre lett kifejlesztve, azon belül is személynevekre. Ráadásul futási időben hasonlítható a dinamikus megoldásokhoz, és a cég, valamint terméknév azonosító szerkezet is hasonló a személynevekhez.
 Hátránya, hogy matematikai értelemben véve nem ad metrikát, mert nem teljesül rá a háromszög egyenlőtlenség. Tehát azok az osztályozók, amelyek a távolság eme tulajdonságát használják ki, félreosztályozhatnak.

Az algoritmusnak létezik egy Winkler által definiált továbbfejlesztése, amelyik azon alapul, hogy a szavak elején és végén a betűsorrend helyessége sokkal fontosabb az azonosításkor, mint a közepén. Így a közepén történő különbségeket kisebb súllyal veszi figyelembe.

Az algoritmusnak létezik Java nyelvű szabad implementációja is. A jaro távolság képletében az s1 és s2 a két szöveg hosszát jelöli, az m a megegyező betűk számát, a t pedig a felcserélt betűk számát. 

Ratio hasonlóság: már nem is távolság mérték, hanem egyből hasonlóság. A python difflib csomagjában található SequenceMatcher osztály megvalósítása egy közelítő Leveshntein-féle távolság alapján számolja, míg az algoritmusban alkalmazott változat ennél kicsit nagyobb értékeket ad, hiszen a minimális szövegtávolságra épül.
Ha nincs szükség a minimális szerkesztési távolság meghatározásához, akkor a difflib modul eljárásainak implementációi is használhatóak.
Sőt az ottani megvalósításban gyors-rátát és villám-gyors-rátát is számíttathatunk, melyek a hasonlóságnak egyfajta felső korlátjait adják meg. 


A dekrementális módszerek lényege, hogy az egyes osztályokat csak azután alakítjuk ki, miután már az összes kiemelés párra ismerjük a távolságokat, és ezek alapján jelöljük ki az egymáshoz közeli csomósodásokat, és azok összevonhatóságát.
Ilyenkor egy-egy új elem hozzávétele esetén az osztályok, illetve az azokba történő besorolás jelentősen átalakulhat. Ezért ezek az algoritmusok a távolságok újraszámítása miatt vagy jelentős (négyzetes) időigényűek, vagy ezek tárolása esetén hasonló mértékben tárigényesek.
Akkor érdemes őket alkalmazni, ha az osztályhoz rendelendő új elemek nagyobb adagokban, és nem egyesével érkeznek.
A módszert pontosítani az új elemhez közeli osztályok feldolgozásának sorrendjével és a távolságok újraszámításának hatékonyságával lehet.



https://github.com/klajosw/python/blob/master/kl_python_alapok2.ipynb



mport string

def cleanword(word):
    """
      >>> cleanword('what?')
      'what'
      >>> cleanword('"now!"')
      'now'
      >>> cleanword('?,;(.-here=@&!)<{')
      'here'
      >>> cleanword('?+="word!,@$()"')
      'word'
    """
    word = word.lstrip('\'"?!,;:.+-_=@#$%&*()[]{}/\\<>\n~`')
    return word.rstrip('\'"?!,;:.+-_=@#$%&*()[]{}/\\<>\n~`')


def has_dashdash(s):
    """
      >>> has_dashdash('distance--but')
      True
      >>> has_dashdash('several')
      False
      >>> has_dashdash('critters')
      False
      >>> has_dashdash('spoke--fancy')
      True
    """
    return '--' in s


def extract_words(s):
    """
      >>> extract_words('Now is the time!  "Now", is the time? Yes, now.')
      ['now', 'is', 'the', 'time', 'now', 'is', 'the', 'time', 'yes', 'now']
      >>> extract_words('she tried to curtsey as she spoke--fancy')
      ['she', 'tried', 'to', 'curtsey', 'as', 'she', 'spoke', 'fancy']
    """
    s = s.replace('--', ' ')
    words = s.split()
    for i, word in enumerate(words):
        words[i] = cleanword(word).lower()
    return words


def wordcount(word, wordlist):
    """
      >>> wordcount('now', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['now', 2]
      >>> wordcount('is', ['now', 'is', 'time', 'is', 'now', 'is', 'the', 'is'])
      ['is', 4]
      >>> wordcount('time', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['time', 1]
      >>> wordcount('frog', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['frog', 0]
    """
    return [word, wordlist.count(word),  [i for i,x in enumerate(wordlist) if x == word]]


def wordset(wordlist):
    """
      >>> wordset(['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['is', 'now', 'time']
      >>> wordset(['I', 'a', 'a', 'is', 'a', 'is', 'I', 'am'])
      ['I', 'a', 'am', 'is']
      >>> wordset(['or', 'a', 'am', 'is', 'are', 'be', 'but', 'am'])
      ['a', 'am', 'are', 'be', 'but', 'is', 'or']
    """
    newlist = wordlist[:]
    newlist.sort()
    uniquewords = []
    for word in newlist:
        if word not in uniquewords:
            uniquewords.append(word)
    return uniquewords


def longestword(wordset):
    """
      >>> longestword(['a', 'apple', 'pear', 'grape'])
      5
      >>> longestword(['a', 'am', 'I', 'be'])
      2
      >>> longestword(['this', 'that', 'supercalifragilisticexpialidocious'])
      34
    """
   
    
infile = open('c:/aa/alice_in_wonderland.txt', 'r')
text = infile.read()
infile.close()

wordlist = extract_words(text)
words = wordset(wordlist)

wordcounts = []

for word in words:
    wordcounts.append(wordcount(word, wordlist))


outfile = open('c:/aa/alice_in_wonderland_number.txt', 'w')
outfile.write("%-18s%s\n" % ("Word", "Count"))
outfile.write("=======================\n")

for word in wordcounts:
                if word[0] and word[0][0] in string.ascii_letters:
             outfile.write("%-18s %d -> %30s \n" % (word[0], word[1], word[2]))
               
                  
#                print(",".join(word).tostring()  + '\n')
#           outfile.write("%-18s %d\n" (word[0], word[1]))
          # outfile.write("%-18s %d s% \n" (word[0], word[1],",".join(word[2])))
                   ##outfile.write("%-18s  \n" -18s% ())

outfile.close()














Google Colab alapok felület és lehetőségek

Colab Python SqLite használat:

Töltsuk fel az adatbázis filet a content mappába ( Files menüpontból)


Leprogramozandó lépések:


  • modul betöltése
  • kapcsolódás
  • új tábla létrehozás
  • induló adatfeltöltés
  • adatok lekérdezése és megjelenése

Példa:


## Installálás csak egyszerkel
#  !pip install db-sqlite3  

import sqlite3 as lite
import sys
conn = lite.connect("/content/mie_pills_periods.s3db")
cur = conn.cursor()

#---
# cur.execute("CREATE TABLE drinks(Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Price REAL)") ## Tábla létrehozása (üres)
# cur.execute("CREATE TABLE fruits(Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Price REAL)") ## Tábla létrehozása (üres)

#--
# cur.execute("INSERT INTO drinks(Id, Name, Price ) VALUES ( 4, 'NEV01', 12.1 )")        # Adat feltöltés 1
# cur.execute("INSERT INTO drinks(Id, Name, Price ) VALUES ( 11, 'NEV11', 112.1 )")     # Adat feltöltés 2
# cur.execute("INSERT INTO drinks(Id, Name, Price ) VALUES ( 21, 'NEV21', 42.1 )")      # Adat feltöltés 3

#---
## Véglegesités
conn.commit()

#--- lekérdezés
##list(cur.execute("select * from periods limit 2;"))
#-1
# eredmeny=list(cur.execute("select * from drinks limit 2;"))
# print(eredmeny)

#-2
cur.execute("select * from drinks")
rows = cur.fetchall()
for row in rows:
        print(row)


A minta elérési linkje  vagy egy másik linkje

Alapok1  Alapok2 


$e^{i\pi} + 1 = 0$

$$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$$



Gyorsgomb funkció létrehozása:
%%javascript
Jupyter.keyboard_manager.command_shortcuts.add_shortcut('r', {
help 'run cell',
help_index 'zz',
handler function (event) {
IPython.notebook.execute_cell();
return false;
}}
);

[ ]: %%javascript
Jupyter.keyboard_manager.command_shortcuts.add_shortcut('r'function (event) {
IPython.notebook.execute_cell();
return false;
});
Likewise, to remove a shortcut, use remove_shortcut:
[ ]: %%javascript
Jupyter.keyboard_manager.command_shortcuts.remove_shortcut('r');




JavaScript code in custom.js will be executed when the notebook app starts and can then be
used to customize almost anything in the UI and in the behavior of the notebook.
custom.js can be found in the ~/.jupyter/custom/custom.js. You can share your custom.js with others.

###               IPython notebook használata



%pylab inline ## első parancs // futtatása : Shift + Enter

%pylab    ##magic command betölti az IPython namespace-t

az inline direktiva a garfikai megjelenitést engedélyezi külső program nélkül is



%pylab inline     ## első parancs legyen, edit mod bekapcsolására szolgál

--> imports NumPy and matplotlib

--> bekapcsolja az inline plots rajzolás lehetőséget.




Populating the interactive namespace from numpy and matplotlib



Ha parancs kezdete % és %% akkor mágikus parancs / magic commands -al a futtatást befolyásoljuk





Két tipusa a mágikus parancs jelőlő prefixnek:

• Sorra vonatkozó (Line-oriented): Prefixe single percent (%)

• Cellára vonatkozó (Cell-oriented): Prefixe double percent (%%)



from mpl_toolkits.mplot3d import Axes3D ## külün kell betölteni





%lsmagic          ## összes mágikus parancs lehetőség és jelentésének kilistázása



%autosave 300     ## automatikus mentés bekapcsolása, időtartam megadással

%autosave 0       ## automatikus mentés kikapcsolása



%load_ext cythonmagic   ## cythonmagic kiterjesztet modul betöltése

%%cython                ## használat

cimport cython

from libc.math cimport sin

@cython.cdivision(True)



Magic   -> Purpose

%cd    -> Changes the directory

%pwd   -> Prints the current directory

%ls    -> Lists the current directory contents

%mkdir -> Creates a new directory

%rmdir -> Removes a directory

%echo  -> Prints a string

%alias -> Creates an alias



%load lorenz.py   ## python file betöltése

%load http://matplotlib.org/mpl_examples/pylab_examples/boxplot_demo2.py



%run lorenz.py     ## py állomány futtatása



## más program nyelvek használata:

Cell magic -> Language

%%HTML or %%html -> HTML

%%SVG or %%svg -> Scaled Vector Graphics Language (SVGL)

%%bash -> The Bash scripting language, which is available in

Unix-like -> systems such as Ubuntu and Mac OS X

%%cmd -> MS Windows command-line language

%%javascript -> JavaScript

%%latex -> LaTeX, the scientific-oriented document preparation language

%%perl -> The PERL scripting language

%%powershell -> The MS Windows PowerShell language

%%python2 or %%python3 -> Run a script written in a version of Python different than the one the notebook is running

%%ruby -> The Ruby scripting language



%automagic off     ## mágikus paracsok kikapcsolása







!dir    ## Shell parancs futatása, könyvtár lista



## Shift + Enter   ## gyors parancs/gyors billentyű kombináció parancs sor tartalmának futtatása



## (normál) modulok importálása

import numpy as np



%timeit sin_area(0, pi, 10000)  ## futásidő vizsgálat



### ---- más prormanyelvek használata

%%SVG

<svg width="400" height="300">

<circle cx="200" cy="150" r="100" style="fill:Wheat; stroke:SteelBlue; stroke-width:5;"/>

<line x1="10" y1="10" x2="250" y2="85" style="stroke:SlateBlue; stroke-width:4"/>

<polyline points="20,30 50,70 100,25 200,120" style="stroke:orange; stroke-width:3; fill:olive; opacity:0.65;"/>

<rect x="30" y="150" width="120" height="75" style="stroke:Navy; stroke-width:4; fill:LightSkyBlue;"/>

<ellipse cx="310" cy="220" rx="55" ry="75" style="stroke:DarkSlateBlue; stroke-width:4; fill:DarkOrange; fill-opacity:0.45;"/>

<polygon points="50,50 15,100 75,200 45,100" style="stroke:DarkTurquoise; stroke-width:5; fill:Beige;"/>





%%html

<h1 id="hellodisplay">Hello, world!</h1>





%%javascript

element = document.getElementById("hellodisplay")

element.style.color = 'blue'





### grafika készítése és mentése

%matplotlib

xvalues = linspace(-pi,pi,200)

fcts = [('sin', sin), ('cos', cos), ('exp', exp)]

for fctname, fct in fcts:

yvalues = fct(xvalues)

fig=figure()

ax = fig.add_subplot(1,1,1)

ax.plot(xvalues, yvalues, color='red')

ax.set_xlabel('$x$')

strname = '$\\%s(x)$' % fctname

ax.set_ylabel(strname)

fig.savefig(fctname + '.png')



### grafika alaphelyzetbe állítása és betöltése

%matplotlib inline



## ---

To run a cell, the following shortcuts are used:

°° To run a cell and move to the next cell, press Shift + Enter

°° To run a cell, but stay in the same cell, press Ctrl + Enter

°° To run a cell and insert a new cell below it, press Alt + Enter

°° To create a new line in the current cell, press Enter







https://github.com/fchollet/deep-learning-with-python-notebooks





A modulok hierarchikus struktúrába rendezhetők.

Ez esetben az almodulokat tartalmazó modulok, amiket packageeknek is neveznek,

a filerendszer könyvtáraiként vannak definiálva.



A modulok elnevezése tehát konkatenációval történik : modul.almodul.

A kód portabilitásának egyszerűbbé tételéhez mindegyik könyvtárnak tartalmazni kell egy

__init__.py nevű fájlt.

Ahhoz, hogy lehetséges legyen valamennyi almodul betöltése,

ennek a fájlnak tartalmazni kell a package moduljainak listáját az __all__ változóban.



$ cat graphical / __init__ .py

__all__ = [ ’basic ’ , ’advanced ’]



Az operációs rendszer neve:

>>> sys. platform



Minden metódus függvényként van definiálva, melynek első argumentuma (a self) azt az objektumot reprezentálja,

melyre a metódus a végrehajtásakor alkalmazva lesz



----- Állomány műveletek : csv, txt, xls, json, xml



----- Adatbázis múveletek: oracle, sqlite



----------------



https://nbviewer.jupyter.org/github/ipython/ipython/blob/6.x/examples/IPython%20Kernel/Cell%20Magics.ipynb





Ctrl + Shift + P  gyorsító gombok



%%javascript





common libraries including NumPy, Pandas, SciPy and Matplotlib.



%lsmagic  ## varázsos parancsok listája



Available line magics:

%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect ..

Available cell magics:

%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%perl ..

link: https://ipython.readthedocs.io/en/stable/interactive/magics.html



%matplotlib notebook

%matplotlib inline



%run ./two-histograms.ipynb  ## külső py file lefuttatása



%%writefile pythoncode.py    ## paramcs terület tartalmánek kiírása



%store data  ## másik példánynak változó átadása

és


%store -r data


DWH és DM alapok névkonvenció

Minden tábla és minden oszlop kommenttel kell rendelkezzen, adatbázisban öndokumentálás támogatására.

Tábla szerkezet változáskor értelem szerűen ezek A kommentek is módosításra kerüljenek.


ST, Stage adat érkeztető terület elnevezése

Forrásrendszerenként külön sémába kerüljenek a táblák elhelyezésre.

A táblák nevei három betűs forrásrendszer jelölő prefix-el egészüljenek ki. Javasolt a vizuális elkülönülés céljából a '_' alulvonás alkalmazása.
Pl. OPTEN-es tulajdonos adatok táblája : OPT_OWNER

Kövesse a forrás rendszeri adatok elnevezését, típusát adat hosszát és egészüljön ki a technológiai mezőkkel load_id, load_date



DM, adatpiac mezők elnevezése

A mezők neve legyen beszédes, értse a használó terület mit is talál benne, elsődlegesen angol mezőneveket kell meghatározni.


DM modellezés során a sémát, hogy az igénylő üzleti felhasználók csoportja szervezete alapján kell elnevezni ehhez hárombetűs azonosítót kell választani mely szerepel a séma nevében és a tábla nevét is első helyen prefixeli


 Csillagsémában, továbbá tény és dimenzió táblákban gondolkodunk elsődlegesen egy adatpiac építésekor. 
- Dimenzió tábla (egyes számú) név jelölője (másodlagos prefix)     : D
- Tény tábla (fact)  (egyes számú) név jelölője (másodlagos prefix)  : F


Például:
Conrolling terület kártya típusok dimenzió táblája: CNT_D_CARD_TYPE 
RISK terület tranzakció darabszám : RSK_F_TRANSACTION_NUMBER


A mesterséges kulcs azonosító mezők végén az "_ID" karaktersor jelenlen meg és a két tábla közötti kapcsolatot megteremtő mezők nevei egyezzenek meg a könnyű felhasználhatóság végett.

A DM szinten megjelenő forrás azonosítók egységesen „_ID” helyett „_SID” (Source ID) szuffix-szal legyenek ellátva, függetlenül annak típusától.

Dátum és dátum intervallum típusú mezők és konkrét napot tartalmazó dátum mezők nevei: START_OF_VALIDITY, END_OF_VALIDTY vagy START_DATE, END_DATE és LOAD_DATE;

Adattöltési technikai mezők követve az az adattárház alsóbb (forrás érkeztető) rétegeinek névkonvencióit: LOAD_ID, UPDATE_ID, és használjunk ACTIVE mezőt az érvényességi intervallum dátum mezők mellett, mert az üzleti felhasználás során ezt könnyebb használni.


Indexek neve

Az indexeknek séma szinten szükséges egyedinek lennie.
Tartalmaznia kell a tábla rövid nevét és a mezőt/mezőket az alábbiak szerint.
IDX_[a tábla 6 betűs elnevezése]_[mező rövid neve]
pl.: IDX_CUSTOM_NAME; IDX_ACCOUN_ACCTYPE
Általában nem különböztetjük meg az indexek típusait az elnevezésben.



Primary key-ek neve

Az elsődleges kulcsoknak szükséges egyedieknek lenniük.
Tartalmaznia kell a tábla rövid nevét.
PK_[a tábla 6 betűs elnevezése]
pl.: PK_CUSTOM_CUSID


Unique key-ek neve

Az egyedi kulcsoknak szükséges egyedieknek lenniük.
Tartalmaznia kell a tábla rövid nevét.
UK_[a tábla 6 betűs elnevezése]
pl.: UK_CUSTOM_CUSID


Oszloptípusok

Karakteres típusoknál a VARCHAR2(%N CHAR) típust használjuk.
Szám típusoknál number típust használjuk
Kivéve a flag mezőknél (*_FLG), ahol a CHAR(1 CHAR) típust használjuk



Partíciók
A napi töltésű tábla partíció neve 'P' prefixxel kezdődjön és a partíció napra utaló név legyen.
pl : P_ÉÉÉÉHHNN



Programgenerátorok

Egyedi PL-SQL blokkok fejlesztésénél előszeretettel alkalmaztak programgenerátorokat.
Amennyiben az ismétlődő mintázat és a metaadat vezérelhetőség fennáll, valamint a programlogika bonyolultsága megengedi, akkor van létjogosultsága a generált programoknak.

A programokat nem a metaadatok vezérlik, hanem a metaadatokból generálódik le a célprogram, ami elvégzi a meghatározott feladatokat.

Fontos megjegyezni, hogy a generált programokat változtatni csak a metaadatok változtatásával és a programok újragenerálásával lehet.


A következő esetekben tipikusan alkalmazták:
Stage töltés
Nem bonyolult DW töltés
Nem bonyolult DM töltés


A speciális adattárház működésére kitalált programkód generáló alkalmazás segítségével az elkészített kódot előre definiáltak.

A tényleges adatmozgatások során csak a forrás- és célobjektumok tulajdonságát és töltési szabályát kell meghatározni, amelyekből a generátor előállítja a kész programot.


A generátorok két fő típusa:
Metaadattal generált program (stage programok jellemzően ilyenek) – mapping megadása metaadatként (input, output, transzformáció)
Verzionált adatokra snapshot tábla generáló programok – kulcs alapján legenerálja adott időszakra, az adott tábla snapshot-ját


A generált programok fejlécébe van írva mely paramétertáblákból és milyen programgenerátorral készült. A továbbiakban a módosításuk is ezek segítségével történik.




ODI (Oracle Data Integrátor)


A fizikai séma vagy egy adatbázis séma vagy egy operációs rendszer könyvtárat jelent
A logikai séma egy logikai csoportosítása a rendszereknek (tipikusan 1:1 kapcsolat a fizikai sémával, de kapcsolódhat akár több logikai séma egy fizikai sémához is)
Az ODI modell 1:1 kapcsolatban van a logikai sémával

A logikai séma nem a fizikai séma egy az egyben, így a neve is inkább egy komponens neve, nem pedig a fizikai séma neve.

A fizikai séma változhat (és contextben átirányítható). A logikai séma és modell nem változik idők során.

A modell illetve a logikai séma módosítása elronthatja a már létező MAP-ek működését, ezért tiltott!

Konstans típusok:
C_<forrásrendszer rövidnév>_: a forrásrendszerben használt üzleti rövidítések
C_REF: referencia hiba, üres, nincs
C_SCH: Classification Scheme konstansok
C_CLS: Classification konstansok
C_SKY: source key üres
C_SOB: Source Object konstansok
C_FLG: Flag konstansok


Knowledge Module használat:

Landing area töltő map esetén a fizikai map ábrán vagy egy filter vagy egy temporary tábla található, amire kattintva beállítható a Loading Knowledge Module (LKM Any to Oracle with DBLINK (Custom))

Az Integration Knowledge Module-okat a céltáblákra kattintva lehet beállítani. 

 Az IKM tipusok: 
o IKM Oracle Insert (Custom): egy céltábla insert
o IKM Oracle Merge (Custom): egy céltábla merge
o IKM Oracle Update (Custom): egy céltábla update
o IKM Oracle Delete (Custom): egy céltábla delete
o IKM Oracle Multi Table Insert (Custom): több céltábla insert. INSERT ALL utasítást generál. Az első és utolsó tábla beállítása szükséges a KM paraméterek között
o IKM Oracle SCD2 (Custom): Slowly Changing Dimension, hisztorizáló KM.


Az adattárház stage / LD terület általános filozófiának  megfelelően járunk el:


A LD területre a forrás adatok változatlan tartalommal és csak technikai mezőkkel (töltés dátum, töltés ID) kiegészítve,

mindenféle szűrés, transzformáció és aggregáció nélkül kerüljenek át.

Mindennemű adat transzformáció, tisztítás, szűrés, adat gazdagítás, aggregáció csak a felsőbb területen történhet.

Inkrementális adatkinyeréskor csak egy korábbi, előző töltés időpont óta (pl. az utolsó adatkinyerés óta) megváltozott adatokat válogatjuk le az adattárház részére.

A megváltozott adatok, melyek még nem kerültek áttöltésre leszűrhető ha a forrástábla egy oszlopa tartalmazza az utolsó módosítás időpontját, vagy az egyes változások egy szekvencia azonosítóval (annak növekedésével) foghatóak meg.

Így gondozzuk Anacondánkat (python haladó)

A conda beállítás (frissítés / újra installálás) Terminál ablak indítása:  Conda -> Environments -> base(root) run -> Open ...