• Nie Znaleziono Wyników

5 ModeLang – kontrolowany język naturalny do modelowania systemów dynamicznych w biologii

5.3 Metody informatyczne

Sekcja ta opisuje szczegóły informatyczne realizacji narzędzi związanych z językiem ModeLang.

Są to metody umożliwiające parsowanie, analizowanie i integrację modeli. Pierwszym elementem opi-sywanym w tej sekcji jest gramatyka języka ModeLang, której definicja była podstawą do budowania parsera i w związku z tym zbudowanie gramatyki było pierwszym krokiem realizacji projektu związa-nego z implementacją języka ModeLang. W oparciu o zdefiniowaną gramatykę możliwe było zbudowa-nie analizatora leksykalnego i analizatora składniowego. W kolejnym kroku możliwa była implementa-cja strony internetowej wraz z usługami związanymi z parsowaniem i integracją języka z popularnymi rozwiązaniami bioinformatycznymi.

5.3.1 Gramatyka

W związku z tym, że ModeLang jest kontrolowanym językiem naturalnym, projekt gramatyki języka ModeLang opierał się w początkowym zarysie na językach naturalnych. Następnie gramatyka została rozszerzona o elementy pozwalające na definiowanie wartości parametrów, zmiennych po-mocniczych, a także liczebności populacji agentów. Zapis gramatyki języka, który jest przedstawiony poniżej opiera się na dwóch podstawach formalnych. Zapisany jest za pomocą wyrażeń regularnych oraz Rozszerzonej notacji Backusa-Naura (ang. Extended Backus-Naur Form).

value = [0-9]+ ('.' [0-9]+)? ([eE] [0-9]+)?

parameter_name = [a-zA-Z0-9]+

agent = [a-zA-Z\ ]+

parameter = parameter_name ('=' | '<' | '>') value | value '<' parameter_name '<' value | value '>' parameter_name '>' value

SentenceFinisherBase = CONSTRAINT | DELAY | CONDITIONAL SentenceFinisher = SentenceFinisherBase parameter_name

Interaction1 = agent (VERB | ADJECTIVE | VERB ADJECTIVE) PREPOSITION? agent SentenceFinisher*

Interaction2 = agent (VERB | ADJECTIVE | VERB ADJECTIVE) SentenceFinisher*

Interaction3 = agent 'and' agent VERB PREPOSITION? agent SentenceFinisher*

Interaction4 = NOUN agent ['and' agent]* VERB CONSTRAINT parameter_name

Interaction5 = agent ['and' agent]* VERB PREPOSITION? agent ['and' agent]* SentenceFinisher*

Listing 5. Opis gramatyki języka ModeLang.

Listing 5 przedstawia opis gramatyki, który jest opisem uproszczonym, pełen zapis gramatyki znajduje się w dodatku E. Opisując w kolejnych akapitach znaczenie przedstawionej definicji autor ko-rzysta z pojęcia słowo, przez które rozumie skończony ciąg znaków, który reprezentuje pojęcia lub war-tości liczbowe, a jego postać formalna jest zależna od szczegółowych ograniczeń podanych w jego de-finicji. Tak więc formalnie słowo odpowiada dowolnemu symbolowi terminalnemu lub nieterminal-nemu.

Pierwszym słowem, które jest zdefiniowane w gramatyce jest „value”, czyli słowo, które repre-zentuje wartości liczbowe, które używane są do opisania wartości parametrów i liczb początkowych jednostek danego agenta. Zgodnie z powyższym zapisem, wartości mogą być zapisywane w notacji naukowej.

Kolejnym słowem jest „parameter_name”, które reprezentuje nazwy parametrów. Mogą one przyjmować postać alfanumeryczną i muszą się składać z przynajmniej jednego znaku.

W kolejnym wierszu gramatyki zdefiniowane jest słowo „agent”, które reprezentuje nazwy agentów wykorzystanych w regułach ModeLang. Nazwy agentów mogą składać się ze znaków alfabetu oraz znaków spacji, które pozwalają na tworzenie wieloczłonowych nazw na przykład „Healthy hepa-tocytes”. Podobnie, jak w przypadku nazw parametrów, słowo „agent” musi składać się z przynajmniej jednego znaku.

