Bei GoDataDriven essen wir gerne Burger. Während unserer GDD-Freitage1 nutzen wir oft die Gelegenheit, in einem der Restaurants in der Nähe unseres Büros in Amsterdam einen leckeren Hamburger zu Mittag zu essen. An einem dieser Freitage haben wir beschlossen, dass wir unser Fachwissen nutzen könnten, um das nächstbeste Restaurant auf unserer nie endenden Suche nach guten Hamburgern zu finden.
Die Landschaft der Suche
Mit dem Ziel, eine datengestützte Auswahl für unser nächstes Mittagessen zu treffen, haben wir Informationen über Restaurants in Amsterdam von einer Online-Bewertungs-Website gesammelt. Die Daten enthalten Bewertungen, Bilder und Rezensionen. Alle diese Daten werden in diesem Blog verwendet, um unsere Entscheidung zu treffen.
Um Ihnen eine Vorstellung von den Daten zu geben, hier eine Momentaufnahme der Restaurantinformationen:
Die Bewertungen für jedes Restaurant sind in einer weiteren Tabelle erfasst:
Mit diesen Daten sind wir bereit, unsere Burger-Suche zu beginnen!
Erster Halt: Kategorie und Bewertungen
Bei unserer Suche nach einem guten Burger wenden wir uns zunächst den Klassifizierungs-Tags zu, die bereits in unserem Datensatz vorhanden sind. Es gibt insgesamt 161 Tags, die zur Kategorisierung von Restaurants verwendet werden, einer davon ist 'Hamburger'. Leider stellt sich heraus, dass nur 23 Restaurants in Amsterdam ein Hamburger-Tag haben, was unsere Suche sehr einschränkt. Es muss doch noch mehr Restaurants geben, die einen guten Burger servieren, oder?
Zweite Station: Elasticsearch
Wir sind uns ziemlich sicher, dass es in Amsterdam mehr als 23 Restaurants gibt, in denen Sie einen guten Hamburger essen können. Um diese Restaurants zu finden, suchen wir nach Kommentaren über Burger. Je mehr Leute in den Kommentaren über Burger sprechen, desto wahrscheinlicher ist es, dass das Restaurant einen Burger auf seiner Speisekarte hat. Wir beginnen mit der Installation von Elasticsearch und lassen es als Dienst laufen:
brew install elasticsearch brew tap homebrew/services brew services start elasticsearch
Jetzt, wo Elasticsearch läuft, können wir es wie folgt in unserem Jupyter-Notebook verwenden:
von elasticsearch importieren Elasticsearch es = Elasticsearch([{'Gastgeber': 'localhost', 'Hafen': 9200}])
Um unsere Analyse durchzuführen, müssen wir uns zunächst Gedanken über die Vorverarbeitung und die Art der Muster machen, nach denen wir suchen wollen. Bei der Vorverarbeitung entfernen wir zum Beispiel Bindestriche und Apostrophe und filtern niederländische Stoppwörter heraus. Da wir nur nach dem 6-Buchstaben-Wort 'burger' suchen, tokenisieren wir die Kommentare, indem wir 3- und 4-Gramme aus Buchstaben für ein gutes Fuzzy-Matching bilden. Elasticsearch verfügt über eine 'Unschärfe'-Funktion, aber durch die Verwendung von 3,4-Grammen erhalten wir eine Annäherung an diese Funktion, die unserem Zweck, Burger zu finden, entspricht. Das bedeutet, dass wir neben Rechtschreibfehlern auch Wörter finden können, die eine Variation des Wortes Burger sind, wie z.B. 'lamsburger' oder 'kipburger'.
es.Indizes.put_settings( Index='iens_comments', Körper={ "Analyse": { "char_filter": Bindestriche_und_Apostrophe_Strich, "Tokenizer": ngram_tokenizer, "Filter": niederländisch_stop, "Analysator": Analysegerät } } )
Wenn unser Index vollständig ist, können wir wie folgt nach dem Text 'burger' in den Rezensionen suchen:
burger_abfrage = es.Suche( Index='iens_comments', doc_type='iens_review', Körper={ "Abfrage": { "Spiel": { "Kommentar": "burger" } } } )
Anstelle von Elasticsearch hätten wir auch eine Form von regulären Ausdrücken verwenden können, um nach Variationen des Wortes "burger" zu suchen. Das Schöne an Elasticsearch ist neben dem unscharfen Abgleich, dass es uns einen Score gibt, um zwischen einer guten und einer noch besseren Übereinstimmung zu unterscheiden. Um Ihnen ein Beispiel für die Ausgabe von Elasticsearch zu zeigen, sehen Sie hier die höchste Punktzahl für eine Übereinstimmung.
Name: Burger Bitch Ergebnis: 32.29639 Bewertung: 2 Kommentar: "Een burger gedaan samen met mijn 5jarige zoon. Serveerster stelde kinder burger voor. Ik bestelde een gewoon classic/original met als verzoek geen uien en geen augurk. Burgers werden gebracht. En ja hoor vol met uien en augurken zowel as topping as in de saus vies klef broodje erg zoet van smaakt burger uitgedroogd. Me zoon een burger zo klein dat hij zelfs zei papa is dit alles. Friet die er bij zat overladen met zout en eea kruide. Al met bleek einde van de €33 1burger met friet 1 cola 1 miniscule burger met friet en appelsap voor die kwaliteit. Geen burger bitch maar burger bagger."
Obwohl es sich nicht um eine sehr positive Bewertung handelt, zeigt sie, dass Elasticsearch uns bei der Identifizierung von Restaurants, die einen Hamburger auf ihrer Speisekarte haben, gute Dienste leistet. Wir fassen die Bewertungen pro Restaurant zusammen, indem wir die maximale Punktzahl nehmen. Unten haben wir die Verteilung dieser aggregierten Bewertungen aufgezeichnet.
Elasticsearch liefert nur maximal 10.000 beste Treffer, was den scheinbar willkürlichen Mindestwert von etwa vier in unserer Verteilung der Bewertungen erklärt. Für unsere Zwecke ist dies kein Problem, da wir festgestellt haben, dass die meisten dieser Bewertungen nichts mit Burgern zu tun haben. Der zweite Buckel in der Verteilung entspricht einer Gruppe von Restaurants mit einer deutlich höheren Punktzahl. Nachdem wir einige weitere Bewertungen manuell geprüft haben, sind wir ziemlich zuversichtlich, einen Schwellenwert von 20 zu wählen, um alle Restaurants mit höherer Punktzahl als Hamburger-Restaurants zu klassifizieren. Damit haben wir 335 weitere Kandidaten für unsere Suche!
Wie wir in der obigen Beispielbewertung gesehen haben, muss ein hoher Elasticsearch-Score nicht unbedingt mit einer hohen Bewertung korrelieren. Daher wäre es gut, wenn wir uns auch die Stimmung der Bewertung ansehen würden. Dies könnte u.a. durch den Aufruf der Google Natural Language API geschehen, um die Stimmung zu unserer Suche nach Burgern hinzuzufügen. Für den Moment beschließen wir jedoch, den Elasticsearch-Score nur als Tag für ein Hamburger-Restaurant zu verwenden und die Bewertung des Restaurants als Indikator für die Qualität des Burgers zu nutzen.
Dritte Station: Bilderkennung
Wie kann man besser feststellen, ob ein Burger schön und saftig ist, als durch einen Blick darauf? Man sagt, ein Bild sagt mehr als tausend Worte. Lassen Sie uns also alle Bilder in unseren Daten finden, auf denen ein Burger zu sehen ist.
Eine einfache Möglichkeit, dies zu tun, ist die Verwendung der Vision API von Google. Alles, was Sie tun müssen, ist einen API-Schlüssel herunterzuladen, eine Anfrage zu erstellen und diese auszuführen:
von googleapiclient.discovery importieren bauen Service = bauen('Vision', 'v1', developerKey=IHR-API-KEY>) Sammlung = Dienst.Bilder() def make_request(url): return {'Bild': {'Quelle': {'imageUri': url}}, 'Funktionen': [{ 'Typ': 'LABEL_DETECTION', 'maxResults': 10}]} def Anfrage_ausführen(url): return Kollektion.Kommentieren Sie(Körper={'Anfragen': make_request(url)}).ausführen.() burger_url = 'https://www.okokorecepten.nl/i/recepten/kookboeken/2014/jamies-comfort-food/jamie-oliver-hamburger-500.jpg' execute_request(burger_url)
Sie erhalten eine Liste mit Beschreibungen und der Wahrscheinlichkeit, dass diese auf dem Bild zu finden sind:


Um herauszufinden, ob Restaurants für ihre Burger visuell werben, haben wir die Vision API auf alle Bilder in unserem Restaurant-Datensatz angewendet und nach den Tags "Hamburger", "Cheeseburger", "Veggie-Burger" und offensichtlich "Slider" (was eine Art Mini-Burger sein kann...) gesucht. Wir haben herausgefunden, dass Veggie-Burger in Wirklichkeit eher verkleidete Lachs-Sandwiches sind und dass wir eine Mindestpunktzahl von etwa 0,75 benötigen, um sicher zu sein, dass wir einen echten Hamburger sehen. Verwenden wir also dieses Kriterium, um insgesamt 59 Restaurants zu markieren, die ihre Hamburger ausstellen. Das klingt vielleicht ein bisschen kitschig, aber wir kommen unserem Ziel näher und bekommen schon jetzt Hunger!
Nebenbei bemerkt: Für die Vision API erhalten Sie 1000 Anrufe pro Monat kostenlos. Danach kostet es Sie USD 1,50 pro Monat (siehe Preise hier).
Vierter Halt: Optionen
Da wir nun 3 verschiedene Möglichkeiten haben, um festzustellen, ob ein Restaurant einen Hamburger verkauft, lassen Sie uns schauen, ob es Überschneidungen gibt. Ein einfaches Venn-Diagramm ist dabei sehr hilfreich:
Wir sehen in der Tat, dass es Überschneidungen zwischen den 3 verschiedenen Hamburger-Tags gibt. Zum Beispiel gibt es 27 Restaurants, die sowohl einen Hamburger auf einem ihrer Bilder zeigen als auch in den Bewertungen darüber sprechen. Es gibt auch ein einziges Restaurant, das alle 3 möglichen Hamburger-Tags hat, und das ist Taproom. Wenn wir alle Tags zusammen betrachten, sehen wir, dass wir die Gesamtzahl der Restaurants in unserem Suchraum von 23 (wie auf der Restaurant-Website angegeben) auf 333 Burger-Restaurants erhöht haben. Das klingt viel realistischer für eine Stadt wie Amsterdam!
Es gibt noch eine weitere wichtige Dimension in unserer Burger-Suche, über die wir noch nicht gesprochen haben: den Standort. Wir verwenden ein nettes Paket namens Folium, um die Kandidaten-Restaurants in der Nähe unseres Büros zu visualisieren, die eine hohe Essensbewertung haben.
Endstation: Wahlmöglichkeit
Nun, da wir alle Zutaten beisammen haben, müssen wir nur noch den Ort für unser nächstes Mittagessen auswählen. Wählen Sie zuerst den nächstgelegenen zu unserem Büro:
Option: Restaurant C Tag-Typ: Elasticsearch Beispielbewertung: "Voor lunch geweest. Salade was lekker, visburger van tafelgenoot zag er goed uit. Vriendelijke service, goede prijs kwaliteit."
Es stellt sich heraus, dass dieses Restaurant keine Burger mehr auf der Karte hat... Schade! Schauen wir uns das zweitnächste an:
Option: India Roti Room Tag-Typ: Elasticsearch Beispielbewertung: "Een overweldigende gastvrijheid! Een onverwachte en onnederlandse ervaring. Ein Erlebnis für alle, die Hamburger, Pulled Pork, Gin-Tonic und Quinoia essen wollen!"
Ai! Dies ist ein gutes Beispiel dafür, wie die Stimmungsanalyse uns helfen könnte, unsere Suche noch besser einzugrenzen. Dieses Restaurant hat definitiv keine Hamburger auf seiner Karte... Wie wäre es mit dem drittnächsten Restaurant? Das wird die letzte Option in Gehweite zu unserem Büro sein.
Option: Amstel Brasserie Schildertyp: Bildbeschriftung Beispielbild: Jummie!
Der Burger sieht großartig aus, aber leider ist das Restaurant nicht in der Lage, uns alle unterzubringen. Es sieht so aus, als wäre unsere ganze Arbeit umsonst gewesen, aber wir können das einfach nicht als Ende unserer Burger-Suche akzeptieren. Pragmatisch wie wir sind, lassen wir den besten Burger zu uns kommen, wenn wir nicht an ihn herankommen können! Wir haben einige zusätzliche Ressourcen verwendet2 um einen Food Truck mit dem besten Fleisch des Landes und einer verlockenden Auswahl an Burgern auf der Speisekarte zu finden. Nachfolgend finden Sie etwas Bildmaterial, damit Sie selbst feststellen können, wie diese Burger aussehen.
War es erfolgreich?



Interessieren Sie sich für Data Science oder Data Engineering und mögen Sie auch noch Burger? Melden Sie sich und kommen Sie an einem GDD-Freitag zu uns, denn wir stellen ein!
Den vollständigen Code zur Replikation der obigen Analyse finden Sie in unserem Github3.
Verfasst von

Roel
Unsere Ideen
Weitere Blogs
Contact



