Forum: PC-Programmierung Schlüsselwörter in Oberbegriffe wandeln


von Jenö B. (Firma: Angeln, Outdoor und Humor) (selbstdual)


Lesenswert?

Kennt jemand einen Dienst oder Algorithmus, der Schlüsselwörter in 
Oberbegriffe zusammenfaßt?

Also etwa
1
cola
2
fanta
3
sprite
4
wasser

wird zu
1
Getränke




und



1
cola
2
fanta
3
brot
4
sprite
5
wasser
6
kaffee

wird zu
1
Getränke
2
Essen

oder
1
Nahrungsmittel

von PittyJ (Gast)


Lesenswert?

Mit sed die Strings tauschen. Das pipen zu sort. Und danach die 
Duplikate mit uniq entfernen.

von Daniel A. (daniel-a)


Lesenswert?

Mit einer grossen datenbank könnte das gehen. Google könntes es, wen es 
wollte.

von Alex (Gast)


Lesenswert?

Kaffee könnte man auch als Psychotrope Substanz oder Pflanzliche Droge 
einordnen.

von Daniel A. (daniel-a)


Lesenswert?

I love code!

Die Mathematische beschreibung des Algorüthmus must du noch selber 
finden, wenn du diese willst. Dieser Algorüthmus ist meine eigene 
Erfindung, und sollte zum gewünschten ergebniss führen. Getestet unter 
Google Chrome:
1
<pre>
2
<script>
3
4
var db = {};
5
6
function getSet(x){
7
  var x = x.toLowerCase();
8
  if(!db[x])
9
    db[x]={};
10
  return db[x];
11
}
12
13
function L(begriff,ueberbegriffe){
14
  var b = getSet(begriff);
15
  for( var i in ueberbegriffe)
16
    b[ueberbegriffe[i].toLowerCase()] = getSet(ueberbegriffe[i]);
17
}
18
19
function allDeep(q,d,u,a,md){
20
  if(!md)md=0;
21
  if(d<=0) return null;
22
  if(!u)u={};
23
  if(!a)a={};
24
  for(var i in q){
25
    if(a[i]){
26
     if(md<a[i])a[i]=md;
27
     u[i] = db[i];
28
     continue; // prevent endless recursion
29
    }
30
    u[i]={};
31
    a[i]=md;
32
  }
33
  for(var i in q)
34
    allDeep(q[i],d-1,u[i],a,md+1);
35
  return {"u":u,"a":a};
36
}
37
38
function search(q,deep){
39
  if(deep===undefined)
40
    deep = Infinity;
41
  var r={};
42
  for(var i in q){
43
    var x = allDeep(db[q[i].toLowerCase()],deep);
44
    if(x) r[q[i]] = x;
45
  }
46
  var u = {};
47
  for(var i in r){
48
    for(var j in r[i].a){
49
      var all = true;
50
      var n=0;
51
      var p=0;
52
      for(var k in r){
53
        n++;
54
        if(r[k].a[j]===undefined){
55
          all=false;
56
          break;
57
        }
58
        p += r[k].a[j];
59
      }
60
      if(all){
61
        u[j] = p/n;
62
      }
63
    }
64
  }
65
  
66
  var s=[];
67
  for (var x in u)
68
    s.push([x, u[x]]);
69
  s.sort(function(a, b) {return a[1] - b[1]})
70
71
  return s;
72
}
73
74
75
L("Essen",["Nahrungsmittel"]);
76
L("Getränk",["Nahrungsmittel"]);
77
L("Milchshake",["Getränk","Essen"]);
78
L("Tee",["Getränk"]);
79
80
81
var x = search(["Milchshake","Tee"]);
82
for(var i in x){
83
  document.writeln(x[i][0]);
84
}
85
86
</script>
87
</pre>

von Jenö B. (Firma: Angeln, Outdoor und Humor) (selbstdual)


Lesenswert?

Daniel A., das Problem ist der Datenbestand(Zu welchen Begriffen gehören 
welche Oberbegriffe).