Wyrażenie „parameter” reprezentuje deklarację wartości parametrów, zakresów parametrów lub wartości początkowych rozmiarów populacji agentów. Zgodnie z powyższym opisem definicja może przyjmować postać przypisania wartości poprzez podanie kolejno nazwy parametru (lub agenta), znaku równości i wartości. Możliwe jest również definiowanie zakresów jednostronnych lub dwustronnych.

W przypadku zakresów jednostronnych znak równości zastępowany jest znakiem większości lub mniej-szości. W przypadku zakresów dwustronnych, zapis wymaga podania kolejno wartości początkowej, znaku większości (lub mniejszości), nazwy parametru, znaku większości (lub mniejszości, takiego sa-mego jak na początku deklaracji) oraz wartości końcowej.

Następnym wyrażeniem jest „SentenceFinisherBase”, którego składowe szczegółowo opisane są w pełnej gramatyce w dodatku. Jest to wyrażenie, które reprezentuje jeden z trzech typów sufiksów zdania, czyli definicję prędkości reakcji, reakcję z opóźnieniem lub regułę warunkową zależną od stanu.

Ze względów formalnych powstało również wyrażenie „SentenceFinisher”, które składa się z

„SentenceFinisherBase” oraz „parameter_name”. „SentenceFinisherBase” pełni tu rolę podstawy for-malnej reprezentującej wartości opisane w poprzednim akapicie, a następnie łączone jest poprzez

„SentenceFinisher” z nazwą wykorzystanego parametru.

Kolejne wyrażenia reprezentują strukturę reguł. W związku z tym, że niektóre reguły (na przy-kład pierwsza i druga) mają taką samą strukturę sprzy-kładniową i rozróżniane są na podstawie słownika, wyrażenia nie są bezpośrednimi odpowiednikami reguł, ale reprezentują wszystkie typy zdań wykorzy-stywane przez język ModeLang. Wyrażenie „Interaction1” reprezentuje proste zdanie wykorzywykorzy-stywane na przykład przez regułę 1 oraz regułę 2. Jak wszystkie wyrażenia poza „Interaction4” kończy się do-wolną liczbą wyrażeń kończących zdanie. Następnie zdefiniowane jest wyrażenie „Interaction2”, które reprezentuje uproszczoną wersję wyrażenia „Interaction1”. Wyrażenie „Interaction3” definiuje zdanie wykorzystywane do zapisu reguł, które wykorzystują dwie nazwy agentów po stronie reagentów, czyli regułę 5. Wyrażenie „Interaction4” przedstawia zdanie wykorzystane przez regułę 6. Jest to szczególny przypadek reguły w języku ModeLang, ponieważ reguła ta nie jest wykorzystana do opisu reakcji po-między agentami, ale do określania granic rozrostu lub minimalnych granic występowania agentów lub

Ostatnim opisanym wyrażeniem jest „Interaction5”, które powstało w związku z zapotrzebo-waniem na stworzenie reguł, w których nie będzie ograniczenia liczby rodzajów reagentów bądź pro-duktów. W związku z tym zdefiniowane zostały reguły „wiele do wielu”. „Interaction5” definiuje zdanie wykorzystywaną przez te reguły. Składa się z trzech wyrażeń, których liczba wystąpień nie jest ograni-czona. Pierwsze takie wyrażenie przedstawia listę agentów, które są reagentami, drugie listę agentów, które są produktami, a trzecie listę zakończeń zdania. Teoretycznie interakcja ta mogłaby zastąpić in-terakcje 1-3, ale zmniejszyłoby to istotnie elastyczność procesu interpretacji modelu.

5.3.2 Analizator leksykalny

