php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.06.2005, 08:41  
Gast
 
Beiträge: n/a
Standard [Erledigt] Befehl um Häufigkeit eines Wortes in der Tabelle zubestimmen

Hallo Leute,

ich frage mich grade ob es eine Funktion oder ein Query gibt, mit den man die Häufigkeit von Wörtern zählen kann. Also wichtig ist: mir ist das Wort vorher nicht bekannt. Wichtig ist dabei, dass es um einen hohen Datenumsatz geht.

Wenn jemand ne IDEE hat, schreiben

Danke

emu
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.06.2005, 08:54  
Gast
 
Beiträge: n/a
Standard

meinst du so etwas?:
Code:
SELECT
   name,
   COUNT(name) AS anzahl
FROM
   tabelle
GROUP BY
   name
... zählt die Anzahl der verschiedenen Namen in der Spalte `name`

mfG
dilemma
  Mit Zitat antworten
Alt 28.06.2005, 09:39  
Gast
 
Beiträge: n/a
Standard

für den ersten ansatz ist das nicht schlecht danke erstmal. Das Problem ist, dass in dem Titel auch die Wörter gezählt werden sollen. Und nicht das vorkommen des Titel´s weil der untescheidet sich im allgemeinen doch sehr stark Aber erstmal danke für den Ansatz..
Für weitere Lösungsansätze bin ich offen..

MfG

emu
  Mit Zitat antworten
Alt 28.06.2005, 10:10  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

das geht so nicht performant. eine suche mit LIKE etc. und das dynamische berechnen der term-frequenz ist vom aufwand her fast untragbar.

guck dir mal TF / IDF an - im prinzip musst du eine neue tabelle erzeugen, in dem jedes wort, die dokumentID (also hier die zeilenID in der originaltabelle) und seine häufigkeit reinkommt. diese tabelle aktualisierst du immer mit REPLACE INTO (damit hast du die update-routinen auch drin) - und machst das im prinzip so, dass mit jedem INSERT in die original-tabelle gleichzeitig alle wörter am leerzeichen aufgesplittet werden und dann in die wort-tabelle eingefügt werden.

nicht vergessen, stoppwörter vorher zu killen und groß-kleinschreibung zu eliminieren, und beim löschen aus der originaltabelle die einträge in der tf-idf-tabelle auch zu eliminieren.
axo ist offline   Mit Zitat antworten
Alt 28.06.2005, 11:08  
Gast
 
Beiträge: n/a
Standard

Du hast also eine Spalte `titel`
mit einem oder mehreren Worten,
die die nicht bekannt sind,
und willst zählen,
wie oft die verschiedenen (unbekannte) Worte vorkommen.

Spontan würde ich behaupten, daß das mit einer MYSQL-DB-Abfrage nicht machbar ist.

Quick & dirty hätte ich folgende Idee:

Code:
$query =
"
SELECT
   titel
FROM
   tabelle
";

$resultID = mysql_query($query);

$pieces = array();
$array  = array();

while ($row = mysql_fetch_assoc($resultID))
{
   unset($pieces);
   $pieces = explode (" ", $row['titel']);

   foreach ($pieces as $value)
   {
     $array[] = $value;
   }
}

print_r(array_count_values ($array));
Über 'performance' müssen wir uns dabei nicht unterhalten.

mfG
dilemma
  Mit Zitat antworten
Alt 29.06.2005, 11:09  
Gast
 
Beiträge: n/a
Standard

ja danke für die Mühe, aber die Frage war auch nur auf MySQL bezogen. Das andere ist auch für mich kein Problem.

Aber trotzdem vielen Dank euch beiden

Daniel
  Mit Zitat antworten
Alt 25.02.2010, 19:21  
Neuer Benutzer
 
Registriert seit: 25.02.2010
Beiträge: 3
PHP-Kenntnisse:
Fortgeschritten
Froschkoenig84 befindet sich auf einem aufstrebenden Ast
Standard Anzahl der Vorkommen eines Suchbegriffs in einer SQL-Zelle

Nun ja... ein Vorschlag, allerdings nicht sonderlich Schick, wenn du escapede Sonderzeichen verwendest...

Du hast ein gefülltes Feld in der DB. Dann brauchst du eine Wortliste, also Wörter, nach denen du suchst.

Das Vorkommen eines Wortes pro Zelle zu prüfen ist simpel. Wenn du aber wissen willst, wie oft dieses eine Wort vorkommt, musst du es durch "" (nichts) ersetzen. Wenn du zuvor die Zeichen gezählt hast und danach auch bekommst eine Differenz raus. Diese Differenz teilst du durch die Anzahl der Zeichen deines Suchwortes und schon weißt du, wieoft dieses Wort in der Tabelle stand.

Beispiel:

Text in der Zelle:
"Ich fahre kein Auto, weil mir ein Auto zu teuer ist. Ich finde aber das ein oder andere Auto sehr schön!" (84 Zeichen)

Ersetze "Auto" durch "":
"Ich fahre kein , weil mir ein zu teuer ist. Ich finde aber das ein oder andere sehr schön!" (72 Zeichen)

84 - 72 = 12 Zeichen (Unterschied)

12 / 4 (Länge des Wortes "Auto") = 3 (maliges Vorkommen)

Am Ende kannst du einen Query bauen, der dir tatsächlich 3 ausgibt. Jedoch alle Wörter ohne Wortliste zu zählen, ... das geht nicht, da SQL keine Möglichkeit bietet, echte Splits zu erzeugen. Du müsstest als Seperator ja nicht nur das Leerzeichen, sondern auch Komma+Leerzeichen und sonstige Satzzeichen, Anführungszeichen usw... beachten.
Froschkoenig84 ist offline   Mit Zitat antworten
Alt 25.02.2010, 19:58  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

5 Jahre alter Thread
.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 01.03.2010, 16:23  
Neuer Benutzer
 
Registriert seit: 25.02.2010
Beiträge: 3
PHP-Kenntnisse:
Fortgeschritten
Froschkoenig84 befindet sich auf einem aufstrebenden Ast
Standard

Ja ist mir schon klar, aber irgendwie liest man ähnliche Fragen sooft im Netz in irgendwelchen Foren, da ist es doch auch mal klever eine funktionstüchtige Antwort zu setzen.

Mal schauen, was sich als Nachfolger von MySQL herausstellt, wenn Oracle MySQL ab damnächst nicht mehr weiter entwickeln will.

Alle setzen auf PostGreSQL, ich wäre aber für ein simples ISAM-SQL-Modell mit der Funktion "reguläre Ausdrücke" in die SELECTs einzubauen. Hab vor einigen Jahren mal so etwas entwickelt, hatte aber keine Zeit und auch keinen Anspurn, das weiter zu entwickeln.
Froschkoenig84 ist offline   Mit Zitat antworten
Alt 09.06.2011, 15:43  
Neuer Benutzer
 
Registriert seit: 09.06.2011
Beiträge: 1
PHP-Kenntnisse:
Fortgeschritten
felix4710 befindet sich auf einem aufstrebenden Ast
Standard

also erstmal alles Gute an den Thread zum bevorstehenden 6. Geburtstag

Die Lösung von Froschkönig84 ist schon nicht schlecht, macht aber unter bestimmten MySQL-Versionen Probleme (ich nenne es mal MySQL-Replace-Problem für die suchmaschine ).

Bsp. MySQL-Version 5.0.45:
bei jedem Datensatz wird mit dem modifizierten Text aus dem Vergleich mit dem vorhergehenden Datensatz gearbeitet

Beispiel:

Code:
mysql> SET @heuhaufen = "Ich fahre kein Auto, weil mir ein Auto zu teuer ist. Ich finde aber das ein oder andere Auto sehr schön!";
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT suchwort,
    ->        REPLACE(@heuhaufen,suchwort, "") as HeuNeu,
    ->        CHAR_LENGTH(REPLACE(@heuhaufen,suchwort, "")) as Anzahl
    ->   FROM suchworttable;
+----------+----------------------------------------------------------------------------------------------+--------+
| suchwort | HeuNeu                                                                                       | Anzahl |
+----------+----------------------------------------------------------------------------------------------+--------+
| Auto     | Ich fahre kein , weil mir ein  zu teuer ist. Ich finde aber das ein oder andere  sehr schön! |     92 |
| Bus      | Ich fahre kein , weil mir ein  zu teuer ist. Ich finde aber das ein oder andere  sehr schön! |     92 |
| Zug      | Ich fahre kein , weil mir ein  zu teuer ist. Ich finde aber das ein oder andere  sehr schön! |     92 |
+----------+----------------------------------------------------------------------------------------------+--------+
3 rows in set (0.00 sec)
oder für die Busfahrer:
Code:
mysql> SET @heuhaufen = "Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön!";
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT suchwort,
    ->        REPLACE(@heuhaufen,suchwort, "") as HeuNeu,
    ->        CHAR_LENGTH(REPLACE(@heuhaufen,suchwort, "")) as Anzahl
    ->   FROM suchworttable;
