Für ein veröffentlichtes Buch ist das ziemlich schrecklicher Code! (Du kannst alle Beispiele für das Buch hier herunterladen; die relevante Datei ist chapter4/nn.py
.)
- Kein Docstring. Was soll diese Funktion tun? Anhand ihres Namens können wir vermuten, dass sie einen der Knoten in der "versteckten Schicht" eines neuronalen Netzwerks erzeugt, aber welche Rolle spielen die
wordids
und urls
?
- Die Datenbankabfrage verwendet Zeichenersetzungen und ist daher anfällig für SQL-Injektionsangriffe (insbesondere da es sich um etwas mit der Websuche handelt, kommen die
wordids
wahrscheinlich aus einer Benutzerabfrage und können daher nicht vertrauenswürdig sein - aber vielleicht sind es IDs anstatt Wörter, also ist es in der Praxis in Ordnung, aber dennoch ein sehr schlechtes Gewohnheit).
- Es wird nicht die Ausdruckskraft der Datenbank genutzt: Wenn Sie nur bestimmen möchten, ob ein Schlüssel in der Datenbank vorhanden ist, verwenden Sie wahrscheinlich ein
SELECT EXISTS(...)
anstatt die Datenbank zu bitten, Ihnen eine Menge Datensätze zu senden, die Sie dann ignorieren werden.
- Die Funktion tut nichts, wenn bereits ein Datensatz mit
createkey
vorhanden war. Kein Fehler. Ist das korrekt? Wer kann das sagen?
- Die Gewichtung für die Wörter wird auf die Anzahl der Wörter skaliert, aber die Gewichtung für die URLs ist die Konstante
0.1
(vielleicht gibt es immer 10 URLs, aber es wäre besserer Stil, hier nach len(urls)
zu skalieren).
Ich könnte weiter und weiter machen, aber besser nicht.
Auf jeden Fall, um Ihre Frage zu beantworten, scheint es, dass diese Funktion einen Datenbankeintrag für einen Knoten in der versteckten Schicht eines neuronalen Netzwerks hinzufügt. Dieses neuronale Netzwerk hat, denke ich, Wörter in der Eingabeschicht und URLs in der Ausgabeschicht. Die Idee der Anwendung besteht darin, zu versuchen, ein neuronales Netzwerk zu trainieren, um basierend auf den Wörtern in der Abfrage gute Suchergebnisse (URLs) zu finden. Siehe die Funktion trainquery
, die die Argumente (wordids, urlids, selectedurl)
erhält. Vermutlich (da kein Docstring vorhanden ist, muss ich raten) waren wordids
die vom Benutzer gesuchten Wörter, urlids
sind die URLs, die die Suchmaschine dem Benutzer angeboten hat, und selectedurl
ist die vom Benutzer ausgewählte. Die Idee besteht darin, das neuronale Netzwerk besser darauf vorzubereiten, vorauszusagen, welche URLs Benutzer wählen werden, und diese URLs daher in zukünftigen Suchergebnissen weiter oben zu platzieren.
Die geheimnisvolle Codezeile verhindert also, dass Knoten in der versteckten Schicht mit Verknüpfungen zu mehr als drei Knoten in der Eingabeschicht erstellt werden. Im Zusammenhang mit der Suchanwendung macht das Sinn: Es gibt keinen Grund, das Netzwerk auf Anfragen zu trainieren, die zu spezialisiert sind, da diese Anfragen nicht oft genug wiederkehren, um das Training lohnenswert zu machen.
0 Stimmen
Unmöglich zu sagen, wirklich, ohne mehr über den Rest des Programms zu wissen. Wenn das Programm nicht für mehr als 3
wordid
s vorgesehen ist, scheint dies in Ordnung zu sein (persönlich würde ich wahrscheinlich eine Ausnahme werfen, aber vielleicht wird der Rückgabewert an anderer Stelle überprüft). Wenn es für eine beliebige Anzahl vonwordid
s gedacht ist, kann es ein Fehler sein. Beispielscode in Büchern enthält oft Fehler.0 Stimmen
Auf den ersten Blick sieht es aus wie eine Art primitiver Fehlerüberprüfung. Es sieht so aus, als ob die Länge von wordids 3 oder weniger betragen sollte. Wenn Sie der Funktion eine wordids-Variable mit größerer Länge übergeben, wird die Funktion nichts tun.
2 Stimmen
Es führt eine Eingabebeschränkung durch, dass die Funktion nur auf maximal einem Tripel von "Wörtern" ausgeführt werden sollte. Wahrscheinlich ist es einfacher, in diesem Fall
None
zurückzugeben, als einassert
oderraise
zu verwenden.0 Stimmen
"Die folgende Funktion erscheint auf Seite des Buches:" Sie haben die Seitenzahl vergessen, die in der Version von Safari Online (aus der gedruckten Ausgabe von August 2007, glaube ich) 77 ist.