Jak już wspomniano wcześniej, w przypadku języka ModeLang jednym z założeń było niedefi-niowane słów kluczowych podczas projektowania języka, aby nie uzależniać zapisów w języku Mode-Lang od pierwotnej wizji reguł języka. Ponadto istotne było, aby język mógł dotyczyć również specjali-zowanych pojęć innych obszarów bioinformatyki lub nawet wykraczać poza biologię. Kolejnym waż-nym elementem było nieuzależnianie języka ModeLang od słownictwa konkretnego języka natural-nego na przykład języka angielskiego. W związku z tym znaczniki (ang. Tokens) w języku ModeLang reprezentują konkretne części zdania, a nie konkretne słowa kluczowe. Dzięki temu możliwe jest dyna-miczne przypisywanie słów kluczowych do danego znacznika i podczas analizy wykrywanie, jaki znacz-nik reprezentuje podane przez użytkowznacz-nika słowo. Zasada funkcjonowania procesu analizy leksykalnej jest opisana szerzej w podrozdziale 3.7.2.

Rozwiązanie od strony technicznej opiera się na słownikach słów kluczowych zapisanych w ję-zyku XML. Słownik składa się z elementów typu keyword, które w atrybucie ruleType wskazują dla ja-kich reguł wskazane słowo kluczowe jest wykorzystywane. Ponadto istnieją dwie możliwe wersje słowa kluczowego: wersja podstawowa, która reprezentuje stronę czynną oraz wersja reprezentująca stronę bierną. Fragment początkowy domyślnie zaimplementowanego słownika słów kluczowych przedstawia Listing 6.

<?xml version="1.0" encoding="utf-8"?>

<keywords xmlns="http://tempuri.org/parser.xsd"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://tempuri.org/parser.xsdparser.xsd">

<keyword ruleType="2,3,4,5">

<base>

<verbs>

<verb>

<value>is</value>

</verb>

<verb>

<value>are</value>

</verb>

</verbs>

<prepositions>

<preposition>

<value>created</value>

</preposition>

<preposition>

<value>emitted</value>

</preposition>

</prepositions>

<adjectives>

<adjective>

<value>by</value>

</adjective>

</adjectives>

</base>

</keyword>

[…]

</keywords>

Listing 6. Fragment słownika słów kluczowych.

Słowa kluczowe zebrane są w postaci zbiorów, które reprezentowane są w składni przez znacz-niki (ang. Tokens). Nazwy znaczników zawierają identyfikatory części zdania i identyfikatory reguł, które znaczeniowo są ze sobą tożsame (na przykład reguły związane z tworzeniem mogą wykorzysty-wać dokładnie ten sam znacznik rozróżniając się jedynie na poziomie składniowym). Dzieje się tak dla-tego, że słowo może znajdować się w różnych typach zdań. Z kolei nazwa powinna uwzględniać rolę, jaką spełnia znacznik, czyli w przypadku ModeLang to części zdania. Jednocześnie powinna brać pod uwagę fakt, że te same części zdania są w innych kontekstach znaczeniowych reprezentowane przez inne znaczniki (na przykład tworzyć i umierać to słowa, które reprezentują tą samą część zdania, ale jednocześnie określają kontekst, który będzie inaczej interpretowany przez analizator składniowy). Ta-bela 3 przedstawia definicję znaczników w języku ModeLang.

Znaczniki Opis

name, number, equal, notEqual, newLine, oper-ator

Znaczniki podstawowe, reprezentują elementy składni języka.

baseVerb12346, baseVerb5 Znaczniki reprezentujące czasowniki podsta-wowe występujące w regułach 1-6.

baseAdjective13, baseAdjective2, baseAdjec-tive4,

Znaczniki reprezentujące przymiotniki podsta-wowe wstępujące w regułach 1-4.

basePreposition12, basePreposition3, basePreposition5, basePreposition6

Znaczniki reprezentujące przyimki podstawowe występujące w regułach 3,5,6 i12.

altPreposition3 Znaczniki reprezentujący przyimek

alterna-tywny, wykorzystany w regule 3.

baseNoun6 Znacznik reprezentujący rzeczownik

podsta-wowy występujący w regule 6.

baseConjunction6 Znacznik reprezentujący spójnik podstawowy

występujący w regule 6.

