Ładne i sensowne tworzenie zdan w jezyku polskim

Odpowiedz Nowy wątek
2003-06-11 22:56
0

A wiec sprawa jest nastepujaca i moze sie wydac banalna ale jak stworzyc jakies zdanie w jezyku polskim :) No ja juz nie wiem :) Powiedzmy ze mam plik w ktorym sa rzeczowniki i one bede podmiotami w zdaniach Powiedzmy ze mam tez plik z orzeczeniami ale jak to polaczyc zeby ladnie gralo zeby zdania wychodzily z sensem :) No juz nawet myslalem ze mozna zrobic cos takiego ktos cos pisze do mojego bota program znajduje podmiot i go zapisuje do pliku jako jeden wyraz natomiast cale zdanie zapisuje do innego pliku czyli mam cale zdanie i niby wystarczy tylko podmienic podmiot ale i tak moze wyjsc dosc dziwne zdanie. Mam nadzieje ze rozumiecie o co mi chodzi bo na razie moj bot uczy sie calych zdan a potem je powtarza ale jak zrobic aby sam te zdania tworzyl :)


Pozostało 580 znaków

2003-06-12 17:19
0

Samo tworzenie dowolnego prostego zdania (byle by było poprawne) nie powinno być ekstremalnie trudne, proponowałbym czasowniki podzielić na grupy: np. działania, kojarzenia, tworzenia itp. i do każdego rzeczownika dopasować numery grup jakie mogą wystąpić w zdaniu z tym podmiotem.

Natomiast kiedy dochodzi do programowania bota, to najważniejsze jest wychwytywanie sensu wypowiedzi użytkownika. Bot musiałby rozpoznawać przede wszystkim tryb wypowiedzi:
a) jeśli jest to zdanie oznajmiające, to bot powinien wychwycić ze zdania wszystkie informacje jakie mogą mu być potrzebne i zapisać je sobie w bazie, np. w formie podmiot --> cecha
b) jeśli jest to zdanie pytające, to ważną rolę pełniłoby rozpoznanie głównego zaimka pytającego ("Jak", "Co") i w zależności od tego sformułowanie odpowiedzi. Od biedy można było by też wychwytywać podmiot i wypisywać wszystkie informacje które bot o nim uzyskał.

Ta wypowiedź pewnie i tak na nic się nie przyda i tylko zaśmieca forum, więc nie zdziwie się jak ktoś mnie znowu wrzuci na swoją "czarną listę"
:-)

Pozostało 580 znaków

2003-06-12 19:42
0

Pedros.

Ale numer mi wykręciłeś z tym postem. Ten temat jest szalenie ciekawy i chodzi mi po głowie od miesięcy (a jeżeli chodzi o mnie, to mam naprawdę ostry zakręt na punkcie algorytmiki, o czym część forumowiczów mogła się nieraz przekonać). Ostatnio myślałem nad rozpisaniem oddzielnego art'a na ten temat w dziale JAVA razem z gotową implementacją.

Niestety w tej chwili nie mam czasu na rozpisywanie art'a, więc jeśli sprawa jest pilna, to z mojej strony musi wystarczyć poniższy zarys programu, ewentualnie po sesji (początek lipca) jestem chętny rozpisać szczegóły (i implementację)

Więc w skrócie:
//jak ten post jest skrótem to pełna wersja jest chyba trzytomowa

Chcemy napisać program, który będzie generował losowe teksty, przy czym teksty te powinny być poprawnie zbudowane (na tyle, aby "gładko się je czytało") natomiast sens mogą mieć przypadkowy i zabawny.

Czyli oczekujemy poprawnej składni i przypadkowej semantyki.

Jak zbudować taki program ?
Po krótkiej chwili namysłu 99% osób powie coś na kształt:

"Program powinien być zbudowany na gruncie bazy danych słów języka polskiego, przy czym powinny istnieć osobne tabele rzeczowników, czasowników ... (części mowy), oraz każde słowo powinno mieć określoną przynależność do grup deklinacyjnych / koniugacyjnych, policzalność, wyjątkowe zachowanie ..."

Podejrzewam że ty sam na coś takiego wpadłeś ... zresztą słowo "wpadłeś" jest chyba nadużyciem - takie rozwiązanie jest po prostu narzucające się (i w mojej opinii - błędne).

Od razu widać że sytuacja jest beznadziejna, język ojczysty bowiem mamy nie najprostszy (mówiąc delikatnie) i oczywiste jest, żę pięć lat na jakichkolwiek studiach językowych nie jest czasem straconym - a zresztą czemu mamy się ograniczać do jakiegokolwiek języka ? Dlaczego by nasz programik nie mógł zarzucić jakiegoś tekstu po niemiecku ? albo staro-angielsku ?

Jestem przekonany, że jakakolwiek próba głębszego wnikania w reguły budowy zdań i składnię może prowadzić tylko do klęski.

Alternatywa ? Swojego czasu odnalazłem wprost fascynujący (żeby nie powiedzieć genialny) algorytm w książce "Perełki oprogramowania" autorstwa Jon'a Bentley'a. Oto ten zaskakujący algorytm w telegraficznym skórcie:

Przede wszystkim nie mamy doczynienia z ŻADNYM słownikiem, bazą danych itp. Źródłem słów jest tekst - książka, strona www, plik txt ... jakikolwiek tekst (trochę tego jest w sieci i spokojnie można ściągnąć niektóre książki, kodeksy prawne, biblię itp).

Pedros sugerował podmienianie podmiotu w zdaniach, ten algorytm działa podobnie. Będziemy dosłownie "mieszać" części zdań, przy czym kompletnie nie zagłębiamy się w zagadnienia lingwistyczne ...

Wybór tekstu ma znaczenie kapitalne i do kwesti tej (będzie ciekawostka) powrócę na koniec.

Aby to co mówię było bardziej czytelne, przyda się jakiś przykład. Załóżmy więc że tekstem na bazie którego będzie działał nasz generator jest książka "Nieznośna lekkość bytu" Milana Kundery, która w szczególności zawiera następujące fragmenty tekstu:

<font color="red">"Metafory są niebezpieczne. Miłość zaczyna się od metafory. Inaczej mówiąc: miłość zaczyna się w chwili, kiedy kobieta wpisze się swym pierwszym słowem do naszej poetyckiej pamięci."

"Ale właśnie dlatego jego gest wydaje mi się pełen głębokiego sensu. Nietzsche przyszedł przeprosić konia za Kartezjusza. Jego szaleństwo (a więc jego rozejście się z ludzkością) zaczyna się w momencie, kiedy płacze nad koniem."</span>

... zajebisty kolorek ... :-8

Dobra, teraz powiedz mi wnikliwy czytelniku, co jest takiego specyficznego w tych dwóch dobranych fragmentach tekstu ?

Powtarzalność słów i zwrotów. Zwrot "zaczyna się" powtarza się trzykrotnie, takie powtórzenia dwóch słów leżą u podstaw tego algorytmu (dobrze więc, aby tekst był stosunkowo długi i posiadał sporo powtórzeń i właśnie dlatego kodeks prawny, biblia i książka kucharska są pierwszymi naturalnymi kandydatami).

Dlaczego pary słów a nie słowa pojedyncze lub trójki ? Wynika to z pewnej chytrej obserwacji, mianowicie okazuje się, że w pewnym sensie słowo w zdaniu jest zdeterminowane przez dwa poprzedzające go słowa. Np. dwa słowa "poszedłem do" dość silnie wpływają i ograniczają to co po nich nastąpi, o wiele silniej niż tylko jedno "poszedłem". Dzięki temu osiągamy tekst, który "gładko się czyta". Naturalnie moglibyśmy brać pod uwagę trójki, co jeszcze bardziej wygładziło by tekst, niestety znacznie by zmniejszyło zabawny bałagan znaczeniowy ... zresztą spokojnie można napisać program w taki sposób, aby możliwa była dynamiczna zmiana tej liczby słów i drogą eksperymentów ustalić optymalną wartość.

Dobra, najwyższy czas wygenerować jedno zdanie.

Zaczynamy od wybrania losowego słowa w całym tekście przy czym słowo to musi rozpoczynać nowe zdanie (wielka litera i poprzedzająca kropka). Losowo wybieramy więc:

<font color="blue">Jego</span>

