Analiza prostych zdań w języku polskim, tworzenie programu

1

Szukam pracy jako junior, mam małe doświadczenie komercyjne za sobą. Ostatnio na stanowisko "junior developer" dostałem ciekawe zadanie rekrutacyjne. Różniło się znacznie od tych z jakimi miałem do czynienia do tej pory typu codility, analiza brakujących elementów w liście, todo lista z logowaniem itd. Zadanie dla mnie wydało się mega ciężkie, ale też ciekawe więc byłem zadowolony mając taki problem do rozgryzienia. Oczywiście nie skończyłem w żądanym czasie i nie dostałem się dalej. Miałem zrobić program skryptowy do rozpoznawania zdań w języku polskim. Przykłady nie były złożone, nie miał to być rozbudowany program, ale dla mnie i tak wyzwanie. Czytałem trochę o przetwarzaniu języka naturalnego, sieciach neuronowych, uczeniu maszynowym, nie wiem nawet czy ta cała wiedza byłaby potrzebna, ale wydaje mi się że gdzieś w tych okolicach bije dzwon. Akademicko tych zagadnień nie przerabiałem. Na wyjściu program ma zwracać wartość boolową dla każdego zdania osobno czy piszący chce kontaktu z żywym człowiekiem czy kontynuować konwersacje z botem. Mimo, że już po ptokach to zainteresowało mnie to, chciałbym wiedzieć jak to zrobić gdybym następnym razem dostał podobne zadanie i z jakich materiałów, jakich zagadnień najlepiej się uczyć?

Zaimplementowałem listę czasowników i rzeczowników z języka polskiego, na potrzeby zadania wziąłem kilkaset najczęściej występujących w języku polskim. Poczytałem o typowym szyku zdania w języku polskim. Zrobiłem wykrywanie pozycji czasownika (zdania proste w przykładzie) i analizowanie pod kątem typowego szyku zdania. Dodałem wykrywanie przeczenia co by zmieniło logikę zdania. Druga lista z ręcznie wybranymi czasownikami i połączeniu z rzeczownikami, które mogłyby sugerować chęć kontaktu z konsultantem. Potem proste wykrywanie tematu czasownika tak by formy "zadzwonię" "zadzwońcie" "zadzwonimy" itd przypisać do "dzwonić". Żeby ułatwić wykrywanie słowa znaki mogą być trochę pomieszane względem bazowego czasownika z listy.
I tak dalej kombinowałem. Nic z tego nie wyszło zbliżającego mnie do rozwiązania, ale spodobało mi się to, przekonałem się jakiego rodzaju problemy do rozwiązania mi się podobają.

Czy w ogóle szedłem w dobrą stronę do rozwiązania? Czy żeby się za to w ogóle zabierać powinienem rok poświęcić na natural language processing, a teraz zając się mniej skomplikowanymi tematami, stanowisko było na juniora.

0

Szukasz pracy jako junior i dostałeś zadanie polegające na przetwarzaniu języka naturalnego? Hmmm jeśli na stanowisku tego "juniora" dawaliby 10k na okresie próbnym to ok, jeśli nie to śmierdzi mi JanuszSoft'em, ew. firma dała ogłoszenie, znaleźli kogoś do pracy, a reszcie odmawiają dając niewykonalne zadanie.

0

Samemu wordnet-a nie zrobisz. Ogólnie zadanie tragiczne nie jest jeżeli firma zajmuje się przetwarzaniem języka naturalnego.

0

zajrzyj na stronę http://denise.pl/ Poszukaj starszych artykułów autora strony, w magazynach dyskowych podpisywał się jako IvanHoe, a później jako Smoczek. trochę ciekawych przemyśleń znajdziesz

0
axelbest napisał(a):

Szukasz pracy jako junior i dostałeś zadanie polegające na przetwarzaniu języka naturalnego? Hmmm jeśli na stanowisku tego "juniora" dawaliby 10k na okresie próbnym to ok, jeśli nie to śmierdzi mi JanuszSoft'em, ew. firma dała ogłoszenie, znaleźli kogoś do pracy, a reszcie odmawiają dając niewykonalne zadanie.

Stawki juniorskie, nie TOP3 city, raczej nie różniące się od stawek junior frontendowca psd2html, ale za pewne praca dająca więcej satysfakcji i lepsze możliwości, w tym finansowe. Zdania testowe miały być proste, od kilku do kilkunastu zdań, żadne dialogi, tylko pasywna podstawowa analiza, no dla mnie i tak trudne, ale spodobało mi się, chcę podrążyć temat. Nie jest powiedziane też że zadanie testowe musiało być dopięte na ostatni guzik, pewnie wybrali program, którego podejście i kod zrobił najlepsze wrażenie co wcale nie oznacza że przeszedł wszystkie testy.

kaczus napisał(a):

zajrzyj na stronę http://denise.pl/ Poszukaj starszych artykułów autora strony, w magazynach dyskowych podpisywał się jako IvanHoe, a później jako Smoczek. trochę ciekawych przemyśleń znajdziesz

Dzięki. Ciekawa lektura.
Ogółem temat mnie interesuje tylko nie wiem jak się przebić w Al, machine learning, nlp, analiza danych, inteligentne mapy bo jestem na początku mojej kariery i na co dzień mam do czynienia z rzeczami typu psd2html, php symfony, mysql. No i nie mam studiów, może kiedyś zrobię, ale prędzej chyba z zarządzania, o ile do zostania jakimś fullstack senior web devem z 20k za x lat to studia nie są potrzebne to w w/w tematach może być chyba mały zonk.