delayPreposition, delayNoun Znaczniki reprezentujące części zdania występu-jące w regułach z opóźnieniem.

constraintPreposition, constraintArticle, con-straintConjunction, constraintPart

Znaczniki reprezentujące części zdania występu-jące w regułach określających ograniczenia.

altVerb1, altVerb2, altVerb3, altVerb4, altVerb8 Znaczniki reprezentujące alternatywne czasow-niki występujące w regułach 1-4 oraz 8.

Tabela 3. Znaczniki wykorzystywane w języku ModeLang.

Na podstawie wczytanego słownictwa z biblioteki słów kluczowych, której fragment prezento-wał Listing 6 oraz definicji znaczników, które przedstawia Tabela 3 można wykrywać znaczniki, czyli znaczenie słownikowe (z punktu widzenia słownika języka ModeLang) wyrazów, które zostały przeka-zane do analizy leksykalnej. Stanowią one jeden z podstawowych elementów rozpoznawania znaczenia przekazywanych wyrażeń, którymi w przypadku języka ModeLang są definicje parametrów i wartości początkowych oraz opisy reguł. W kolejnym kroku analizator składniowy może wykorzystać wykryte znaczniki do rozpoznania gramatyk.

5.3.3 Analizator składniowy

W oparciu o wykryte znaczniki (ang. Tokens) możliwe jest interpretowanie wyrazów, które składają się na gramatyki. W celu wykrycia sensu ważne jest połączenie zarówno słów jak i konstrukcji składniowej. Poniżej przytoczone zostały trzy przykłady reguł w języku ModeLang.

Healthy hepatocytes are created by healthy hepatocytes at speed rHU Healthy hepatocytes are created at speed rHU

Healthy hepatocytes are killed at speed rHU

Pierwsza przytoczona reguła opisuje reprodukcję hepatocytów. Znacznik, który został wykryty to słowo created, które określa tworzenie. Wykorzystane jest jednak ono zarówno w pierwszym przy-kładzie jak i drugim. W drugim jednak, przytoczona jest zupełnie inna reguła, która opisuje powstawa-nie zdrowych hepatocytów powstawa-niezależpowstawa-nie od czynników będących elementem opisywanego układu (czyli pod wpływem czynników zewnętrznych) z prędkością rHU. Ten przykład pokazuje, że to samo słowo kluczowe pod wpływem innej składni zmienia interpretację opisywanej reakcji, a co za tym idzie kon-sekwencją takiego zapisu jest inna reprezentacja matematyczna. Z kolei drugi i trzeci zapis, przytoczony powyżej różni się jedynie znacznikiem, to znaczy zamiast created, używamy killed. To z kolei pokazuje,

że mimo, że składniowo zdanie zbudowane jest tak samo (zarówno created jak i killed to czasowniki), to jednak znaczenie przekazanego znacznika całkowicie zmienia interpretację matematyczną opisywa-nej reakcji. Reasumując, identyfikowanie znaczenia w sposób jednoznaczny jest możliwe jedynie za pomocą połączenia analizy słownikowej i składniowej.

def p_sentence(p):

'''sentence : sentenceBase sentenceFinisher | declaration''' def p_sentenceBase(p):

'''sentenceBase : rule1Passive | rule1Active | rule2Passive | rule2Active | rule3Passive | rule3Active

| rule4Passive | rule4Active | rule5Passive | rule6 | rule7 | rule8Passive | rule9Active | rule9Passive

| rule10Active | rule10Passive''' def p_rule1Passive(p):

'''rule1Passive : fullNameAgent baseVerb12346 baseAdjective13 basePreposition12 fullNameAgent'''

def p_sentenceFinisher(p):

'''sentenceFinisher : sentenceFinisherBase | sentenceFinisher sentenceFinisherBase''' def p_sentenceFinisherBase(p):

'''sentenceFinisherBase : conditional | constraintBase | delay'''

Listing 7. Fragmenty implementacji analizatora składniowego w języku Python.