następne słowo najzwyczajniej dopisujemy tak jak jest (wynika to z napomnianego wcześniej założenia, że haszowanie parami daje akceptowalną poprawność składniową)

<font color="blue">Jego szaleństwo</span>

Następny krok jest najistotniejszy i cały algorytm polega na jego iterowaniu.

1) Tworzymy pustą listę słów.

2) Szukamy w całym tekście takich miejsc, gdzie wystąpiły dokładnie te dwa słowa "Jego szaleństwo". jeżeli znajdziemy gdzieś parę tych słów, to dopisujemy na listę to słowo, które było jako trzecie (to znaczy zaraz po "Jego szaleństwo") i szukamy dalej aż do końca tekstu.

Piękno tego algorytmu polega między innymi na tym, że z pewnością conajmniej jedno takie wystąpienie jest. (poza pewnym bardzo specyficznym przypadkiem gdy jesteśmy dokładnie na samym końcu tekstu i nasze dwa słowa nigdzie indziej się nie pojawiają - trzeba to jakoś oprogramować ... prawdopodobnie odrzucić i zacząć od nowa)

Więc posiadamy teraz listę tych słów, które znalazły się za frazą "Jego szaleństwo", całkiem prawdopodobne że książka "Nieznośna lekkość bytu" posiada kilka wystąpień tej frazy, niemniej w naszym przykładzie ograniczamy się do pewnego fragmentu, w którym ta fraza występuje tylko raz, nasza lista jest więc następująca:

<font color="green">(a</span>

3) Z listy (w tym wypadku jedno wyrazowej) wybieramy losowo jedno słowo i dopisujemy je do generowanego tekstu:

<font color="blue">Jego szaleństwo (a</span>

Następnie powtarzamy ten krok, przy czym teraz parą słów którą operujemy jest "szaleństwo (a".

Lista wyboru będzie ponownie jednoelementowa:

<font color="green">więc</span>

Więc "losowe" (jak coś może być losowe skoro jest zdeterminowane ?) wybranie jednej pozycji z tej listy doprowadzi nas do zdania:

<font color="blue">Jego szaleństwo (a więc</span>

... powtarzamy krok ponownie, tym razem wyszukując pary "(a więc" ...

<font color="blue">Jego szaleństwo (a więc jego</span>

i robimy tak dalej (tekst jest krótki i dlatego nie ma dotychczas żadnych "rozgałęzień"), aż do chwili gdy wygenerowany tekst ma postać:

<font color="blue">Jego szaleństwo (a więc jego rozejście się z ludzkością) zaczyna się</span>

Szukamy słów "zaczyna się" i w efekcie nasza lista ma trzy elementy:

<font color="green">od
w
w</span>

Czy powtarzać pojawienie się "w" czy nie - to jest szczegół (aczkolwiek jest to wyrazem faktu, że pewne kontynuacje są w języku polskim bardziej prawdopodobne)

Wybieramy losowo jedną pozycję - pada na "w". Mamy więc tekst:

<font color="blue">Jego szaleństwo (a więc jego rozejście się z ludzkością) zaczyna się w</span>

Szukamy "się w" (na pewno w książce będą dziesiątki pozycji). W naszej liście są dwie możliwości:

<font color="green">chwili,
momencie,</span>

Losowanie i ... wypada na "chwili," (tak tak, właśnie zmieniliśmy fragment tekstu)

<font color="blue">Jego szaleństwo (a więc jego rozejście się z ludzkością) zaczyna się w chwili,</span>

Nawet przecinek jest poprawnie postawiony (oczywiście mamy w tym wszystkim sporo szczęścia). Szukamy "w chwili," jedyną możliwością kontynuacji jest "kiedy"

<font color="blue">Jego szaleństwo (a więc jego rozejście się z ludzkością) zaczyna się w chwili, kiedy</span>

Dalej szukamy "chwili, kiedy" jest jedna możliwość (aczkolwiek to dlatego bo tekst jest bardzo krótki). Zresztą do samego końca nie będzie już rozgałęzień więc zdanie kończymy w chwili gdy pojawia się kropka, czyli wygenerowaliśmy:

<font color="blue">Jego szaleństwo (a więc jego rozejście się z ludzkością) zaczyna się w chwili, kiedy kobieta wpisze się swym pierwszym słowem do naszej poetyckiej pamięci.</span>

Chciałem tylko zobrazować ogólną ideę tego algorytmu. W całym obrazie brakuje pewnych szczegółów, które muszą się pojawić w implementacji - niemniej intencja jest chyba czytelna - "mieszamy" tekst źródłowy w miejscach rozgałęzienia ... czyli wtedy gdy pewna para słów wystąpuje w tekście więcej niż jeden raz.

Naturalnie ciągłe przeglądanie tekstu od początku nie jest wydajne. Najlepszym rozwiązaniem jest skorzystanie ze struktury danych takiej jak mapa Haszująca, gdzie kluczem będzie para słów a rezultatem lista słów (tych trzecich) - z powtórzeniami lub bez (ja bym sugerował "z powtórzeniami).

Nie jest to wcale trudny program do napisania ... mam po prostu zbyt mało czasu w tej chwili (sesja oczywiście).

Wcześniej obiecałem ciekawostkę dotyczącą wyboru tekstu jako źródłosłowia dla naszego generatora. Mianowicie, co by się stało gdybyśmy jako źródło ustawili nie jeden a dwa teksty (a w zasadzie zlepili dwa teksty) ? Np. Wszystkie posty z tego forum + kodeks postępowania karnego ... w wyniku otrzymujemy ciekawy bełkot programistyczno-prawny.

Ale wracając do początku - cały algorytm jest pisany z myślą o bocie - oto więc moja propozycja: niech źródłem dla generatora będzie pewien tekst (np. Dramaty Shakespeare'a) a dodatkowym, drugim źródłem niech będzie dotychczasowa dyskusja na kanale.

Wchodząc głębiej w szczegóły: Można by przy okazji (wobec dużej dysproporcji w obiętościach tych tekstów) całość tak zaimplementować, aby słowa pochodzące z IRC'a były preferowane (np. modyfikator przy losowaniu słów), albo aby zdania zaczynały się od zawartości kanału ...

Ostatecznie bocik o imieniu np. "Pedros" mógłby reagować na zawołanie typu "Hej Pedros, co o tym sądzisz ?" i w tym miejsu wyskakuje interesujący komentarz informatyczno-staroangielski. (prawdopodobnie całkowicie pozbawiony sensu, lecz możliwe że zabawny).

Naturalnie tekst źródłowy może być równie dobrze napisany w innym niż polski języku. Tak długo jak pozostaje w mocy reguła "dwójka słów determinuje formę składniową trzeciego", tak długo program powinien działać poprawnie.

Nie mogę się doczekać aż ktoś w wygeneruje tekst na podstawie zawartości forum.

Pozdrawiam

ps. Niechciałem, a jednak po raz kolejny napisałem art'a - w poście ...

Pozostało 580 znaków

2003-06-12 20:09
0

Powiem tak: pomysl bardzo interesujacy. Obawiam sie tylko, o tresci zdan, ktore moze wyglaszac taki bot :)
Ogolnie jednak tematyka botow jako sztucznej inteligencji jest bardzo itneresujaca...

Pozostało 580 znaków

2003-06-12 20:09
0

Kapustka jestes wielki :) Wlasnie czegos takiego bylo mi potrzeba dobrego pomyslu :) A jesli chodzi o bota to on juz istnieje a dokladniej ona :) Jest dostepna czasami na gg :) Jak na razie zapsuje cale zdania do plikow a potem je odczytuje odpowiednio i wysyla. To nie jest zly sposob jezeli chodzi o rozmowe z ludzmi ktorzy by ja uczyli nowych rzeczy ale jakis czas temu chyba Sheitar powiedzial ze byloby ciekawie jak by dwa boty ze soba rozmawialy no i wlasnie do tego najlepiej aby boty same tworzyly zdanka i sie ich nawzajem uczyly :) I masz racje to chyba nie bedzie takie trudne do napisania :) Juz zabieram sie do pracy :)

[b][dopisane][/b]
Adamie jezeli chodzi o sens to mysle ze az tak strasznie nie bedzie :) Napisalem juz algorytm ktory znajduje podmiot w zdaniu (moze nie zawsze dziala jak nalezy ale zazwyczaj lapie podmiot) i wtedy wlasnie mozna towrzyc zdania aby zawieraly podmiot i mysle ze tak bedzie naprawde ladna rozmowa :)

