Skip to content

Projekt Przepisy

Pawel Dulak edited this page Apr 4, 2020 · 3 revisions

"Przepisy"

Problem (Cel)

Jak wyciągać składniki z kuchennych przepisów i je agregować? Jak z listy posiłków zrobić liste zakupów?

Informacja na temat ostatnich postępów i zmian w projekcie znajduje się na stronie Notatki ze spotkań

Jak to robimy?

Chcemy dać użytkownikowi możliwie największą swobodę przy dobieraniu przepisów kulinarnych. Z wybranych przez użytkownika przepisów chcemy zbudować listę zakupów. Operacja będzie się zatem składać z kilku etapów:

  1. Wybór przepisów - użytkownik chodzi po stronach internetowych z przepisami i wybiera te które chce realizować.
  2. Pobieranie składników przepisów - aplikacja pobiera składniki z wybranych stron z przepisami.
  3. Tworzenie listy zakupów - agregowanie zebranych składników tak aby na przykład "pomidory" z różnych przepisów zostały połączone w jedną pozycję na liście zakupów.
  4. Prezentacja listy zakupów - przekazanie użytkownikowi wyniku działania aplikacji

Najbardziej interesującymi elementami są 2. i 3. czyli pobieranie składników ze stron z przepisami oraz próba ich agregacji.

Co już mamy?

  1. Do zbierania przepisów wybranych przez użytkownika mamy prosty plugin do Chrome - służy on do zebrania adresów URL stron wybranych przez użytkownika. Zebrane adrsy są następnie przesyłane do serwera, obrabiane i wynik obróbki jest wyświetlany w pluginie.
  2. Pobieranie składników przepisów - w tym momencie odbywa się "na serwerze" z którym rozmawia plugin Chrome. Na tym etapie projektu serwer uruchamiamy sobie lokalnie na własnych komputerach. Serwer jest napisany we frameworku Flask. Tutaj jest jego obecna wersja. Do pobierania składników używamy prostych scraperów. W tym momencie koncentrujemy się na stronach które mają wydzielone listy składników (nie trzeba ich wyciągać z opisu dania). Za skrapowanie danych odpowiada funkcja scrape w pliku tools.py
  3. Tworzenie listy zakupów - jest realizowane w funkcji merge w pliku tools.py - obecnie nic konkretnego się tam nie dzieje.
  4. Prezentacja listy zakupów - serwer odsyła rezultat swojej pracy do pluginu Chrome który wyświetla je w swoim panelu.

Elementy z których możesz skorzystać

Dotychczasowe efekty prac autora projektu (Maćka Gawineckiego)

  1. Scrapery i parsery do przepisów i produktów.
  2. Stemmer do języka polskiego w Pythonie.
  3. Ewaluacja Ingredient-Product Matching w opaciu o TF/IDF

Co jeszcze trzeba zrobić?

Potrzebujemy następujących elementów:

  • skraperów do różnych stron z przepisami - jeśli dopiero zaczynasz, to może być ciekawe na początek - nauczysz się jak pobierać dane z różnych stron internetowych
  • funkcji do agregacji składników (listy zakupów) - można na początek po porostu posortować alfabetycznie, można pokusić się o użycie stemmera do znalezienia podobnych składników i połączenia ich ilości
  • udoskonalanie pluginu do Chrome (może będzie potrafił sam zbierać składniki?)

Jak zacząć?

  • zrób własny fork repozytorium projektowego (jeśli nie wiesz o co chodzi, zerknij do instrukcji gita
  • załóż swój katalog w /personal/ i spróbuj uruchomić podstawowe elementy - plugin chrome, serwer flask - kiedy będziesz miał działające podstawy, możesz spróbować implementować kolejne elementy z listy powyżej według wiedzy, możliwości i chęci
  • rób Pull Requesty do naszego repozytorium projektowego :)

Inne rozwiązania (notatki luźno związane z projektem)

"Wyciąganie" składników i ich ilości z przepisów w języku angielskim:

Dane

ML

  • Custom entity extraction: liczby, jednostki, produkty i reszta w jakiś sposób muszą być wyciągnięte.
  • Entity linking: Skąd wiemy, że "pomidory" i "dojrzałe pomidory" są o tym samym produkcie? Albo jak łączymy składnik z encją produktu? W jaki sposób odróżniamy, ze pomidory i puszka pomidorów odnoszą się do różnych produktów?

Wyzwania

  • Niejednoznaczność:

  • Ewaluacja:

    • Ocena rozwiązań wymaga dużo pracy z ręcznym anotowaniem korpusów
  • Język polski

    • Niektóre elementy NLP wymagają dobrego wsparcie do shallow parsing, np. CRF wymaga POS tagging, a nie znalazłem dobrych darmowych narzędzi w Pythonie, które to robią.