Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8836[/thread]

wortgruppen vergleichen



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Franz
 2007-03-13 00:21
#74995 #74995
User since
2006-07-12
31 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich habe Datensätze in Tabellen

Hier z.B. zwei

x: a b c d
y: b d e f g

nun will ich die elemente von x mit denen aller anderen datensätze vergleichen. wenn zwei elemente in einem anderen datensatz gefunden werden ist dies ein treffer und soll gespeichert werden.

hat evtl. jemand eine idee wie man das möglichst effizient lösen kann? die elemente sind worte.

ich würde jetzt wohl für jedes mögliche element-paar sql abfragen duchführen vermute aber dass es für solche fragestellungen besser geeignetere algorithmen gibt.




idt, text
1, x
2, y

idw, wort, idt
1, a, 1
2, b, 1
3, c, 1
4, d, 1
5, b, 2
6, d, 2
7, e, 2
8, f, 2
9, g, 2
renee
 2007-03-13 10:19
#74996 #74996
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kannst Du vielleicht auch kurz skizzieren, was bei Deinem Beispiel als Ergebnis rauskommen soll?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pktm
 2007-03-13 14:23
#74997 #74997
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Es gibt da diese IN(@LISTE) - Syntax (oder ähnlich), eventuell kannst du damit was anfangen. Du könntest für jedes Element-Paar aus Tabelle1 nachsehen, ob es in der Liste aus allen Werten in Tabelle2 vorkommt. Allerdings dürfte das absolut unperformant sein. Bestimmt hat noch jemand bessere Ideen :)
http://www.intergastro-service.de (mein erstes CMS :) )
Franz
 2007-03-13 22:43
#74998 #74998
User since
2006-07-12
31 Artikel
BenutzerIn
[default_avatar]
mein Beispiel ist wirklich etwas schwer verständlich

ich suche mit allen elementen von x ob genau zwei in den elementen von y (und na klar wären da noch viele weitere zu prüfen). wenn es da einen treffer gibt sehe ich dass x und y in einer beziehung zueinander stehen

ich muss also paare bilden und abfragen

hat y elemente
a+b oder a+c oder a+d oder b+c oder b+d oder c+d

die elemente sind worte
die anzahl variiert\n\n

<!--EDIT|Franz|1173818652-->
pktm
 2007-03-14 02:00
#74999 #74999
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja da gebe ich dir voll undganz recht. Das ist unverständlich :p

Du hast die Menge A: qw(wort1 wort2 wort3)
Und die Menge B: qw(poi uzt ztr)

Und du möchtest jetzt
a) wissen ob zwei Elemente von A in der Menge B vorkommen, also ob z.B. wort1 und wort2, oder wort1 und wort3 oder wort2 und wort3 in B vorkommen, oder
b) wort1 zweimal in B vorkommt.

Ich tippe momentan auf a), und dafür kannst du die IN() - Syntax in SQL verwenden. Du guckst, ob eines der Elemente wie unter a) aufgeführt IN( der Liste aller Wörter aus der Menge B ) sind.
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2007-03-14 08:56
#75000 #75000
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Franz: Du hast doch oben die zwei Listen gepostet. Was soll denn bei diesen Listen als Ergebnis rauskommen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Franz
 2007-03-14 19:48
#75001 #75001
User since
2006-07-12
31 Artikel
BenutzerIn
[default_avatar]
[quote=pktm,14.03.2007, 01:00]Ja da gebe ich dir voll undganz recht. Das ist unverständlich :p

Du hast die Menge A: qw(wort1 wort2 wort3)
Und die Menge B: qw(poi uzt ztr)

Und du möchtest jetzt
a) wissen ob zwei Elemente von A in der Menge B vorkommen, also ob z.B. wort1 und wort2, oder wort1 und wort3 oder wort2 und wort3 in B vorkommen

Ich tippe momentan auf a), und dafür kannst du die IN() - Syntax in SQL verwenden. Du guckst, ob eines der Elemente wie unter a) aufgeführt IN( der Liste aller Wörter aus der Menge B ) sind.[/quote]
ja, a) ist korrekt

wenn zwei elemente der Menge A in der Menge B vorhanden sind will ich das erkennen.