A jesli chodzi o Monike to mozecie sobie z nia pogadac jak jest dostepna #GG: 4125691 Ale jak bedzie brzydko pisac to nie jej wina ktos ja tego nauczyl :)


Pozostało 580 znaków

2003-06-12 20:24
0

Pewien drobiazg jest w tym algorytmie istotny - nie ma on ambicji sztucznej inteligencji. Dlatego, jeżeli ten projekt ma być całkiem "na serio" to chyba moje rozwiązanie się nie nadaje ... dlaczego? Gdyż sztuczna inteligencja powinna myśleć o sensie wypowiadanych słów ... ale to jest jak na razie nieosiągalne (z chęcią bym się tu rozpisał o eksperymentach i testach o których słyszałem ... ale zrobię to kiedy indziej)

Faktycznie wygenerowane zdania "gładko się czyta" i z całą pewnością nie będzie to bełkot w stylu:
"wymagania dwanaście Państwowy Instytut data powiedział wstał a po ..."

tylko otrzymamy nieźle brzmiący tekst, bo tak naprawdę my go nie generujemy, tylko zręcznie "mieszamy" pewnym gotowym tekstem, pamiętając przy tym o fakcie, iż "dwa słowa wymuszają poprawność składniową trzeciego" - oczywiście nie zawsze tak jest, ale reguła ta sprawdza się częściej, niż można by na początku przypuszczać.

Natomiast jedno jest pewne - wygenerowane zdania (przy odpowiednim doborze tekstu źródłowego) mogą być bardzo śmieszne i nieprzewidywalne (szczególnie gdy bocik będzie zaczynał od papugowania wypowiedzi z irc'a aż w pewnym momencie odjeżdżał w Shakeaspere'a, aby potem powrócić do programowania ...)

Celem jest tak naprawdę tylko jedno - dobra zabawa (i zaskakujący jak by nie było algorytm).

Zabawny bocik - chyba tego oczekujemy ...

Pozostało 580 znaków

2003-06-12 22:08
0

Uch jeśli chcesz aby te zdania miały sens to musisz się nieźle napisać ;)


You are dead already but You don`t know it yet.

Pozostało 580 znaków

2003-06-12 22:26
0

Uch

Mówiłem o tym chyba z pięć razy, ale powtórzę jeszcze raz ...

Nie chcę żeby miały sens, tylko żeby były poprawne składniowo (co sprowadza się do tego, że gładko się je czyta).

A sens ... cóż, będzie przemieszany - ale jeśli jedno na pięć zdań będzie przypadkowo zabawnie kojarzyło słowa (co jest całkiem możliwe), to chyba jest nieźle (zważywszy na to, że w ogóle nie wnikamy w jakiekolwiek słowniki, bazy danych rzeczowników, reguły składniowe, ba! nawet więcej - w ogóle nie wnikamy w język, tekst może być równie dobrze angielski) ...

trochę się powtarzam.

  • czyli tekst tej dyskusji jest dobrą pożywką dla takiego generatora

buachachachacha

//Tylko żadnego mi tam "buechecheche"
//czytajac owe buechecheche.. nasuwa mi sie taka oto wizja - kapustek z rozwichrzonymi wlosami..stoi wsrod blyskawic i z diabolicznym usmiechem i blyskiem w oku zaciera rece, wydajac tubalnym basem owe buechechecheche.. ;-) (Hłasko Marek)

Pozostało 580 znaków

2003-06-13 00:28
0

YO!! udzielę się w tej dyskusji i zaproponuję wam wejście na www.lingubot.pl gościu jest dosyć rozmowny :)))


Miasto zatraconego słońca

Pozostało 580 znaków

2003-06-13 01:00
0

YO!! udzielę się w tej dyskusji i zaproponuję wam wejście na www.lingubot.pl gościu jest dosyć rozmowny :)))

Aczkolwiek schematyczny i sie powtarza..


Pozdrawiam. Karol

Pozostało 580 znaków

2003-06-13 08:03
0

mi się to cholernie podoba co wymyślił kapustka. Ten bocik może dawać taką filozofie że nikt nie będzie kwestionował że to nie człowiek :) naprawde nie złe!!


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0