0

Nie wnikam co ty tam w tym CV wpisałeś, że cię przyjęli.
Adekwatne zajęcie do umiejętności.

Koleś się pewnie na ciebie wkurzył za ściemnianie w CV.
I test pokazał, że g**no umiesz.

0

Założyłem konto. Ale ja nie mam żadnych pretensji do firmy "łololololo jakie trudne, nie chcieli mnie, odrzucili taki diament jak ja, będę płakał na forum". Fajne doświadczenie, ciekawe zadanie, chciałem zapytać o rozwiązania i ogólne wskazówki w rozwoju w tym kierunku. W ogłoszeniu junior, wymagania nie były jakieś specjalne, nawet fajne, stack technologiczny bez pierdzenia "dla lidera..." "XHTML/HTML/HTML5/PUG/JADE/CSS/SCSS/LESS/COMPASS/SRESSSS". Zadanie było do wypchnięcia w detykowane dla kandydata miejsce na ich serwerze gdzie było całe środowisko uruchomieniowe, zanim zmienili uprawnienia poszedłem folder wyżej i zobaczyłem listę innych kandydatów, nie wchodziłem w rozwiązania bo to by było oszkukiwanie, a oni mają historię poleceń. W każdym razie nie wchodząc w szczegóły nie było to zadanie dedykowane na szybko dla mnie, ale odpowiednio przygotowany proces rekrutacji. W CV nie ściemniam bo mało rzeczy jeszcze w ogóle mam bym mógł je nawet ewentualnie podrasować :)

0

Przykłady nie były złożone

Pokaż te przykłady.

0
Azarien napisał(a):

Przykłady nie były złożone

Pokaż te przykłady.

Nie podam dokładnie takich samych, ale w stylu:
Witam, chcę rozmawiać z konsultantem
Tylko przeglądam stronę, nie potrzebuję pomocy
Wszedłem by sprawdzić fakturę
Chcę kontakt z człowiekiem

0

To można zrobić wyłapując słowa kluczowe (fakturę, rozmawiać/konsultant, kontakt itp.)

Ewentualną trudnością może być przeczenie w „nie potrzebuję pomocy”.

Generalnie do zrobienia, oczywiście nie w 100% dokładnie. Zadanie polega właściwie na zrobieniu tego najgłupiej jak można, by sprawiało wrażenie że działa i jest inteligentne.

Ale to i tak nie dla juniora jest zadanie. Dla seniora raczej.

0
Azarien napisał(a):

To można zrobić wyłapując słowa kluczowe (fakturę, rozmawiać/konsultant, kontakt itp.)

To tak robiłem. Najpierw wszystkie słowa umieściłem w dwóch tablicach: czasownik i rzeczownik. Skopiowałem kilkaset najczęściej występujących rzecz i czas. w języku polskim. A związki kluczowe musiałbym wypisywać ręcznie, na to nie starczyło mi czasu. Miałem też problem z implementacją przypisania np "zadzwonię" "sprawdzam" ze słowami bazowymi "dzwonić" "sprawdzać". Ogólnie to program miałem własnie idący w tą stronę.

0

Przecież temat jest banalny, jeśli założysz, że nie masz szans na pełną skuteczność. Robisz listę fraz, które program ma wyłapywać (na podstawie podanych ci przykładów i bez szukania po słownikach, w końcu to zadanie rekrutacyjne, a nie praca magisterska). Na podstawie tej listy tworzysz regexpy, które obsłużą ci odmianę (np. (za)?dzwo(nię|nić|ń)) i lecisz po tej tablicy szukając dopasowań. Kodu tu tak naprawdę byłoby niewiele, za to skuteczność programu zależałaby od tego, jak dokładną masz tablicę regexpów.

0

Pytanie czy miałeś to zrobić wszystko ręcznie czy nie. Jeśli tak to faktycznie regexpy. Ale jeśli mogłeś użyć narzędzi które istnieją to dałoby się to zrobić szybko bo do wszystkiego są biblioteki.

0

Miałem też problem z implementacją przypisania np "zadzwonię" "sprawdzam" ze słowami bazowymi "dzwonić" "sprawdzać". Ogólnie to program miałem własnie idący w tą stronę.

Poczytaj o stemmingu i lematyzacji.

0

Sporo narzędzi np do Pythona znalazłem w internecie, ale dotyczyły przetwarzania języka angielskiego. Miałem pomysł by użyć silnika google translate, przyjmować zdania po polsku, a dalej pracować na angielskim tłumaczeniu przy użyciu większej palety narzędzi, api do słownika itd. Skoro miało to być szyfrowanie jednostronne, bez tłumaczenia z powrotem: pl -> en -> pl to straty informacji byłyby dla zadania pomijalnie małe. Szyk zdania mógłby w tłumaczeniach znacznie się zmienić. W każdym razie nie poszedłem w tą stronę. Problem jest taki, że na zadanie miałem 24h, a biorąc pod uwagę nawet wolny dzień to z tego robi się maks 12 godzin, spać trzeba, jeść, inne rodzinne obowiązki :)

No nic, dzięki za hasła i linki do materiałów o NLP, stemming, lematyzacja ciekawe.

1

@Czekoladowy Miś

Zainteresuj się polskim WordNetem http://plwordnet.pwr.wroc.pl/wordnet/. Możesz się pobawić Morfeuszem http://ws.clarin-pl.eu/tager.shtml.

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