Ich arbeite an einem Hotel Reservierungssystem. Meine Aufgabe ist es, einen Algorithmus zu implementieren, der richtige Vorschläge macht, wenn der Name eines Hotels falsch eingegeben wird. Zum Beispiel, wenn der Benutzer den Namen des Hotels als "MOFENBICK" eingibt, anstatt seinen wirklichen Namen "MOVENPICK", dann sollte mein Algorithmus vorschlagen, "meintest du MOVENPICK". Ich plane, es mit Machine Learning-Ideen umzusetzen. Was wäre eine gute Auswahl an Funktionen für dieses Problem?Vorschläge implementieren, wenn ein Hotelname eingegeben wird
Antwort
Sie müssen nicht so weit gehen, ein neurales Netzwerk zu implementieren. Das ist Overkill für diese spezielle Aufgabe.
Wie vorgeschlagen, Levenshtein-Abstand verwenden. Die Idee hinter Levenshtein Abstand ist, dass es eine Metrik über Strings definiert. Einfacher gesagt, erlaubt es ein Computeralgorithmus zu sagen, dass "mofenbick" und "movenpick" sich in Entfernung 2 befinden (weil 2 Buchstaben geändert wurden).
Einige Pseudo-Code Levennshtein zu berechnen:
function LevenshteinDistance(char s[1..m], char t[1..n]):
// create two work vectors of integer distances
declare int v0[n + 1]
declare int v1[n + 1]
// initialize v0 (the previous row of distances)
// this row is A[0][i]: edit distance for an empty s
// the distance is just the number of characters to delete from t
for i from 0 to n:
v0[i] = i
for i from 0 to m-1:
// calculate v1 (current row distances) from the previous row v0
// first element of v1 is A[i+1][0]
// edit distance is delete (i+1) chars from s to match empty t
v1[0] = i + 1
// use formula to fill in the rest of the row
for j from 0 to n-1:
if s[i] = t[j]:
substitutionCost := 0
else:
substitutionCost := 1
v1[j + 1] := minimum(v1[j] + 1, v0[j + 1] + 1, v0[j] + substitutionCost)
// copy v1 (current row) to v0 (previous row) for next iteration
swap v0 with v1
// after the last swap, the results of v1 are now in v0
return v0[n]
Sobald Sie eine Metrik definiert über Strings haben Sie eine schnelle Weise benötigen eine Liste der Hotels natürlich abzufragen. Der naive Umsetzung 1. Iterierte über alle Hotelnamen in der Datenbank würde/set 2. Berechnen Sie den Levenshtein Abstand zwischen dem gegebenen Eingang und dem Hotelname 3. den Namen auswählen, die die kleinste Editierdistanz
ergibt Obwohl dies für kleine Sets gut funktioniert, können Sie dies mit einem BK-Tree noch weiter optimieren.
Lesestoff:
Vielen Dank. Ich werde versuchen, dies umzusetzen. Aber ich beabsichtige auch eine Lösung mit neuronalen Netzen zu schaffen, da ich meine Fähigkeiten auch im maschinellen Lernen entwickeln möchte. Wenn ich das also mit neuronalen Netzen implementieren würde, was wären die Eingabemerkmale in jedem Eingang, die mir wahrscheinlich eine gute Lernkurve geben würden? –
Abgesehen davon wäre es nicht rechenintensiv, alle Hotelnamen zu durchlaufen, die jedes Mal, wenn der Benutzer einen Eintrag macht, tausende sein würden. Wenn wir ML-Parameter erhalten könnten, brauchen wir nur eine Multiplikation mit der Parametermatrix und nehmen den Sigmoid und den höchsten Index für die jeweilige Klasse. Ich bin Anfänger im Programmieren. Also kann mein Argument falsch sein. –
@Joris: Ich bin neugierig, warum Sie Pseudocode hinzufügen, wenn es so viele echte Implementierungen für GNU Octave gibt, zum Beispiel was ich oben verlinkt habe https: // sourceforge.net/p/octave/strings/ci/default/tree/inst/editdistance.m Auch das Odepkg hat Levenshtein Abstand – Andy
- 1. Endlosschleife, wenn ein Zeichen eingegeben wird
- 2. Verhindern fortfahren Eingabe in TextBox Wenn ein Zeichen eingegeben wird
- 3. Wie Benutzer zu warnen, wenn ein bestimmtes Wort eingegeben wird
- 4. Wie kann ich aufhören, wenn ein bestimmter Fall eingegeben wird?
- 5. Stoppen Python-Eingabe, wenn ein bestimmtes Zeichen eingegeben wird
- 6. Knopf bewegt sich, wenn Schrift eingegeben wird
- 7. Anzeigen Stil, wenn Passwort eingegeben wird
- 8. Ändern Eingabefarbe Rand, wenn Text eingegeben wird
- 9. Verhindern, dass ein Eingabefeld eingegeben wird
- 10. DIV wird nicht zum Inhalt erweitert, wenn ein langer Text eingegeben wird
- 11. Maskiertes Eingabefeld wird gelöscht, wenn es nicht vollständig eingegeben wird
- 12. ungültig, wenn Sonderzeichen eingegeben
- 13. ValueEventListener wird nie eingegeben
- 14. So unterdrücken Sie die Validierung, wenn nichts eingegeben wird
- 15. Während nichts eingegeben wird
- 16. Wie wird das Dropdown-Feld angezeigt, wenn im Textfeld ein Text eingegeben wird
- 17. Welcher Code wird gesucht, wenn Teiltext in ein Textfeld eingegeben wird?
- 18. App stürzt ab, wenn ein Text eingegeben wird, unerkannter Selektor wird an Instanz gesendet
- 19. Nur ein Rails3-Modell validieren, wenn ein Wert eingegeben wurde
- 20. Javascript - ein Link zu erscheinen, wenn das richtige Wort in die Eingabeaufforderung eingegeben wird
- 21. Kann ein Vorgang im Konstruktor ausgeführt werden, wenn ein Array in diese Klasse eingegeben wird
- 22. Python - Neustart einer if-Anweisung, wenn ein falscher Wert eingegeben wird
- 23. PDF.js - Password Callback Problem, wenn falsches Passwort eingegeben wird
- 24. Making M- (das Standardverhalten in Emacs, wenn "(") eingegeben wird
- 25. Logger Debug Python, wie in vorhandenen Code zu implementieren. Vorschläge :)
- 26. Monat Daten zurückgeben, wenn Woche Datum eingegeben wird
- 27. Etikett automatisch aktualisieren, wenn Inhalt in Textfeld asp.net eingegeben wird
- 28. Klartextarea mit Anweisungen auf Klick oder wenn Text eingegeben wird?
- 29. Form wechselnde Farbe, wenn Text eingegeben wird (CSS)
- 30. BMI App stürzt ab, wenn keine Nummer eingegeben wird
Mögliches Duplikat [Wie funktioniert die Google „Meinen Sie?“ Algorithmus arbeiten?] (Https://stackoverflow.com/ Fragen/307291/how-does-the-google-did-you-mean-Algorithmus-Arbeit) – m7913d
Sie implementieren ein Hotel-Reservierungssystem in GNU Octave oder MATLAB? Ich würde einen Blick auf leventhstein werfen, zum Beispiel https://octave.sourceforge.io/strings/function/editdistance.html Schlüsselwörter, die gesucht werden können, sind "unscharfe Suche" https://en.wikipedia.org/wiki/Approximate_string_matching – Andy
Ich habe vor, zuerst einen Prototyp in Octave zu implementieren. Ich möchte mich von Grund auf neu entwickeln. Ich beabsichtige, ein neuronales Netzwerk zu erstellen oder eine lineare Regression zu verwenden, um mit Datensätzen zu trainieren, so dass es die Ausgabe aus dem Test- oder Validierungssatz vorhersagen kann. Da ich neu im maschinellen Lernen bin, habe ich Schwierigkeiten, die Merkmale für das neuronale Netzwerk oder für das lineare Regressionsmodell zu wählen. –