Texte aus Datenbank analysieren

Alles rund um die Programmierung mit Qt
Antworten
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Texte aus Datenbank analysieren

Beitrag von oberschlingel »

Hallo,

ich habe folgende Aufgabe und frage mich, wie ich sie am besten bewältige:
Es besteht eine SQLITE-Datenbank mit einer Textetabelle mit ca. 80 Datensätzen. Jeder Datensatz hat eine ID und einen beliebig langen Text (ca. 200 Zeichen). In einer weiteren Tabelle stehen 60 Datensätze. Eine ID und diesmal nur ein Zeichen (ein Char - Alphabet gross + Alphabet klein + einige Sonderzeichen).
Nun muss ich aus der Textetabelle alle Texte filtern, die ein Zeichen (oder am besten gleich mehrere Zeichen) aus der anderen Tabelle am häufigsten beinhalten.

Um das ganze vielleicht leichter zu verstehen: Lösungvorschlag 1 ->

Lösungsvorschlag 1:
Eine weitere Tabelle in der Datenbank, mit den 60 Zeichen und der ID aus der Textetabelle als Spalten. Dann alle Texte einfach mit einem index (text[x]) durchlaufen, analysieren und die Anzahl der vorkommenden Zeichen in der jeweiligen Spalte speichern. Dann könnte man zur Laufzeit über eine SQL-Abfrage einfach die Tabelle nach einem Zeichen sortieren und hätte so die Id des Textes, in dem das Zeichen am häufigsten vorkommt.
Unschön: die dritte (Analyse-)Tabelle muss zu Beginn einmal generiert werden, die zwei anderen dürfen sich danach nicht mehr verändern.

Lösungvoschlag 2:
Eigentlich wie Lösungvorschlag 1, allerdings mit einer virtuellen Liste, die man zur Laufzeit füllt. Ich denke aber, so eine Analyse benötigt zu viel Zeit. Zudem wüsste ich nicht, welche Art von Liste ich verwenden sollte. Ideen?

Lösungvorschlag 3:
Das ganze mit Regular Expressions lösen. Mmmh. Da hab ich leider keine Ahnung von. Wäre super, wenn hier jemand einen kurzen Tipp geben könnte, ab das damit vielleicht ganz leicht :) zu lösen ist.

Gibt es evtl. noch andere Lösungvoschläge?


Vielen Dank für etwaige Antworten,
viele Grüße!
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Re: Texte aus Datenbank analysieren

Beitrag von Shadow »

oberschlingel hat geschrieben: [..cut..]

Lösungvorschlag 3:
Das ganze mit Regular Expressions lösen. Mmmh. Da hab ich leider keine Ahnung von. Wäre super, wenn hier jemand einen kurzen Tipp geben könnte, ab das damit vielleicht ganz leicht :) zu lösen ist.

Gibt es evtl. noch andere Lösungvoschläge?
Da kommen wir der Sache schon näher, aber:
Wie wär's einfach mit einer SQL-Abfrage?
Diese präsentiert entsprechende Sucheergebnisse entweder absteigend oder aufsteigend und Du musst entsprechende temporäre Tabelle nur noch auslesen.
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Beitrag von oberschlingel »

Danke für die Antwort, aber ich glaube Du hast mich nicht ganz richtig verstanden:

Eine SQL-Abfrage, das ist klar. Aber es geht ja um das, was ich abfragen muss. Kennst Du eine Abfrage, die sagt, wie oft ein bestimmter Buchstabe im String einer Spalte zu finden ist?
Wenn nicht, muss ich doch irgendwie eine Tabelle mit 60 Spalten erzeugen, die ich vorher fülle, indem ich die Texte mit einem Algorithmus analysiere. In jeder Spalte steht dann die Anzahl, wie oft der jeweilige Buchstabe (=Spaltename) im String vorkommt.

Am liebsten wäre mir eine schlaue "Regular Expression", mit der ich zur Laufzeit schnell die Texte analysieren könnte.
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von Shadow »

oberschlingel hat geschrieben:Danke für die Antwort, aber ich glaube Du hast mich nicht ganz richtig verstanden:

Eine SQL-Abfrage, das ist klar. Aber es geht ja um das, was ich abfragen muss. Kennst Du eine Abfrage, die sagt, wie oft ein bestimmter Buchstabe im String einer Spalte zu finden ist?
Wenn nicht, muss ich doch irgendwie eine Tabelle mit 60 Spalten erzeugen, die ich vorher fülle, indem ich die Texte mit einem Algorithmus analysiere. In jeder Spalte steht dann die Anzahl, wie oft der jeweilige Buchstabe (=Spaltename) im String vorkommt.

Am liebsten wäre mir eine schlaue "Regular Expression", mit der ich zur Laufzeit schnell die Texte analysieren könnte.
Und ob ich Dich verstanden habe - beste Lösung: SQL-Abfrage schreiben, die genau das macht und anschließend einfach nur noch die Ergebniszeilen auslesen und auswerten. Mit Regular-Expressions ist dies zwar auch möglich, aber damit würdest du den Bock zum Gärtner machen und die Vorteile einer Datenbank über den Haufen schmeißen.
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