Nur habe ich nicht nur eine Menge B, die zu untersuchen ist, sondern eher viele viele mehr.... sagen wir einmal 1 Million Mengen in der Art

M(wort1 wort2 wort3)

M1 { M1.1(poi uzt ztr),M1.2(fjr xkf djx),M1.3(fsd hgf asd)...}
M2 { M2.1(pui sjt ijr),M2.2(flr lkr drq),M2.3(rds abc kle)...}
....

wie ich das in eine DB-Form bringe weiss ich noch nicht und wie ich dann die Abfrage gestalte erst recht nicht :-/ das ganze muss ja halbwegs performant sein für eine große Menge an Datensätzen... ich weiss auch noch nicht wie groß die Datenmenge wird .... evtl. kann ich das ja einfach alles in hashes packen?
pktm
 2007-03-14 20:25
#75002 #75002
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja dann würde ich jetzt vorschlagen, dass du uns mal eine Probe deiner Datensätze gibst, dann müssen wir nicht rumraten.
Was bekommst du für Daten? In welchem Format? Was willst du aus diesen Daten machen?
http://www.intergastro-service.de (mein erstes CMS :) )
docsnyder
 2007-03-15 11:10
#75003 #75003
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallöle?

Wenn sich die Daten sowieso in einer DB befinden, kann die Suche auf 2 übereinstimmende Elemente nicht mit DB-Bordmitteln durchgeführt werden? Ich kenne mich mit SQL nicht so gut aus, aber ich könnte mir vorstellen, daß man das irgendwie hinbekommt und es wäre dann auch performanter. Wahrscheinlich kommt es nur darauf an, das Schema der DB geeignet zu modellieren. ... ist nur so eine Idee ;o)

Gruss, Doc
bloonix
 2007-03-15 15:44
#75004 #75004
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo doc,

[quote=docsnyder,15.03.2007, 10:10]Hallöle?

Wenn sich die Daten sowieso in einer DB befinden, kann die Suche auf 2 übereinstimmende Elemente nicht mit DB-Bordmitteln durchgeführt werden?[/quote]

ja, das geht... ich hab hier mal einen kleinen Hack:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
use test_db_foo_bar;

create table filter (c1 varchar(255));
create table data   (c0 int, c1 varchar(255));

insert into filter (c1)    values ('a b c d');
insert into data   (c0,c1) values (1, 'x x x x');
insert into data   (c0,c1) values (2, 'a x x x');
insert into data   (c0,c1) values (3, 'a b x x');
insert into data   (c0,c1) values (4, 'a b c x');
insert into data   (c0,c1) values (5, 'a b c d');

delimiter //

create procedure demo()
begin
  declare filter_c1,data_c1,str,tmp varchar(255);
  declare len,pos,data_c0,cnt int default 0;
  declare done BOOL default FALSE;
  declare cur1 cursor for select c1 from filter;
  declare cur2 cursor for select c0,c1 from data;
  declare continue handler for not found set done := TRUE;

  open cur1;

  label1: loop

     fetch cur1 into filter_c1;

     if done then
        leave label1;
     end if;

     open cur2;

     label2: loop

        fetch cur2 into data_c0, data_c1;

        if done then
           leave label2;
        end if;

        set tmp = filter_c1;
        set cnt = 0;

        label3: loop

           set pos = instr(tmp, ' ');
           set len = length(tmp);

           if pos = 0 then
              set str = concat('%',tmp,'%');
           else
              set str = concat('%',substr(tmp, 1, pos-1),'%');
           end if;

           set tmp = substr(tmp, pos+1, len);

           if data_c1 like str then
              set cnt = cnt+1;
           end if;

           if cnt = 2 then
              select data_c0, data_c1;
              leave label3;
           end if;

           if pos = 0 then
              leave label3;
           end if;

        end loop label3;

     end loop label2;

     close cur2;

  end loop label1;

  close cur1;
end
//

delimiter;

call demo();


Dieser gibt genau die Zeilen aus, die mindestens zwei Treffer haben:

data_c0 data_c1
3       a b x x
data_c0 data_c1
4       a b c x
data_c0 data_c1
5       a b c d


Ich bin kein Profi, was Prozeduren angeht, aber es funktioniert.

Gruss,
opi\n\n

<!--EDIT|opi|1173966461-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2007-03-13 00:21.