Helpdesk
Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung
weitere Rubriken
PhilosophieTräumeOrteEsoterikLiteraturAstronomieHelpdeskGruppenGamingFilmeMusikClashVerbesserungenAllmysteryEnglish
Diskussions-Übersichten
BesuchtTeilgenommenAlleNeueGeschlossenLesenswertSchlüsselwörter
Schiebe oft benutzte Tabs in die Navigationsleiste (zurücksetzen).

Programmieren: Hilfe & Austausch

920 Beiträge ▪ Schlüsselwörter: Programm, Code, Html ▪ Abonnieren: Feed E-Mail
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

24.01.2013 um 16:52
hurz ich habe das output buffering in php ab geschaltet und trotzdem kommt erstmal nix. ich vermute das macht der browser. @acc

egal, ich schaff das schon irgendwie mit dem query


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

27.01.2013 um 09:17
Das Telefonnummern-Problem


Hat jemand eine Idee, wie ich am schlausten raus finden kann, ob Telefonnummern welche in der unten gezeigten Form vor liegen, ein und die selbe Nummer sind, nur anders formatiert?


+44-582-476923
+44-582-476-923
+44 582476923
+44 582-476-923
+44 582 476 923
44-582476923
+44 0582 476 923


melden

Programmieren: Hilfe & Austausch

27.01.2013 um 13:03
@AnGSt

du eliminierst mit einem lexikalischem Scanner die Sonderzeichen, dann kannst du vergleichen.

btw. +44... und 44... sind NICHT die gleichen Telefonnummern. das + steht für 00


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

27.01.2013 um 18:29
@interpreter

In dem Fall wie oben sind alle nummern die selbe, es fehlt nur einmal das + Zeichen. sowas kann in meinem Datenbestand durchaus vor kommen. Und wenn ich ermittelt habe ob die nummern identisch sind, dann würde ich jede Nummer gern in ein einheitliches Format bringen: +44-582-476923 zB. Also ein +, dann die Landeskennung, dann die Ortsvorwahl ohne führende Null und dann den Rest der Ziffern zusammen.


1x zitiertmelden

Programmieren: Hilfe & Austausch

27.01.2013 um 18:36
@AnGSt
Zitat von AnGStAnGSt schrieb:In dem Fall wie oben sind alle nummern die selbe
Aehm nein.
Das + ist wichtig wie @interpreter sagt.

Und bei der letzten Nummer hat du eine "0" vor der Ortsvorwahl. Das ist vermutlich überhaupt keine gültige Nummer. Wenn das in deinem Datenbestand vorkommt musst du solche Nullen eliminieren.


melden

Programmieren: Hilfe & Austausch

27.01.2013 um 19:33
@AnGSt
Sind die Nummern-Typen alle gleich oder hast du auch andere Nummern-Typen in der Datenbank?
Evtl. könntest du eine Regex schreiben, die überprüft, ob eine Telefonnummer Festnetz oder Handy ist und ob sie eine gültige Nummer ist.
Danach, um alle Nummern des selben Types Einheitlich zu Formatieren würde ich einen Parser entwickeln, der das für dich übernimmt.
Erstelle von der DB eine Sicherung, damit du später durch Stichproben sehen kannst ob die Formatierungen stimmen.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

27.01.2013 um 19:37
es sind alles festnetznummern. ich habe schon ne liste mit den landeskennungen erhalten, falls nützlich. die nummern sind mal so mal so ein gegeben. @Repulsor


melden

Programmieren: Hilfe & Austausch

27.01.2013 um 20:30
@AnGSt

nutz pcre um alle zahlen rauszusuchen... die müssten mit der richtigen funktion dann in einem Array sein... dann nutzt du join()


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

27.01.2013 um 20:44
@interpreter

Danke, scheint eine gut Idee zu sein, ich weiß was pcre und join ist aber die genaue Vorgehensweise ist mir noch nicht klar. Was tun?


melden

Programmieren: Hilfe & Austausch

27.01.2013 um 20:48
@AnGSt

es gibt doch diese funktion in pcre die jedes auftauchen des ausdruckes in ein array füllt.

du verwendest einen Ausdruck der nur Zahlen akzeptiert, dann erhältst du ein Array wie

[44,753,456,777,99] oder so

join() verwenden und du hast die nummer komplett ohne formatierung.

dann kannst du sie problemlos miteinander vergleichen.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

27.01.2013 um 21:14
@interpreter

Kommt das aufs gleiche heraus, wenn ich mit preg_replace alles außer Ziffern entferne? Oder sprichst du von etwas ganz anderem?


melden

Programmieren: Hilfe & Austausch

27.01.2013 um 21:18
@AnGSt

das ginge auch.


melden

Programmieren: Hilfe & Austausch

27.01.2013 um 21:20
Weiß jemand, wo man alle Kursverlaufsdaten des letztens Jahres finden kann?
Ich bräuchte einige Messdaten aus der Börse. Was ich also brauche sind die Index-Werte (Täglich oder wenigstens Wöchentlich), egal welche, NASDAQ wäre zwar gut aber nicht notwendig.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

02.02.2013 um 11:49
hoho, neues Problem:

PHP


Ich habe ein array:

$arr = array( array('Name' => 'Hans', 'ID' => 1), array('Name' => 'Peter', 'ID' => 2), array('Name' => 'Ivo', 'ID' => 3), array('Name' => 'Ptr', 'ID' => 4), array('Name' => Adam', 'ID' => 5), array('Name' => 'Hansi', 'ID' => 6), array('Name' => 'Thomas', 'ID' => 7), array('Name' => 'Hanns', 'ID' => 8), array('Name' => 'Heinz', 'ID' => 9) )

Ich möchte alle Namen, die nicht gleich, aber ähnlich (!) sind in ein zweites Array haben, das so aus sehen soll:

array("Hans", "Hanns", "Hansi", "Peter", "Ptr", ...)

Wie könnte ich das machen?

danke


ps: Zur Errechnung der Ähnlichkeit möchte ich levenshtein() == 1 nutzen. Oder auch später was ähnliches, was mir das beste Ergebnis bringt, das sehe ich dann noch.


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

02.02.2013 um 13:53
hab was gefunden:

function get_similar_names ($arr,&$erg) { for($i = 0; $i < count($arr) - 1; $i++){ for($j = $i+1; $j < count($arr); $j++){ if(levenshtein($arr[$i]['nick'], $arr[$j]['nick']) == 1){ $erg[] = $arr[$i]['nick']; $erg[] = $arr[$j]['nick']; } } } $erg = array_unique($erg); return $erg; }


melden

Programmieren: Hilfe & Austausch

02.02.2013 um 14:13
@AnGSt
Ich seh das Problem das dabei aber jeder Name der irgend einen ähnlichen Namen irgend wo hat in dem Array auftaucht. Dabei hat "Hansi" mit "Peter" eigentlich nichts zu tun. Wenn du Pecht hast hat jeder Name in der Ursprungsliste irgend wo einen passenden "Nachbarn". Und alles was du bekommst ist eine Liste mit den ganzen Namen. Aber die hast du doch eigentlich schon.

Das Ergebnis sollte also ein 2D Array sein dessen 1. Spalte das "Basiswort" sein, also "Hans" oder "Peter". In der 2. Spalte dann ein Array mit den passenden anderen Worten. Also "Hanns", "Hansi" usw.

Mit print_r könnte sowas wie folgt aussehen:
Array ( [0] => Array [name] => Hans [werte] => Array ( [0] => Hannsi [1] => Hansi [2] => Heinz ) [1] => Array [name] => Peter [werte] => Array ( [0] => Ptr ) )

oder so ähnlich.


Deine Routine get_similar_names() musst du dazu nur so ändern das er sich dabei merkt ob ein Wort schon irgend wann mal als "positiv" getestet wurde. Sonst kriegst du einen unnötigen Eintrag mit
{"Hannsi", {"Hansi", "Heinz"}}

Kommt aber natürlich drauf an was du damit machen willst.


melden

Programmieren: Hilfe & Austausch

02.02.2013 um 15:34
@AnGSt
Wenn man also die Distanz beim Levenshtein gut (d. h. so gering wie möglich) wählt, sind die Fehler-Matches gering.

Vielleicht wäre der Needleman-Wunsch-Algorithmus auch nicht schlecht. ;)

Aber ist das nicht zuviel für das was du da machst?^^


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

02.02.2013 um 19:44
@zodiac68

Das mit den Nachbarn ist nicht so übel. Ich habe es getestet. Es bringt sogar noch hier und da einige mehr Treffer. Ich verstehe was Du meinst. Allerdings nicht, wie ich den Basisnamen aus wählen soll. Es sind übrigens 4962 namen und mit meiner funktion kommen da ca 1150 ähnliche raus. Ist das zu viel? Basisname wie wählen?


@Repulsor

Es ist ein Konverter der aus viel Text eine Datenbank macht. Tippfehler müssen so weit möglich automatisch erkannt werden. Dazu lege ich eine Liste mit ähnlichen an...


melden

Programmieren: Hilfe & Austausch

02.02.2013 um 20:05
@AnGSt
Der Basisname, oder Startname oder so, ist der Name den deine äußere Schleife liefert. Also gilt:
$basisname = $arr[$i]['nick'];

wenn "if(levenshtein(...) == 1) " liefert musst du etwas wie " $arr[$j]['treffer'] = 'ok';" setzen. Damit markierst du die Zeile, das der entsprechende Name schon mal gefunden wurde. Jetzt noch vor jedem Schleifendurchlauf das überprüfen, das wars. Das Rohgrüst wäre also:

function get_similar_names ($arr,&$erg) { for($i = 0; $i < count($arr) - 1; $i++){ if ($arr[$i]['treffer'] != 'ok') { $basisname = $arr[$i]['nick']; $trefferarray = {}; for($j = $i+1; $j < count($arr); $j++){ if ( $arr[$j]['treffer'] != 'ok' ){ if(levenshtein($arr[$i]['nick'], $arr[$j]['nick']) == 1){ $arr[$j]['treffer'] = 'ok'; // Ergebnisarray zusammenbauen $trefferarray[] = $arr[$j]['nick']; } // if(levenshtein(...) } // if ( $arr[$j]['treffer'] != 'ok' ) } // for($j = $i+1; $j < count($arr); $j++) if ( count($trefferarray) > 0 ] { // es gibt was einzutragen $erg[] = $basisname; $erg[] = $trefferarray; } } // if ($arr[$i]['treffer'] != 'ok') } // for($i = 0; $i < count($arr) - 1; $i++){ $erg = array_unique($erg); // ist vermutlich unnötig return $erg; }
Oder so ähnlich. Habs jetzt nicht getestet. Aber die Idee ist klar?

Ob das viel ist kann ich nicht sagen, da hab ich keinen Vergleich.
Ok, du machst 'ne DB mit möglichen Tippfehlern. Und dann?


melden
AnGSt ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Programmieren: Hilfe & Austausch

02.02.2013 um 23:27
@zodiac68

Sofern ich das jetzt noch dank Müdigkeit sagen kann, ist es so dass die Namen aus Texten stammen und dabei müssen unterschiedliche Schreibweisen zu einer Person zusammen geführt werden. Das soll aber nicht automagisch passieren, weil das zu unsicher ist. Der Mensch bekommt die Liste mit ähnlichen Namen gezeigt und kann diejenigen welche er will schon im Text selber suchen und ersetzen. Personen mit gleichem Namen gibt es zwar auch, das ist aber selten und man kann später in der DB auch wieder Leute splitten...


melden