Sposób działania analizatora składniowego będzie opisany na przykładzie działania reguły pierwszej zapisanej w stronie biernej języka. Listing 7 przedstawia fragmenty implementacji analizatora składniowego, kluczowe z punktu widzenia zrozumienia działania całej logiki związanej z regułą pierw-szą, jak i całości analizatora dla języka ModeLang. Implementacja została wykonana w języku Python i framworku PLY (Python Lex Yacc). PLY, jest implementacją języków Lex i Yacc w Pythonie. Składa się z bibliotek, które pozwalają na wykorzystanie znanych elementów składniowych z programów Lex i Yacc, które wykorzystywane są do generowania parserów. Więcej informacji o wykorzystywanej technologii znajduje się w dalszej części tego rozdziału w sekcji 5.3.4.

Symbolem startowym składni języka ModeLang jest sentence, czyli symbol reprezentujący do-wolny zwrot, który jest akceptowalny i interpretowany w języku ModeLang. Składa się z dwóch części.

Pierwsza reprezentuje zapis reguł języka ModeLang i jest opisana jako sentenceBase i sentenceFinisher, druga reprezentuje definicje wartości początkowych i parametrów i jest opisana jako declaration.

sentenceBase wskazuje na to, jakie składnie opisywane w dalszej części są akceptowane w ra-mach zapisu reguł języka ModeLang. Jedną z reguł, które są akceptowane jest rule1passive, czyli zapis składni reguły 1 w stronie biernej.

Z przytoczonego opisu reguły rule1passive, którą przedstawia Listing 7 widać, że składa się ona

Healthy hepatocytes are created by healthy hepatocytes

Słowami kluczowymi są tutaj wyrazy „are”, „created” i „by”, które definiują stronę bierną i wskazują składniowo na to, że mamy do czynienia z regułą pierwszą ze względu na użycie znacznika baseAdjec-tive13, który zgodnie z nazwą wykorzystany poza wskazaną regułą jest jeszcze tylko w regule trzeciej, ale w innej konfiguracji składniowej.

Drugim wymaganym elementem pierwszej akceptowalnej formy składni sentence jest senten-ceFinisher. Jego definicja wskazuje na to, że składa się z sentenceFinisherBase w dowolnej liczbie i kon-figuracji.

Znacznik sentenceFinisherBase jest elementem składni, który zawiera trzy znane sufiksy reguł.

Są to definicje warunkowej realizacji reguły, definicje prędkości wykonywania reakcji i definicje opóź-nienia reakcji. Najważniejszym i niezbędnym elementem z punktu widzenia napisania poprawnej reak-cji jest zdefiniowanie poprawnego tempa wykonywania reakreak-cji. Przykładowy zapis takiego tempa wy-gląda następująco:

at speed rHU

W związku z tym całość akceptowana przez analizator składniowy jako poprawna reguła powinna mieć dla opisywanego przypadku następującą postać:

Healthy hepatocytes are created by healthy hepatocytes at speed rHU

Ze względu na elastyczność języka ModeLang istnieje jednak również wiele innych postaci tej interakcji, które będą pasować do tej reguły. Przykładowo:

Healthy hepatocytes are produced from healthy hepatocytes at speed rHU Healthy hepatocytes are emitted by healthy hepatocytes at rate rHU Healthy hepatocytes are spread by healthy hepatocytes with mean time rHU Bioinformatyk modelujący te interakcje mógłby użyć dowolnej z nich.

5.3.4 Realizacja technologiczna

Popularnymi programami wykorzystywanymi do tworzenia kompilatorów i parserów są Lex i Yacc. To standardowe narzędzia, które wbudowane są w systemach unixowych. Yacc odpowiada za generowanie analizatorów składniowych. Lex tworzy jednostki leksykalne, które najczęściej są następ-nie wykorzystanastęp-nie w programie zbudowanym z wykorzystanastęp-niem Yacc. Efektem przetworzenia zapisu w Lex i Yacc jest kod generowany automatycznie w języku C, który następnie można użyć podczas budowy parsera.

Jednym z popularniejszych języków wykorzystywanym między innymi do budowania narzędzi naukowych jest język Python. Jedną z głównych zalet jest prostota zapisu i duża liczba wbudowanych funkcji, a także skrótowych zapisów, dzięki czemu tworzenie programów w Pythonie jest zdecydowanie bardziej wydajne, niż w przypadku języka C. Charakteryzuje się także dużą liczbą dostępnych kompo-nentów i bibliotek, które można wykorzystać przy budowie programów. Jednym z takich komponen-tów jest implementacja Lex i Yacc w Pythonie, czyli PLY (Python Lex Yacc) (Beazley 2001). W związku z możliwością wykorzystania zalet płynących z języka Python oraz komponentu PLY, parser języka Mo-deLang został zaimplementowany w języku Python.

Parser powstał w formie narzędzia internetowego, które uruchamiane jest za pomocą przeglą-darki, dzięki czemu udało się zachować duży stopień niezależności od systemów operacyjnych i typów urządzeń. Komunikacja po stronie Pythona realizowana jest poprzez framework Flask (Grinberg 2014), natomiast po stronie klienta, uruchamiany jest kod w AJAX. Komunikacja odbywa się za pomocą usług sieciowych zbudowanych zgodnie z architekturą REST (ang. Representational State Transfer) (Richard-son and Ruby 2008).

Informacje przechowywane są w relacyjnej bazie danych, która znajduje się na serwerze. Baza danych jest utrzymywana przez system zarządzania bazą danych - MySQL. Rejestrowane są w niej wszystkie podane informacje przez użytkowników, którzy wykonują prace z wykorzystaniem języka ModeLang, a także wszystkie zgłoszone modele.

Jednym z elementów zbudowanego narzędzia, jest prezentacja w przeglądarce układów rów-nań różniczkowych odpowiadających opracowanemu modelowi. Wykorzystaną w tym celu biblioteką jest MathJax (Cervone 2012). Działanie MathJax polega na przeszukiwaniu zawartości strony w poszu-kiwaniu zapisów w formacie MathML oraz LaTeX, w celu skonwertowania wykrytych i poprawnie zin-terpretowanych treści do postaci graficznej. Rozwiązanie wymaga użycia silnika po stronie klienta, stworzonego w JavaScript. Drugim elementem niezbędnym do poprawnego przedstawienia treści ma-tematycznej na stronie, jest przygotowanie zapisu, który będzie mógł podlegać poprawnej analizie.

Powstaje on po stronie serwera i jest udostępniany klientowi za pomocą usługi sieciowej.

Parser języka ModeLang jest napisany w sposób zmodularyzowany. Jego głównym komponen-tem jest silnik parsera zajmujący się analizą tekstu wejściowego i wydobywaniem z niego informacji, a następnie przechowujący wydobyte informacje w postaci dynamicznych struktur danych. Kolejnymi elementami są mechanizmy komunikacyjne zajmujące się wymianą danych z klientem i bazą danych.

Zaimplementowany jest również komponent, który zajmuje się budową zapisu w SBML, na podstawie danych, wydobytych podczas parsowania. Kolejny komponent zajmuje się wykonywaniem obliczeń po-między podanymi parametrami, również w notacji naukowej. Ostatnim zbudowanym komponentem jest element odpowiedzialny za budowę zapisu MathJax, wykorzystywanego na stronie do prezentacji układu równań różniczkowych. Komponent ten przedstawia Zrzut ekranu 3 w sekcji 6.3. Wszystkie opi-sane w tej sekcji komponenty zostały samodzielnie zaprojektowane i zaimplementowane przez autora niniejszej rozprawy.

W pracy badawczej autora bardzo ważnym aspektem było zbudowanie zarówno modułu, który tłumaczy reguły języka ModeLang do postaci układu równań różniczkowych, jak i modułu, który kon-wertuje zapis ModeLang do formatu SBML. Dzięki tym działaniom projektowym i implementacyjnym otwarte zostały nowe możliwości, które zakończyły się pomyślnymi eksperymentami badawczymi opi-sanymi w rozdziale 6.

6 Eksperymentalna weryfikacja