-
Notifications
You must be signed in to change notification settings - Fork 16
Projekt Przepisy
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ń
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:
- Wybór przepisów - użytkownik chodzi po stronach internetowych z przepisami i wybiera te które chce realizować.
- Pobieranie składników przepisów - aplikacja pobiera składniki z wybranych stron z przepisami.
- 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.
- 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.
- 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.
- 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 plikutools.py
- Tworzenie listy zakupów - jest realizowane w funkcji
merge
w plikutools.py
- obecnie nic konkretnego się tam nie dzieje. - Prezentacja listy zakupów - serwer odsyła rezultat swojej pracy do pluginu Chrome który wyświetla je w swoim panelu.
- plugin chrome
- serwer Flask współpracujący z pluginem
- przykładowy scraper do strony "przepisy.pl"
- przykładowy serwer flask ze skraperem do "Kuchni Lidla"
- Scrapery i parsery do przepisów i produktów.
- Stemmer do języka polskiego w Pythonie.
- Ewaluacja Ingredient-Product Matching w opaciu o TF/IDF
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?)
- 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 :)
"Wyciąganie" składników i ich ilości z przepisów w języku angielskim:
-
New York Time miał małe podejście: Extracting Structured Data From Recipes Using Conditional Random Fields
-
Czytałem o startupie: Grouping products and naming groups
As far as I am aware there is not really much written about this kind of work. The main advice I can give you is to look at as many recipes as possible to get an idea for what you will encounter, and cut corners wherever possible -- it's a big job to do it perfectly, and you can get very far by using simple methods.
-
Problem wydaje się dosyć popularny, rozwiązania mniej ;-)
- Przepisy: jadlonomia.com, kuchnialidla.pl, kwestiasmaku.com
- Produkty: frisco.pl (dump udostępniany przez firmę)
- 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?
-
Niejednoznaczność:
- Jedna linijka może zawierać kilka składników: "4 szklanki mąki pszennej, tradycyjnej lub orkiszowej", "4 łyżki masła (ja użyłam roślinnej margaryny dobrej jakości)"
- Synonimy: kumin -> kmin rzymski
- Brak produktu w bazie produktów: 6 młodych, umytych gałązek sosny
- Kilka produktów pasujących do jednego składnika: "1 puszka pomidorów" to "Pomidory całe w puszce", "Pomidory krojone w puszce".
- Czasem partial match też może być dobry: dla "1/2 łyżeczki ekstraktu waniliowego" idealne dopasowanie to "https://www.frisco.pl/pid,43169/n,nielsen-massey-ekstrakt-waniliowy-madagascar-bourbon/stn,product", ale są też tańsze alternatywy: "https://www.frisco.pl/pid,89505/n,delecta-aromat-do-ciast-waniliowy/stn,product"
-
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ą.