+----------+--------------------------------------------------------------------------------------------------------+--------+
| suchwort | HeuNeu                                                                                                 | Anzahl |
+----------+--------------------------------------------------------------------------------------------------------+--------+
| Auto     | Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön! |    102 |
| Bus      | Ich fahre kein , weil mir ein  zu teuer ist. Ich finde aber den ein oder anderen  sehr schön!          |     93 |
| Zug      | Ich fahre kein , weil mir ein  zu teuer ist. Ich finde aber den ein oder anderen  sehr schön!          |     93 |
+----------+--------------------------------------------------------------------------------------------------------+--------+
3 rows in set (0.00 sec)
Gleiches Passiert, wenn man den Text direkt in das Query schreibt, anstatt die MySQL-Variable damit zu belegen!

Eine Lösung für dieses Problem währe, den Text direkt im Query der Variablen zuzuweisen:
Code:
mysql> SELECT (@heuhaufen := "Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön!") AS Heuhaufen,
    ->        suchwort,
    ->        REPLACE(@heuhaufen,suchwort, "") AS HeuNeu,
    ->        CHAR_LENGTH(REPLACE(@heuhaufen,suchwort, "")) AS Anzahl
    ->   FROM suchworttable;
+--------------------------------------------------------------------------------------------------------+----------+--------------------------------------------------------------------------------------------------------+--------+
| Heuhaufen                                                                                              | suchwort | HeuNeu                                                                                                 | Anzahl |
+--------------------------------------------------------------------------------------------------------+----------+--------------------------------------------------------------------------------------------------------+--------+
| Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön! | Auto     | Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön! |    102 |
| Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön! | Bus      | Ich fahre kein , weil mir ein  zu teuer ist. Ich finde aber den ein oder anderen  sehr schön!          |     93 |
| Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön! | Zug      | Ich fahre kein Bus, weil mir ein Bus zu teuer ist. Ich finde aber den ein oder anderen Bus sehr schön! |    102 |
+--------------------------------------------------------------------------------------------------------+----------+--------------------------------------------------------------------------------------------------------+--------+
3 rows in set (0.02 sec)
oder auf eine aktuelle MySQL-Version umzusteigen!

Kurrioser weise tritt der Fehler im PHPMyAdmin nicht auf, nur im CLI und per PHP
In MySQL 5.0.84 tritt der Fehler nicht mehr auf - ab welcher Version er behoben wurde weiß ich allerdings nicht!

So, nun darf der Thread in Ruhe weiterruhen
felix4710 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zeilenanzahl einer tabelle mit WHERE aber ohne schleife? sovereign Datenbanken 13 17.04.2006 20:34
[Erledigt] Problem mit dem Füllen einer Tabelle über Formular PHP Tipps 2006 18 10.01.2006 12:51
Problem mit Anzeige einer Tabelle mit dem Firefox? HTML, Usability und Barrierefreiheit 8 28.11.2005 15:08
[Erledigt] Tabelle aktualisieren Datenbanken 3 23.11.2005 09:54
[Erledigt] Problem mit mySQL Datenbanken 7 27.09.2005 12:06
[Erledigt] mysql abfrage über 4 Tabelle - bis 3 geht, bei der 4. habert Datenbanken 2 08.09.2005 11:59
tabelle in tabelle ohne aussenrand noskule HTML, Usability und Barrierefreiheit 6 25.08.2005 14:17
Warning: filesize(): SAFE MODE Restriction in effect. nicobischof PHP Tipps 2005-2 9 17.08.2005 19:05
Tabelle umbennen per befehl möglich ??? PHP Tipps 2005 8 16.01.2005 15:26
Tabelle in Tabelle ausrichten HTML, Usability und Barrierefreiheit 7 03.01.2005 14:32
PHP Befehl zersprengt die ganze Tabelle. Why??? PHP Tipps 2004 4 23.09.2004 12:56
Sortieren anhand einer zweiten Tabelle PHP Tipps 2004 6 20.09.2004 09:03
HILFE: Column count doesn't match value count at row 1 Datenbanken 17 12.06.2004 16:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql häufigkeit zählen, mysql häufigkeit, mysql häufigkeit zählen, wörter häufigkeit zählen, php häufigkeit wörter, sql häufigkeit, mysql suchen zählen und sortieren, php häufigkeit eines wortes, http://www.php.de/datenbanken/25592-erledigt-befehl-um-haeufigkeit-eines-wortes-der-tabelle-zubestimmen.html, häufigkeit mysql, mysql wörter zählen, mysql anzahl vorkommen, sql befehl häufigkeit, mysql vorkommen zählen, mysql häufigkeiten zählen, häufigkeit zählen sql, häufigkeit der wörter zählen, php mysql häufigkeit, sql abfrge zählenhäufigkeit, mysql häufigkeit ermitteln

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:32 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.