Przetwarzanie języka w praktyce. przykładzie problemu rozstrzygania wieloznaczności

Podobne dokumenty
Wprowadzenie do języka Ruby

Programowanie obiektowe

Programowanie w Ruby

Programowanie w Ruby

Zaglądamy pod maskę: podstawy działania silnika wyszukiwawczego na przykładzie Lucene

TorqueBox. Moc Javy piękno Rubiego

Elektroniczny korpus tekstów polskich XVII i XVIII w. (do 1772 r.) prezentacja znakowania morfosyntaktycznego i możliwości wyszukiwarki

Programowanie w Ruby

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

Wykład nr 1 Język Ruby i framework Rails

Metaprogramowanie w Ruby

Jajem, tyjesz, wyjecie czyli Dlaczego dialog z komputerem jest taki trudny?

EPI: Interfejs Graficzny 2011/2012 Laboratorium nr 2 Programowanie obiektowe

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Python. Wprowadzenie. Jolanta Bachan

Programowanie w Ruby

KorBa. Elektroniczny korpus tekstów polskich XVII i XVIII w. (do 1772 r.) Renata Bronikowska Instytut Języka Polskiego Polska Akademia Nauk

Podstawy Kompilatorów

Programowanie w Ruby

Wstęp do Programowania 2

Indeksowanie full text search w chmurze

Generator YACC: gramatyki niejednoznaczne

Programowanie w Ruby

Programowanie w Ruby

Korpusomat narzędzie do tworzenia przeszukiwalnych korpusów języka polskiego

EPI: Interfejs Graczny 2009/2010 Podstawy Rubiego

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

media Wyszukiwanie pełnotekstowe z wykorzystaniem Search Engine

Wstęp do ruby dla programistów javy

Programowanie Obiektowe Ćwiczenie 4

KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ

(Apache) CouchDB. Krzysztof Kulewski 2008

Programowanie w C++ z użyciem kontenerów - parę przykładów programów Opracowanie: dr hab. Mirosław R. Dudek, prof. UZ

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

EGZAMIN MATURALNY OD ROKU SZKOLNEGO

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Czytelnik w bibliotece cyfrowej

Zasady programowania Dokumentacja

Domain-specific Languages. Języki dziedzinowe. Adam Robaszyński-Janiec

Wprowadzenie do programowania i programowanie obiektowe

Interaktywne wyszukiwanie informacji w repozytoriach danych tekstowych

Wykład 4. Algorytmy i programy. Algorytmy + struktury danych = programy. Niklaus Wirth. Algorytm = logika + sterowanie.

Informatyka 1. Przetwarzanie tekstów

media Blitz wydajne sytemy szablonów

Wstęp do programowania. Różne różności

Wstęp do programowania

PRZETWARZANIE ROZPROSZONE ZADAN` Mariusz Gil 4Developers 2012, Poznań

Intro. I.Wojnicki, ZTB:XML ZTB: XML. Igor Wojnicki. Katedra Informatyki Stosowanej, Akademia Górniczo-Hutnicza w Krakowie.

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie Obiektowew języku C++ Zadania L2

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Zaawansowany kurs języka Python

Programowanie w Ruby

Python wstęp do programowania dla użytkowników WCSS

akademia androida Składowanie danych część VI

Kurs rozszerzony języka Python

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Wyjątki. try - except

PARADYGMATY PROGRAMOWANIA Wykład 3

Eksploracja Zasobów Internetu

Encje w Drupalu. Tworzenie własnych encji i ich wpływ na poprawę wydajności

Analiza i projektowanie obiektowe 2017/2018. Wykład 3: Model wiedzy dziedzinowej

Python dla początkujących. Małgorzata Niewiem AGH, GGiOŚ, Katedra Geoinformatyki i Informatyki Stosowanej SATIM Satelitarny Monitoring

Microsoft IT Academy kurs programowania

System Korekty Tekstu Polskiego

Funkcje są prawdopodobnie najważniejszą częścią każdego poważnego programu (w każdym języku programowania).

Tablice deklaracja, reprezentacja wewnętrzna

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Informatyka II. Laboratorium Aplikacja okienkowa

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 1 - podstawy - rozwi zania zada« Michaª Alichniewicz. Gda«sk Studenckie Koªo Automatyków SKALP

Programowanie i projektowanie obiektowe

Przydatne sztuczki - sql. Na przykładzie postgres a.

OPT Open Power Template. System szablonów OPT. Przykładowy skrypt oraz szablon OPT OPT API

Programowanie obiektowe i C++ dla matematyków

Zaawansowany kurs języka Python

Lista, Stos, Kolejka, Tablica Asocjacyjna

EPI: Interfejs Graficzny Wykład nr 2 Wbudowane typy danych Rubiego

Zadanie analizy leksykalnej

Wykresy i interfejsy użytkownika

Propozycja rozszerzenia składni zapytań programu Poliqarp o elementy statystyczne

Nowe zadania Biblioteki kilka słów o kompleksowym wspomaganiu szkół i placówek

2

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Pętle. Programowanie komputerowe

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Podstawy i języki programowania

Struktury danych (I): kolejka, stos itp.

Zaawansowany kurs języka Python

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Wykład 6. Wyszukiwanie wzorca w tekście

Comarch ERP XL Business Intelligence Start. Migracja do wersji 2018

Programowanie obiektowe

Programowanie proceduralne w języku C++ Podstawy

Przewidywanie cen akcji z wykorzystaniem artykułów prasowych

Wstęp do informatyki. Python 1

Transkrypt:

, na przykładzie problemu rozstrzygania wieloznaczności Aleksander Pohl http://apohllo.pl Katedra Informatyki, Akademia Górniczo-Hutnicza SFI 8. marca 2008

Plan prezentacji Określenie celu Wymagania Ferret Wieloznaczność

Cel Podstawowy cel: Obsługa fleksji w napisanej w Ruby bibliotece Ferret, będacej portem Apache Lucene. Po co? Wyszukiwanie pełnotekstowe na polskojęzycznych stronach WWW Coś więcej? Zobaczymy... ;-)

Cel Podstawowy cel: Obsługa fleksji w napisanej w Ruby bibliotece Ferret, będacej portem Apache Lucene. Po co? Wyszukiwanie pełnotekstowe na polskojęzycznych stronach WWW Coś więcej? Zobaczymy... ;-)

Cel Podstawowy cel: Obsługa fleksji w napisanej w Ruby bibliotece Ferret, będacej portem Apache Lucene. Po co? Wyszukiwanie pełnotekstowe na polskojęzycznych stronach WWW Coś więcej? Zobaczymy... ;-)

Wymagania Interpreter Rubiego (lub Pythona): ruby-lang.org Biblioteka Morfeusz (alternatywnie: CLP, fsa_morph): nlp.ipipan.waw.pl/ wolinski/ morfeusz/morfeusz.html gem RubyInline (dla Pythona - niepotrzebne) gem ferret (dla Pythona - lupy) binding Ruby - Morfeusz: apohllo.pl/src/morfeusz.rb binding Python - Morfeusz: students.mimuw.edu.pl/ jw209508/ nlp/morfeusz.py

Wymagania Interpreter Rubiego (lub Pythona): ruby-lang.org Biblioteka Morfeusz (alternatywnie: CLP, fsa_morph): nlp.ipipan.waw.pl/ wolinski/ morfeusz/morfeusz.html gem RubyInline (dla Pythona - niepotrzebne) gem ferret (dla Pythona - lupy) binding Ruby - Morfeusz: apohllo.pl/src/morfeusz.rb binding Python - Morfeusz: students.mimuw.edu.pl/ jw209508/ nlp/morfeusz.py

Wymagania Interpreter Rubiego (lub Pythona): ruby-lang.org Biblioteka Morfeusz (alternatywnie: CLP, fsa_morph): nlp.ipipan.waw.pl/ wolinski/ morfeusz/morfeusz.html gem RubyInline (dla Pythona - niepotrzebne) gem ferret (dla Pythona - lupy) binding Ruby - Morfeusz: apohllo.pl/src/morfeusz.rb binding Python - Morfeusz: students.mimuw.edu.pl/ jw209508/ nlp/morfeusz.py

Wymagania Interpreter Rubiego (lub Pythona): ruby-lang.org Biblioteka Morfeusz (alternatywnie: CLP, fsa_morph): nlp.ipipan.waw.pl/ wolinski/ morfeusz/morfeusz.html gem RubyInline (dla Pythona - niepotrzebne) gem ferret (dla Pythona - lupy) binding Ruby - Morfeusz: apohllo.pl/src/morfeusz.rb binding Python - Morfeusz: students.mimuw.edu.pl/ jw209508/ nlp/morfeusz.py

Wymagania Interpreter Rubiego (lub Pythona): ruby-lang.org Biblioteka Morfeusz (alternatywnie: CLP, fsa_morph): nlp.ipipan.waw.pl/ wolinski/ morfeusz/morfeusz.html gem RubyInline (dla Pythona - niepotrzebne) gem ferret (dla Pythona - lupy) binding Ruby - Morfeusz: apohllo.pl/src/morfeusz.rb binding Python - Morfeusz: students.mimuw.edu.pl/ jw209508/ nlp/morfeusz.py

Indeksu 1: require ferret 2: include Ferret 3: index = Index::Index.new(:path =>./index ) 4: index «{:id => 1, :content => Ala ma kota } 5: index «{:id => 2, :content => To kot a to Ala } 6: index.flush 5: index.search_each( Ala ) do id,score 7: puts Dokument #{id}: #{score} 8: highlights = index. 9: highlight(query,id, :field => :content, 10: :pre_tag => \033[36m, 11: :post_tag => \033[m ) 12: puts highlights 12: end

Indeksu 1: require ferret 2: include Ferret 3: index = Index::Index.new(:path =>./index ) 4: index «{:id => 1, :content => Ala ma kota } 5: index «{:id => 2, :content => To kot a to Ala } 6: index.flush 5: index.search_each( Ala ) do id,score 7: puts Dokument #{id}: #{score} 8: highlights = index. 9: highlight(query,id, :field => :content, 10: :pre_tag => \033[36m, 11: :post_tag => \033[m ) 12: puts highlights 12: end

Indeksu 1: require ferret 2: include Ferret 3: index = Index::Index.new(:path =>./index ) 4: index «{:id => 1, :content => Ala ma kota } 5: index «{:id => 2, :content => To kot a to Ala } 6: index.flush 5: index.search_each( Ala ) do id,score 7: puts Dokument #{id}: #{score} 8: highlights = index. 9: highlight(query,id, :field => :content, 10: :pre_tag => \033[36m, 11: :post_tag => \033[m ) 12: puts highlights 12: end

Indeksu 1: require ferret 2: include Ferret 3: index = Index::Index.new(:path =>./index ) 4: index «{:id => 1, :content => Ala ma kota } 5: index «{:id => 2, :content => To kot a to Ala } 6: index.flush 5: index.search_each( Ala ) do id,score 7: puts Dokument #{id}: #{score} 8: highlights = index. 9: highlight(query,id, :field => :content, 10: :pre_tag => \033[36m, 11: :post_tag => \033[m ) 12: puts highlights 12: end

Analizator 1: class PolishLexer < Analysis::TokenStream 2: end 3: class MyAnalyzer < Analysis::Analyzer 4: def token_stream(field, str) 5: return PolishLexer.new( 6: Analysis::LowerCaseFilter.new( 7: Analysis::StandardTokenizer.new(str)))) 8: end 9: end 10: index = Index::Index.new(:path =>./index, 11: :analyzer => MyAnalyzer.new)

Analizator 1: class PolishLexer < Analysis::TokenStream 2: end 3: class MyAnalyzer < Analysis::Analyzer 4: def token_stream(field, str) 5: return PolishLexer.new( 6: Analysis::LowerCaseFilter.new( 7: Analysis::StandardTokenizer.new(str)))) 8: end 9: end 10: index = Index::Index.new(:path =>./index, 11: :analyzer => MyAnalyzer.new)

Analizator 1: class PolishLexer < Analysis::TokenStream 2: end 3: class MyAnalyzer < Analysis::Analyzer 4: def token_stream(field, str) 5: return PolishLexer.new( 6: Analysis::LowerCaseFilter.new( 7: Analysis::StandardTokenizer.new(str)))) 8: end 9: end 10: index = Index::Index.new(:path =>./index, 11: :analyzer => MyAnalyzer.new)

Lexer 1: class PolishLexer < Analysis::TokenStream 2: def initialize(stream) 3: @stream = stream 4: end 5: def next 6: @stream.next 7: end 8: def text=(content) 9: @stream.text = content 10: end 11: end

Lexer next 1: class PolishLexer < Analysis::TokenStream 2: def next 3: token = @stream.next 4: if!token.nil? 5: deflected = deflect(token.text) 6: case deflected 7: when String 8: token.text = deflected 9: when Array 10: token.text = deflected[0] 11: end 12: end 13: token 14: end 15: end

Lexer deflect 1: Lexeme = Apohllo::Morfeusz::Lexeme 2: class PolishLexer < Analysis::TokenStream 3: private 4: def deflect(text) 5: lexemes = Lexeme.find(text) 6: if lexemes.size > 0 7: lexemes.collect{ l l.base_form}.uniq 8: else 9: text 10: end 11: end 12: end

Czy to rozwiazanie jest zadowalajace?»nasza reprezentacja zdobyła sześć goli.«nasza: 2 formy podstawowe: nasz, naszać goli: 3 formy podstawowe: gol, golić, goły W naszym rozwiazaniu brana jest tylko pierwsza forma podstawowa! when Array : token.text = deflected[0] Rozwiazanie: umieścić w indeksie wszystkie formy podstawowe.

Wszystkie formy 1: class PolishLexer < Analysis::TokenStream 2: def next 3: unless @my_tokens.nil? or @my_tokens.empty? 4: return @my_tokens.shift 5: end 6: case deflected 7: when Array 8: token.text = deflected[0] 9: @my_tokens = deflected. 10: collect{ d Analysis:: 11: Token.new(d,token.start,token.end)} 12: end 13: end 14: end

Czy to już koniec? Żeby rozwiazanie działało poprawnie, konieczne byłoby modyfikowanie również zapytania tak, aby uwzględniało ten specyficzny przypadek. W istocie częściowo jest to zapewnione jeśli wprowadzimy inna formę, która posiada tę sama formę podstawową, to wszystko dzieje się właściwie. Jednak w przypadku gdy podamy dokładnie tę formę goli, nie otrzymamy wyników gdzie będzie występowało słowo gol, golił, ani goły. A może powinniśmy inaczej podejść do problemu? Przecież tylko jedna forma podstawowa jest poprawna: gol! Ale jak ja wybrać?

Czy to już koniec? Żeby rozwiazanie działało poprawnie, konieczne byłoby modyfikowanie również zapytania tak, aby uwzględniało ten specyficzny przypadek. W istocie częściowo jest to zapewnione jeśli wprowadzimy inna formę, która posiada tę sama formę podstawową, to wszystko dzieje się właściwie. Jednak w przypadku gdy podamy dokładnie tę formę goli, nie otrzymamy wyników gdzie będzie występowało słowo gol, golił, ani goły. A może powinniśmy inaczej podejść do problemu? Przecież tylko jedna forma podstawowa jest poprawna: gol! Ale jak ja wybrać?

Czy to już koniec? Żeby rozwiazanie działało poprawnie, konieczne byłoby modyfikowanie również zapytania tak, aby uwzględniało ten specyficzny przypadek. W istocie częściowo jest to zapewnione jeśli wprowadzimy inna formę, która posiada tę sama formę podstawową, to wszystko dzieje się właściwie. Jednak w przypadku gdy podamy dokładnie tę formę goli, nie otrzymamy wyników gdzie będzie występowało słowo gol, golił, ani goły. A może powinniśmy inaczej podejść do problemu? Przecież tylko jedna forma podstawowa jest poprawna: gol! Ale jak ja wybrać?

Czy to już koniec? Żeby rozwiazanie działało poprawnie, konieczne byłoby modyfikowanie również zapytania tak, aby uwzględniało ten specyficzny przypadek. W istocie częściowo jest to zapewnione jeśli wprowadzimy inna formę, która posiada tę sama formę podstawową, to wszystko dzieje się właściwie. Jednak w przypadku gdy podamy dokładnie tę formę goli, nie otrzymamy wyników gdzie będzie występowało słowo gol, golił, ani goły. A może powinniśmy inaczej podejść do problemu? Przecież tylko jedna forma podstawowa jest poprawna: gol! Ale jak ja wybrać?

Możliwe rozwiazania gramatyka 1 Wykorzystanie zależności gramatycznych:»..zdobyła (kogo? co?) sześć (kogo? czego?) goli.«na ostatnim miejscu oczekujemy rzeczownika w dopełniaczu. Spośród słów: gol, golić, goli; tylko pierwsze jest rzeczownikiem. Problem: żeby określić to wymaganie musimy wcześniej znać właściwy opis morfosyntaktyczny elementów znajdujacych się w kontekście danego słowa. Zwykle opisy te nie sa jednoznaczne.

Możliwe rozwiazania gramatyka 1 Wykorzystanie zależności gramatycznych:»..zdobyła (kogo? co?) sześć (kogo? czego?) goli.«na ostatnim miejscu oczekujemy rzeczownika w dopełniaczu. Spośród słów: gol, golić, goli; tylko pierwsze jest rzeczownikiem. Problem: żeby określić to wymaganie musimy wcześniej znać właściwy opis morfosyntaktyczny elementów znajdujacych się w kontekście danego słowa. Zwykle opisy te nie sa jednoznaczne.

Możliwe rozwiazania gramatyka 1 Wykorzystanie zależności gramatycznych:»..zdobyła (kogo? co?) sześć (kogo? czego?) goli.«na ostatnim miejscu oczekujemy rzeczownika w dopełniaczu. Spośród słów: gol, golić, goli; tylko pierwsze jest rzeczownikiem. Problem: żeby określić to wymaganie musimy wcześniej znać właściwy opis morfosyntaktyczny elementów znajdujacych się w kontekście danego słowa. Zwykle opisy te nie sa jednoznaczne.

Możliwe rozwiazania gramatyka 2 Dla zdania: Nie ma rzeczy bardziej zwykłej i naturalnej niż to, że ludzie, którzy maja roszczenie, iż odkryli jakaś rzecz nową w świecie filozofii i nauk, sugeruja innym, by chwalili ich własne systemy, osławiajac jednocześnie wszystkie te, które powstały wcześniej. otrzymujemy 120960 kombinacj!

Możliwe rozwiazania semantyka»nasza reprezentacja zdobyła sześć goli.«zdobyć można: Mount Everest, kobietę, gol, ale nie gołych ani golić (to nie ma sensu!). Zależności semantyczne sa znacznie bardziej specyficzne niż zależności gramatyczne, dlatego łatwo można zredukować liczbę możliwych interpretacji. Problem: stworzenie słownika, który zawierałby wystarczajaco dokładne opisy słów bardzo czasochłonne, nie wiadomo, kiedy opis jest wystarczajaco dobry.

Możliwe rozwiazania semantyka»nasza reprezentacja zdobyła sześć goli.«zdobyć można: Mount Everest, kobietę, gol, ale nie gołych ani golić (to nie ma sensu!). Zależności semantyczne sa znacznie bardziej specyficzne niż zależności gramatyczne, dlatego łatwo można zredukować liczbę możliwych interpretacji. Problem: stworzenie słownika, który zawierałby wystarczajaco dokładne opisy słów bardzo czasochłonne, nie wiadomo, kiedy opis jest wystarczajaco dobry.

Możliwe rozwiazania semantyka»nasza reprezentacja zdobyła sześć goli.«zdobyć można: Mount Everest, kobietę, gol, ale nie gołych ani golić (to nie ma sensu!). Zależności semantyczne sa znacznie bardziej specyficzne niż zależności gramatyczne, dlatego łatwo można zredukować liczbę możliwych interpretacji. Problem: stworzenie słownika, który zawierałby wystarczajaco dokładne opisy słów bardzo czasochłonne, nie wiadomo, kiedy opis jest wystarczajaco dobry.

Możliwe rozwiazania semantyka»nasza reprezentacja zdobyła sześć goli.«zdobyć można: Mount Everest, kobietę, gol, ale nie gołych ani golić (to nie ma sensu!). Zależności semantyczne sa znacznie bardziej specyficzne niż zależności gramatyczne, dlatego łatwo można zredukować liczbę możliwych interpretacji. Problem: stworzenie słownika, który zawierałby wystarczajaco dokładne opisy słów bardzo czasochłonne, nie wiadomo, kiedy opis jest wystarczajaco dobry.

Koniec Dziękuję!