Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Wortdichteberechnung?





Frage

Hi, da ich, wie hier jeder weiß, nicht so der Programmierer bin und wir etwas unter Zeitdruck stehen wollte ich euch mal um Hilfe bitten. Es geht um folgende Seite: [url=http://www.jamaipa.de/wortdichte.html]Wortdichteberechnung[/url] Was ich brauche ist eine Möglichkeit Texte nach Suchworten und ihrer Wortdichte zu bewerten. Dazu stelle ich mir das wie auf dieser Seite vor, man gibt seinen Text in die große Textbox ein und oben seine Suchwörter. Dann klickt man auf berechnen und die Wortdichten werden dann für alle Suchwörter und für jedes einzeln angezeigt (ganz klasse wäre es wenn man da einen Wert eingeben könnte z.B. Wortdichte ist 8 % und um so näher das an der 8 ist um so grüner wird der Hintergrund der einzelnen Felder). Man könnte es auch so machen, dass die Wortdichte nach jedem eingegebenen Wort neu berechnet wird, aber fürs erste wollen wir es ja einfach halten. Wäre super wenn ihr mir da helfen könntet. Ach ja die Wortdichte berechnet sich wie folgt: Suchwortanzahl / Anzahl aller Worte im Text * 100 Gruß Fabian

Antwort 1 von rfb

nur mal so als Einstieg, vielelicht mag das jemand ja weiter ausfeilen:

<html>
<head>
<title>Wortdichte</title>
<script type="text/javascript">
function treffer(suchwort,text) {
var s=suchwort.toUpperCase(),t=text.toUpperCase();
var x=-1,i=-1;
if (s && t && t.length>s.length) do {
x++;
i=t.indexOf(s,i+1);
} while (i>-1 && i<t.length);
return Math.max(x,0);
}
function wortdichte(suchwort,text) {
var t=text.replace(/[\.:,;?!\"\'\n\t\f\r]/g," ");
var tt=t.split(" ");
var tl=tt.length;
for (var j=0;j<tt.length;j++) {
if (tt[j]=="") tl--;
}
var dichte=(tl>0)?treffer(suchwort,t)*100/tl:0;
return dichte;
}
</script>
</head>
<body>
<form id="worte" action="" onsubmit="this.d.value=wortdichte(this.sw.value,this.txt.value);return false">
<p><label for="sw">Suchwort: <input type="text" id="sw" name="sw"></label><label for="d">Wortdichte: <input type="text" id="d" name="d">%</label></p>
<p><label for="txt">Text: <textarea id="txt" name="txt" rows="10" cols="30"></textarea></label></p>
<p><input type="submit" value="Wortdichte bestimmen"></p>
</form>
</body>
</html>


Antwort 2 von halfstone

Hi rfb,

Danke erst mal für die schnelle Hilfe!
Also das funktioniert schon mal fast so wie ich es will.
Im Moment behandelt es aber die Such-"Phrase" als ein Wort, was fürs erste auch gut ist. Jetzt bräuchte ich noch eine Anzeige für jedes einzelne Suchwort aus der Such-"Phrase" und wenn das noch dynamisch wäre, wäre das super!

Dann wäre es schon mal fast perfekt.

Würde mich sehr freuen wenn da noch jemand helfen könnte.

Gruß Fabian

Antwort 3 von rfb

eher sowas?

<html>
<head>
<title>Wortdichte</title>
<script type="text/javascript">
function treffer(suchwort,text) {
var s=suchwort.toUpperCase(),t=text.toUpperCase();
var x=-1,i=-1;
if (s && t && t.length>s.length) do {
x++;
i=t.indexOf(s,i+1);
} while (i>-1 && i<t.length);
return Math.max(x,0);
}
function wortdichte(suchwort,text) {
var t=text.replace(/[\.:,;?!\"\'\n\t\f\r]/g," ");
var tt=t.split(" ");
var tl=tt.length;
for (var j=0;j<tt.length;j++) {
if (tt[j]=="") tl--;
}
var dichte=(tl>0)?treffer(suchwort,t)*100/tl:0;
return dichte;
}
function wortdichten() {
var f=document.getElementById("worte");
var s=f.sw.value.split(" ");
var dichte=new Array(s.length);
var t=f.txt.value;
var liste=document.getElementById("liste");
if (liste) f.removeChild(liste);
liste=document.createElement("ul");
liste.id="liste";
for (var j=0;j<s.length;j++) if (s[j]!="") {
dichte[j]=wortdichte(s[j],t);
var li=document.createElement("li");
li.appendChild(document.createTextNode(s[j]+": "+dichte[j]+"%"));
liste.appendChild(li);
}
f.appendChild(liste);
}
</script>
</head>
<body>
<form id="worte" action="" onsubmit="wortdichten();return false">
<p><label for="sw">Suchwort: <input type="text" id="sw" name="sw"></label></p>
<p><label for="txt">Text: <textarea id="txt" name="txt" rows="10" cols="30"></textarea></label></p>
<p><input type="submit" value="Wortdichte bestimmen"></p>
</form>
</body>
</html>


Antwort 4 von halfstone

Hi rfb,

ja genau und jetzt noch beide zusammen, also die Suchphrase nicht in Wörter zerhackt sondern zusammen, dann wäre es perfekt.

Gruß und vielen Dank das hilft mir sehr weiter.

Fabian

Antwort 5 von halfstone

Hi,

mir ist noch was eingefallen, wie müsste das aussehen wenn man mehrere Texte vergleichen will, also mehrere große Textfelder, die auf die gleichen Worte hin auf die Suchwortdichte untersucht werden sollen?

Gruß Fabian

Antwort 6 von rfb

könntest du
Zitat:
jetzt noch beide zusammen
etwas präzisieren (ich bin wohl nach dem gestrigen hiesigen Mai- und Hafenfest und entsprechender Tätigkeit als Galeerensklave in einem Drachenboot etwas begriffsstutzig ;-)

Antwort 7 von halfstone

Hi rfb,

na das freut mich wenn du Spaß hattest auch wenn es als Galerensklave war ;-)

Ich versuche es an einem Beispiel zu erklären. Ich gebe als Suchworte:

Fabian Gränzer ein.

Ich möchte dann aus verschiedenen Texten (das ist ja auch eine neue Anforderung) aufgezählt bekommen:

Wortdichte für:

Fabian = 3 %
Gränzer = 3 %
Fabian Gränzer = 0% (wenn in dem Text halt "Fabian Gränzer" nicht vorkommt sondern nur Fabian an ein paar Stellen und an anderen Stellen Gränzer).

Gruß und nochmals vielen Dank für deine Hilfe

Fabian

Antwort 8 von rfb

diese neue Version der Funktion wortdichten sollte das schaffen:

function wortdichten() {
var f=document.getElementById("worte");
var t=f.sw.value
var s=t.split(" ");
s[s.length]=t;
var dichte=new Array(s.length);
t=f.txt.value;
var liste=document.getElementById("liste");
if (liste) f.removeChild(liste);
liste=document.createElement("ul");
liste.id="liste";
for (var j=0;j<s.length;j++) if (s[j]!="") {
dichte[j]=wortdichte(s[j],t);
var li=document.createElement("li");
li.appendChild(document.createTextNode(s[j]+": "+dichte[j]+"%"));
liste.appendChild(li);
}
f.appendChild(liste);
}


einzige Änderung ist, das jetzt an das Array der Suchworte der komplette Inhalt des Suchfeldes noch einmal angehängt wird.

Antwort 9 von rfb

so hier mal mit mehreren Textfeldern (alle mit name="txt"):

<html>
<head>
<title>Wortdichte</title>
<script type="text/javascript">
function treffer(suchwort,text) {
var s=suchwort.toUpperCase(),t=text.toUpperCase();
var x=-1,i=-1;
if (s && t && t.length>s.length) do {
x++;
i=t.indexOf(s,i+1);
} while (i>-1 && i<t.length);
return Math.max(x,0);
}
function wortdichte(suchwort,text) {
var t=text.replace(/[\.:,;?!\"\'\n\t\f\r]/g," ");
var tt=t.split(" ");
var tl=tt.length;
for (var j=0;j<tt.length;j++) {
if (tt[j]=="") tl--;
}
var dichte=(tl>0)?treffer(suchwort,t)*100/tl:0;
return dichte;
}
function wortdichten() {
var f=document.getElementById("worte");
var t=f.sw.value
var s=t.split(" ");
s[s.length]=t;
var texte=document.getElementsByName("txt");
for (var ti=0;ti<texte.length;ti++) {
t=texte[ti].value;
var dichte=new Array(s.length);
var liste=document.getElementById("liste"+ti);
if (liste) texte[ti].parentNode.parentNode.removeChild(liste);
liste=document.createElement("ul");
liste.id="liste"+ti;
for (var j=0;j<s.length;j++) if (s[j]!="") {
dichte[j]=wortdichte(s[j],t);
var li=document.createElement("li");
li.appendChild(document.createTextNode(s[j]+": "+dichte[j]+"%"));
liste.appendChild(li);
}
texte[ti].parentNode.parentNode.appendChild(liste);
}}
</script>
</head>
<body>
<form id="worte" action="" onsubmit="wortdichten();return false">
<p><label for="sw">Suchwort: <input type="text" id="sw" name="sw"></label></p>
<div><label for="txt1">Text: <textarea id="txt1" name="txt" rows="10" cols="30"></textarea></label></div>
<div><label for="txt2">Text: <textarea id="txt2" name="txt" rows="10" cols="30"></textarea></label></div>
<p><input type="submit" value="Wortdichte bestimmen"></p>
</form>
</body>
</html>


aus den p um die Textfelder wurden div, damit die entsprechende Ergebnisliste valide mit eingehängt werden kann.

Antwort 10 von halfstone

rfb du bist ein Schatz ;-)

vielen Dank für das Script das macht mir die Arbeit wirklich leichter.

Gruß Fabian

Antwort 11 von rfb

um einem (allerdings nicht besonders wahrscheinlichem) Fehler vorzeubeugen bitte die Zeile

if (liste) texte[ti].parentNode.parentNode.removeChild(liste);

(lösche das Kind liste der Großeltern von texte[ti])

ändern in

if (liste) liste.parentNode.removeChild(liste);

(lösche das Kind liste der Eltern von liste)

Der Fehler tritt evtl. dann auf, wenn du selbst einem Element die ID "liste"+Zahl gibst. Oder wenn irgendwie weitere Elemente hier in den Dokumentenbaum eingehängt werden (wozu auch immer).
Aber es ist so nicht nur sicherer sondern auch noch kürzer.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Suche in allen vorhandenen Beiträgen: