Häufigkeit von Wörtern aus Titeln in mysql Datenbank ermitteln

TribunM

Erfahrenes Mitglied
Hallöle,

ich stehe gerade etwas auf dem Schlauch.

Ich möchte aus einer Spalte Titel mittels Abfrage die Häufigkeit der Wörter zählen ohne eben ein bestimmtes Wort anzugeben, was gezählt werden soll.

Gemeint ist das so:

Tabelle:

ID | Titel

1 | Harry Potter DVD Box
2 | Harry Potter Blueray Special Edition
3 | Avatar Blueray Directors Cut
4 | Herr der Ringe DVD Collection

Ich würde nun gerne etwas wie folgendes ermitteln:

Gesuchte Ausgabe:

Anzahl | Wort

2 | DVD
2 | Blueray
2 | Harry Potter
usw...

Abgesehen davon dass eine Abfrage oder View in diesem Sinne nicht gerade performant ist, auch wenn ich sie auf die letzten 100 IDs begrenzen würde, interesseirt es mich schon sehr, ob und wie das möglich ist. Ist im Prinzip ähnlich einer Tagsuche nur "noch" ohne Tags ;).

Mir fällt im Moment nur kein Ansatz ein, denn Match Against funktioniert soweit ich weiß nur mit der Angabe eines Wortes, was mitunter auch logisch ist. Aber gibt es eine andere Möglichkeit oder geht das nur mit Hilfe von PHP?

Über hiflreiche Tipps oder erste Lösungsansätze würde ich mich freuen.

Grüße

TribunM
 
Zuletzt bearbeitet:
Hallo,

du könntest eine Stored Procedure schreiben, welche den Titel zerlegt und jedes Wort in eine neue temporäre Tabelle einträgt. Aus dieser Tabelle ermittelst du dann die Häufigkeiten. Eine direktere Möglichkeit sehe ich nicht, da es allgemein schwierig ist, in einer Abfrage aus einer Tabellenzeile mehrere zu machen.

Grüße,
Matthias
 
Wenn Performance Priorität hat, kommst Du nicht dran vorbei, eine weitere Tabelle zu erstellen. Weitere Möglichkeit wäre, per Cronjob zB einmal am Tag diese Liste aus den Titeln zu erstellen/aktualisieren. Gespeichert wird aber kein Linkverweis in der Tabelle, sondern das passiert beim Anklicken des Tags wiederum ontheFly.

mfg chmee
 
Ja mit per Cron habe ich mir auch schon überlegt und das dann per PHP zu machen, aber mich interessiert eben hauptsächlich die mysql Variante. Mit der Stored Procedure probiere ich dann mal aus.

Mit Group Concat() kann ich ja schon einmal die Titel in einen String packen. Dann sieht das Ganze so aus:
Harry Potter DVD Box, Harry Potter Blueray Special Edition, Avatar Blueray Directors Cut, Herr der Ringe DVD Collection

Mit php kann ich die Wörter auch zählen, aber mit SQL fällt mir immer noch nicht die richtige Variante ein. Am performantesten wäre es eh, wenn ich noch Parameter wie word_length oder wordsperrlisten mit einbauen könnte, aber ich gebe zu, dass ich im Mom noch nicht die Lösung gefunden habe dafür. Der Ansatz mit Match Against scheint ohne Suchwort wohl nicht zu klappen.
 
Zuletzt bearbeitet:
Das ganze erschwert sich dadurch, dass 'Harry Potter' als 2 Wörter erkennt und gezählt wird. Harry und Potter. Ausser du hast eine gute Logik, die herausfindet wann Wörter zusammengehören und wann nicht. Ich habe keine solche Logik
 
Ne ich habe das zwar bedacht aber noch keine richtige Lösung dafür. Man könnte aber noch zusätzlich Wortpaare auslesen lassen. Das ist natürlich noch komplizierter und würde wie ein Crawler dann funktionieren. Ich denke das mysql das doch nicht alleine leisten kann und php per cron im jedem Fall hinzugezogen werden muss.

Bisher fehlt mir aber noch der richtige Ansatz.
 
Um nur die Wörter mit PHP zu zählen könntest du etw so vorgehen
PHP:
<?php 
//Simulation der Rückgabewerte aus der Tabelle
$rows = array(
    array('id' => 1, 'titel' => 'Harry Potter DVD Box'),
    array('id' => 2, 'titel' => 'Harry Potter Blueray Special Edition'),
    array('id' => 3, 'titel' => 'Avatar Blueray Directors Cut'),
    array('id' => 4, 'titel' => 'Herr der Ringe DVD Collection')
);

//Der eigentliche Code
$words = array();
foreach($rows as $row){
    //Alle Wörter des Feldes titel einem Array hinzufügen
    $words = array_merge($words, str_word_count($row['titel'], 1));
}
//Die Wörter zählen
$words = array_count_values($words);

print_r($words);
?>

Ausgabe:
Code:
Array
(
    [Harry] => 2
    [Potter] => 2
    [DVD] => 2
    [Box] => 1
    [Blueray] => 2
    [Special] => 1
    [Edition] => 1
    [Avatar] => 1
    [Directors] => 1
    [Cut] => 1
    [Herr] => 1
    [der] => 1
    [Ringe] => 1
    [Collection] => 1
)
 
ja genau so etwas habe ich in php auch gebastelt, wobei ich mit implode gearbeitet habe, ist aber egal ;). Aber ich suche noch nach einer Möglichkeit wo ich einen Wortlängenfilter da reinbekomme. Weil Wörter mit zwei oder weniger Buchstaben machen keinen Sinn zu zählen.
 
dazu gibts doch den array_filter()
PHP:
$words = array_filter($words, create_function('$word', 'return strlen($word) > 3;'));
$words = array_count_values($words);
 
Schick doch in der foreach-Schleife erstmal ein Regex replace über den Titel.
PHP:
$titel=preg_replace("#\s[\S]{1,2}\s#"," ",$row['titel']);
(hingekliert, bitte überprüfen und verbessern, wenn nötig..)

mfg chmee

p.s.: Ahh, yaslaw mit einer "besseren" Formulierung..
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück