I) Ogólny opis
===============================================================================

Grafon  to projekt umożliwiający budowanie z tekstu grafów.  Założenie grafona 
opiera się o analizę dokumentu i budowie dla każdego zdania z osobna, osobnego 
grafu.  Grafy budowane są  w  ustalony przez użytkownika sposób,  z ustalonych
wcześniej typów krawędzi.  Dodatkowo,  po stronie użytkownika stoi konieczność
ustalenia  typu  węzła.  Podstawę  całego  projektu  stanowi BaseGraph,  który 
zawiera  w  sobie  słownik  identyfikatorów zdań  danego  dokumentu  do grafów
zbudowanych  dla tych zdań.  Jeśli użytkownik chciałby  połączyć ze sobą kilka
zdań  (grafów)  do jednego,  musi  wykorzystać  odpowiedni  ,,merger'',  który 
nazwany został BaseGraphMerger.

Grafy  są  reprezentowane  jako  struktura networkxowa.  Węzeł z grafu może być
dowolnie konfigurowalny poprzez ustawienie typu węzła  z  dostępnych w pakiecie
grafon.nodes. Przy dodawaniu węzła do grafu, funkcja key jest wywoływana w celu
ustalenia klucza dla danego węzła. Ta funkcja wywołyuwana jest względem każdego
tokenu  w tekście.  Przekształca token  do  postaci klucza.  Dodaje węzeł z tym 
kluczem i do danego węzła, do listy tokenów wrzuca przeanalizowany token. Każdy
węzeł  posiada atrybut  'tokens', w  którym zapisane są tokeny z tekstu,  które
podpięte  zostały  pod dany węzeł.  Odczytanie tokenów  to  po prostu operacja:

    tokens = graph.node[node]['tokens']

Wtedy w tokens leżą sobie tokeny, które podpięte są do danego węzła. Dodatkowo,
każdy  węzeł  powinien mieć  przypisaną  labelkę reprezentującą  ten  token  na
"zewnątrz". Może to być np.  klucz zwrócony z funkcji przekształcony do postaci
string-like. Dodawanie krawędzi do grafu odbywa się  w  zależności od wybranego
typu budowania.  Jednak każda  krawędź  posiada labelką (np. relację) na jakiej
podstawie dana krawędź powstała. Np. w przypadku krawędzi ze Słowosieci mogą to
być relacje pomiędzy synsetami.  Jeśli krawędź  jest  wynikiem połączenia dwóch
grafów, wtedy labelka krawędzi powinna przechowywać informację o typie łączenia
np. w przypadku  mergera PlWNMappingMerger może  to być labelka 'plwn_map_wsd'.
Wtedy  graficznie  ładnie  to się przedstawia na krawędzi oraz dodatkowo możemy
badać otoczenie danego węzła okreslonymi typami krawędzi itp.

II) Łączenie grafów
===============================================================================

Łączenie grafów  na podstawie uzupełniania relacji  -  wplatania lematów w graf
Słowosieci:

Kopiuje  minimalny  graf  wycięty ze Słowosieci do nowego grafu,  ponieważ nowy
graf musi zwierać wszystkie znaczenia z wyciętego podgrafu. Nastepnie sprawdzam
graf zbudowany  z  tekstu.  Z założenia  w  węzłach siedzą sobie tokeny,  które
zostały podpięte do danego węzła (posiadają taki sam klucz). 

Teraz muszę wziąc wszystkie węzły z tekstu i sprawdzić ich synsety.
powywalać synsety 


Biore kazdy wezel grafu z tekstu
 - dla kazdego wezla biore wszystkie tokeny
  - dla kazdego tokenu:
    - ustalam metadane
     - sprawdzam czy ma metadane odnośnie wsd (pierwsza pozycja z raningu,
       czyta 'sense:ukb:syns_id') 
       - jesli nie ma, to pomija
       - jesli ma, to ustala znaczenie

III) Aplikacja sentsim
===============================================================================

W przypadku przetwarzania grafów  z  zadanego teskestu (zbudowanych dla każdego
zdania) i łączenia ich do jednego dużego wraz z  doklejaniem kotekstu  z  grafu
semantycznego (SUMO lub Słowosieć), przepływ informacji jest następujący:
1) Dla każdego zdania budowany jest graf.
2) Każdy z tych grafów po kolei uzupełniany jest kontekstem.
3) Na końcu grafy łączone  są  do  jednego dużego - czyli najpierw uzupełnianie
   małych grafów,  następnie połączenie do jednego dużego grafu.  Duży graf nie
   jest już przycinany, tylko jest efektem złączenia wszystkich mniejszych 
   grafów.


IV) Wymagania systemowe
===============================================================================

W celu uruchomienia dowolnego narzędzia z grafona, należy zainstalowaćpakiety:
 sudo apt-get install build-essential python-dev python-setuptools \
                      python-numpy python-scipy \
                      libatlas-dev libatlas3gf-base

Dodatkowo,  należy  zainstalować generator  do grafów tworzonych przez grafona:
 sudo apt-get install libgraphviz-*
 sudo pip install -U pygraphviz
 sudo pip install pyparsing==1.5.7

Jeśli  podczas uruchamiania pojawią  się  problemy,  należy doinstalować pakiet
scikits-learn poleceniem:
 sudo pip install -U scikit-learn