von Karl H. (kbuchegg)


Lesenswert?

Jenö Bender schrieb:
> Daniel A., das Problem ist der Datenbestand(Zu welchen Begriffen gehören
> welche Oberbegriffe).

Genau das ist das Problem.

Denn was für dich recht naheliegend ist

> Also etwa
>
>> cola
>> fanta
>> sprite
>> wasser
> wird zu
>
> Getränke

ist zb. für einen Amerikaner komplett anders. Der würde 'cola', 'fanta' 
und 'sprite' erst mal unter dem Oberbegriff 'sodas' zusammenfassen. Und 
erst der Oberbegriff zu 'sodas' und 'wasser' wäre für ihn 'beverages' 
(also Getränke).

Du wirst also nicht umhin kommen, die Kategorisierung für dich selbst 
und deinen Einsatzzweck mit den für dich passenden Begriffen, 
Kategorisierungen  und Abstufungen in den Kategorisierungen zu 
erstellen. Denn warum fasst du 'cola', 'fante' und 'sprite' nicht zuerst 
in 'Limonaden' zusammen oder in 'kohlensäurehaltige Limonaden' um sie zb 
von 'Fruchtsäfte' zu unterscheiden?

: Bearbeitet durch User
von Bitflüsterer (Gast)


Lesenswert?

Unter dem Suchbegriff "Ontologie" kannst Du einige Datenbanken finden, 
die (unter anderem) solche Kategorisierungen enthalten. Ob allerdings 
genau Dein Beispiel damit abgedeckt ist, kann ich im Moment nicht sagen. 
Ich bezweifle es eher. Die entsprechenden Arbeitsgruppen werden jedoch 
nicht unfroh sein, wenn Du dazu beiträgst.

Da die Verwendungszwecke meist wesentlich weiter gefasst sind, als für 
Deinen Zweck nötig - sie z.B. auch Definitionen der Zusammensetzung, 
Verwendung etc. enhalten - wirst Du Deine Teilkategorien extrahieren 
müssen.

Eine andere dumme Idee wäre auch, die Listen von 
Online-Lebensmittellieferanten durchzuforsten.

von Εrnst B. (ernst)


Lesenswert?

Eine möglichkeit das in Programmcode zu giessen: Eine SOM
(Self organizing Map) o.Ä. Neuronales Netz.

Je nach Eingabedaten kann das dann feststellen:

cola
fanta
sprite
wasser

gehören zu einer Kategorie, wobei das Wasser etwas "weiter davon weg 
ist".

Dass diese Kategorie dann "Getränke" heißt, kann das NN natürlich nicht 
rausfinden.

von Lukas K. (carrotindustries)


Lesenswert?

Die Wikipedia-Kategorien sollten hier helfen. Wikipedia-Dumps sind 
erhältlich.

Dann versuchen mit möglichst wenig Schritten durch Kategorien zu einer 
gemeinsamen Kategorie zu kommen.

Soweit die Theorie...

Mal ausprobiert:
Wasser (Artikel) → Wasser (Kategorie) → Mineralwasser (Unterkategorie) → 
Alkoholfreies Getränk (K)
Cola (Artikel) → Erfrischungsgetränk (K) → Alkoholfreies Getränk (K)

Scheint machbar.

von Jenö Bender (Gast)


Lesenswert?

Lukas K. schrieb:
> Die Wikipedia-Kategorien sollten hier helfen. Wikipedia-Dumps sind
> erhältlich.
Das ist etwas unübersichtlich. Welche Dateien sollte ich mir genauer 
ansehen?

von Jenö B. (Firma: Angeln, Outdoor und Humor) (selbstdual)


Lesenswert?

Lukas K. schrieb:
> Die Wikipedia-Kategorien sollten hier helfen. Wikipedia-Dumps sind
> erhältlich.
Das ist etwas unübersichtlich. Welche Dateien sollte ich mir genauer
ansehen?

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.