sqlite ist maechtig um funktionen in die db zu erstellen... fast besser als mysql..

http://www.sqlite.org/capi3ref.html#sql ... function16

in php habe ich mal eine md5 funktion in diese sql db reingehauen dann konnte man mit query select from ... where md5(vars) ohne andere grosse eingriffen

aber ich denke nicht das es qt plug-in kann ....(kann sein das ich mir gross irre) ich benutze einfach die statische sqlite3 libs... so wie der qt3 sqlite-browser wo alle sqlite funktionen zugreifbar-nahe sind..
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Beitrag von oberschlingel »

Danke für die Anregung Patrik08, leider kann ich mir nicht annähernd vorstellen, wie ich mit Hilfe dieser "sqlite3_create_function"-Funktion eine Funktion in mein SQLITE integrieren soll.
Hättest Du hier vielleicht ein kurzes Beispiel parat?
Da wäre ich super dankbar!

Grüße!
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Eins von meinen wichtiges werkzeug bei php c++ oder ajax uns...
ist und bleibt :

Firefox der Browser nr1 fuers netz.. ( http://www.mozillaitalia.org/firefox/ )

2 - einmal installiert gehst du auf https://addons.mozilla.org/extensions/ um eine ahnung zu haben was eine firefox addons ist..
3 - besuch der seite http://mycroft.mozdev.org/download.html ... category=9
ist sehr lang die seite .... CTR+F suche "c++" installierst alle suchmaschinen die ueber c++ handleln koders.com ist die beste
dan nach einem neuen start von firefox hast du rechts oben ein such fester mit koders c++ .... suche "sqlite3_create_function" und voila.. 4 resultate.... mit beispiele die ersten 3 sind gut... naturich findest du auch qtnamen classen ecc. name classe qt3/4 mit massenweise beispielen...

Dass soll heissen !Nicht das ich dir keine beispiele schreiben will .. sonder
wenn man sie selber probierts und die doku gelesen hat und die beispiele
probiert hat .... kennt man die funktionsweise davon und wen bei einem beispiel was schief gehst ... kanst du dann immer noch iher fragen...
( ich bin und bleibe ein autoditakt -self lerning teorie e praxies ..) in einen
abend habe ich den source von http://sqlitebrowser.sourceforge.net/ in 4 stunden gelesen und getestet ... mit qt3 (muss einfach die $PATH aendern dan kann ich qt3 & qt4 schreiben lesen und builden) aber nun kenne ich die grenze von sqlite... bei der quelle...
Zuletzt geändert von patrik08 am 12. April 2006 15:25, insgesamt 1-mal geändert.
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Beitrag von oberschlingel »

Ok, vielen Dank.
Ich installiere jetzt die Suchmaschine, bin gespannt auf die Ergebnisse.
Wenn ich ein taugliches Beispiel finde, stelle ich es hier ab.

Danke an alle!
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

aus http://souptonuts.sourceforge.net/readm ... orial.html

in diese funktionen ist es fast wie in einer static void...
oder eben auch sqlquery

select id from table a where id > 0 limit 1 (als function)

dan in der query b

select * from table b where blobid == msignFunc

Code: Alles auswählen

void msignFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
  assert( argc==1 );
  switch( sqlite3_value_type(argv[0]) ){
    case SQLITE_INTEGER: {
      long long int iVal = sqlite3_value_int64(argv[0]);
      iVal = ( iVal > 0) ? 1: ( iVal < 0 ) ? -1: 0;
      sqlite3_result_int64(context, iVal);
      break;
    }
    case SQLITE_NULL: {
      sqlite3_result_null(context);
      break;
    }
    default: {
      double rVal = sqlite3_value_double(argv[0]);
      rVal = ( rVal > 0) ? 1: ( rVal < 0 ) ? -1: 0;
      sqlite3_result_double(context, rVal);
      break;
    }
  }
}



This function is initiated as follows:

sqlite3_create_function(db, "msign", 1, SQLITE_UTF8, NULL,
&msignFunc, NULL, NULL));

Note that "msign" is the name of the function in sqlite3. It is the name you would use in a select statement: "select msign(3);". The 1 is the number of arguments. The msign function here only takes one argument. SQLITE_UTF8 is for the text representation. Then, skipping over NULL, &msignFunc is the name of the C function. The last two values must be NULL for a simple function; again, a simple function can be used in any part of the select where clause. .....
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Beitrag von oberschlingel »

Vielen Dank patrik08!!!!
Wahnsinn, so eine Suchmaschine wie Coders habe ich schon lange gebraucht.
Eine super Erweiterung für Programmierer zum bekannten Foren durchsuchen.
Schätze, es ist schwach, dass ich das nicht schon länger kenne.
Antworten