PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (PHP) - Crawler optimieren?



Nightmare
15.02.2016, 15:36
Ich brauchen mal eine Idee von euch. Ich betreibe eine Seite, wo ich im Hintergrund einen Infocrawler laufen lasse. Nun kommt es vor, dass ich Infos zu einem Artikel brauche, wo sich Namen etwas unterscheiden.
Beispiel, Artikel bei mir: Russisches Mädchen, Thriller von B.C. Schiller
Beispiel bei Amazon: Russisches Mädchen - Thriller von B.C. Schiller
Wie man sieht, ist es nur ein kleiner Unterschied, aber dieser kleine Unterschied, bewirkt, dass keine Infos dazu gefunden werden.
Noch ein Beispiel, was aber auch genau zeigt, welche Probleme manchmal kleine Dinge verursachen können
Titel bei mir: Die honigsüssen Hände von Marion Johanning
Titel bei Amazon: Die honigsüßen Hände von Marion Johanning

Wie kann ich mein php Script optimieren lassen, damit auch die Infos trotzdem gefunden werden?

tasDev
15.02.2016, 15:52
Wie bzw. mit welchen Funktionen führst du denn die Suche durch?


Edit://
Bspw. @ SQL Acc2002/XP - Suchfunktion, ss und ß gleichsetzen - MS-Office-Forum (http://www.ms-office-forum.net/forum/showthread.php?t=260577)

sp1r1t
15.02.2016, 16:48
es gibt sicherlich irgendwelche "match" Funktionen die den String vergleichen.
Beispiel: similar_text("String1", "string 2", $percent);
wenn übereinstimmung über 50% liegt, kann man das Ergebnis sicher nehmen.

Zur not eben ein paar sonderfälle deklarieren wie "-", "ß" etc. ersetzen / entfernen und denn vergleichen.

jbs
15.02.2016, 16:48
Folgendes liegt noch aufm Speiseplan: Umlaute durch ae ue oe und ß durch ss ersetzen und die Anfrage erneut durchführen. Problem ist halt, dass eine Suche mittels Wildcards nicht möglich ist, sonst könnte man das einfach weglassen. Es wär sonst auch noch möglich, mal zu versuchen, die Umlaute und Sonderzeichen durch Leerzeichen zu ersetzen.

syrius
15.02.2016, 20:40
Wie wärs denn einfach mit "if / else" ?? unschön, aber oftmals nötig!

Cappa
15.02.2016, 22:11
Ich würde alle Sonderfälle rausstrippen.

Also:


Russisches Mädchen - Thriller von B.C. Schiller wird zu Lowercase("RuischesMdchenThrillervonBCSchiller")
und
Russisches Mädchen, Thriller von B.C. Schiller wird zu lowercase("RuischesMdchenThrillervonBCSchiller")

Analog: DiehonigsenHndevonMarionJohanning

Das ist leicht zu bewerkstelligen und nicht ressourcenintensiv.

Z.B.: string "filtern": nur buchstaben - PHP Forum (http://www.selfphp.de/forum/showthread.php?t=23941)

sp1r1t
15.02.2016, 22:59
Cappa hat n guten Lösungsweg! ;)

Cappa
17.02.2016, 20:52
Tu doch nicht so überrascht! :emoji51:

maz
18.02.2016, 01:59
An sich ist der Lösungsansatz ja nicht so verkehrt, das Prblem dürfte aber sein, dass der entsprechende Amazon Artikel gar nicht gefunden wird. (So verstehe ich zumindest das Ausgangsproblem). Und dazu würd ich einfach die Google API nutzen, da Google sehr schlaue logarithmen für genau dieses Problem im Einsatz hat und vermutlich niemand auch nur was ähnlich gutes selbst schreiben kann.

Der Code würde in etwa so aussehen:

<?php

$search = 'Russisches Mädchen, Thriller von B.C. Schiller';
$sites = 'amazon.de';
$url = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=site:".$sites."%20".urlencode($search);

$body = file_get_contents($url);
$json = json_decode($body);

for($x=0;$x<count($json->responseData->results);$x++){
echo "<b>Result ".($x+1)."</b>";
echo "<br>URL: ";
echo $json->responseData->results[$x]->url;
echo "<br>Title: ";
echo $json->responseData->results[$x]->title;
echo "<br><br>";
}
?>


Damit findest du bei Amazon das gewünschte sicher schon mal. Dann musst du nur noch den Amazon Titel auslesen
Danach nimmst du entweder similar_text() oder was ich besser finde in deinem Fall levenshtein() um den Titel mit deinem abzugleichen. levenshtein() gibt dir die Anzahl Zeichen die anders sind als Int zurück. Dann liest du noch die geammtlänge des Titels aus und kombinierst das ganze schlau, zB dass erst ab einer Länge von 5 ein Fehler auftreten darf und ab einer von 10, 2 Fehler oder irgend so was. Deine beiden Beispiele liefern zB beide eine 2 als Rückgabewert. Ach ja und wie bereits vorgeschlagen das ganze noch mit einem strtolower() verfeinern.

EDIT: Evt ist der Google Ansatz völlig unnötig, vermutlich machst du die Suche ja schon über die Amazon API und die ist kaum schlechter.