Webstatt.org - Community seit 2006 - 2012 (2024?)

Relative Häufigkeiten von Zeichen

Avatar user-271
13.03.2007 23:47

Jeder kennt das Problem: Man hat einen Text und will analysieren wieviele Zeichen, welche Art von Zeichen und wieviele von welcher Sorte, auch mit Prozentsatz....

Jaja...vorallem wenn blöde mathelehrer einem so eine Aufgabe geben und man keinen Bock hat die Es oder As zu zählen zwinkern

also hab ich ne kleine klasse geschrieben....kann bisher noch nciht viel, sie zählt die Zeichen und gibt ihre Relative häufigkeit aus und die Anzahl.
Man kann auch Flags setzen um Leerzeichen, Newlines oder was auch immer zu killen zwinkern das ist also kein Problem. mit mehr als 1. Zeichen kommt sie noch nicht klar...vielleicht wenn ich mal Zeit hab, bau ich das noch ein, bisher brauch ich das aber noch nciht...und keine lust dazu

aber wer das selbe problem hat:
#!/usr/bin/php5-cgi -q
<?php
class Frequency {
private $token = array();
private $flags = array();
private $text = '';

public function __construct($text) {
$this->text = $text;
}

public function getFrequency() {
$strlen = strlen($this->text);
for($i = 0; $i < $strlen; $i++) {
$this->token[$this->text{$i}] += 1;
}
$ret = array();

foreach($this->token as $key=>$elem) {
$ret[$key]['frequency'] = $elem;
$ret[$key]['relativeFrequency'] = $elem/$strlen;

}
return $ret;
}

public function getToken() {
if(count($this->token) == 0) {
$this->getFrequency();
}

return $this->token;
}

public function useFlags() {
$pattern = $this->_getFlags();
$this->text = str_replace($pattern['pattern'],$pattern['replace'],$this->text);

if($this->_checkFlag('i'zwinkern) {
$this->text = strtolower($this->text);
}
}

public function addFlag($flag,$pattern='',$replace=''zwinkern {
if($pattern == '' and $replace == ''zwinkern {
if($flag == 'n'zwinkern {
$pattern = "\n";
#$replace = "";
} elseif($flag == 'r'zwinkern {
$pattern = "\r";
#$replace = "";
} elseif($flag == 'w'zwinkern {
$pattern = " ";
#$replace = "";
}
}
$anzahlFlags = count($this->flags);

$this->flags[$anzahlFlags]['occur'] = $flag;
$this->flags[$anzahlFlags]['pattern'] = $pattern;
$this->flags[$anzahlFlags]['replace'] = $replace;

return $this->flags;
}

private function _checkFlag($flag) {
for($i = 0; $i < count($this->flags); $i++) {
if($this->flags[$i]['occur'] == $flag) {
return true;
}
}
return false;
}
private function _getFlags() {
$ret = array('pattern'=>array(),'replace'=>array());

for($i = 0; $i < count($this->flags); $i++) {
if($this->flags[$i]['pattern'] != ''zwinkern {
$ret['pattern'][$i] = $this->flags[$i]['pattern'];
$ret['replace'][$i] = $this->flags[$i]['replace'];
}
}
return $ret;
}
}

$o = new Frequency(file_get_contents($argv[1]));
$o->addFlag('n'zwinkern; # \n => ""
$o->addFlag('r'zwinkern; # \r => ""
$o->addFlag('w'zwinkern; # whitespace => ""
$o->addFlag('i'zwinkern; # Ignore Gross- und Kleinschreibung
#$o->addFlag('something','ö','oe'zwinkern; # wenn man ein ö ersetzen will
$o->useFlags();

print_r($o->getFrequency());
?>

ich teste mein Zeug auf der Konsole also nicht beirren lassen....sooo man kann über addFlag(<flagname>,<pattern>,<replace>zwinkern ein flag setzen....es gehen noch keine RegExen....bestimmte flags wie \n \r whitespaces und Gross und KLeinschreibung sind schon eingebaut, man muss nur noch den Flagnamen angeben...man kann die auch überschreiben, kein Problem zwinkern
wie man einen neuen Setzt ist mit dem Ö angegeben....
danach muss die funktion useFlags angewendet werden...sonst helfen sie nichts

am Schluss kann man sich dann die Frequency der Zeichen ausgeben lassen zwinkern

eine Ausgabe kann so aussehen:
Eduard Mörike (1804 - 1875)

Frühling lässt sein blaues Band
wieder flattern durch die Lüfte.
Süße, wohlbekannte Düfte
streifen ahnungsvoll das Land.
Veilchen träumen schon,
wollen balde kommen.
Horch, von fern, ein leiser Harfenton.
Frühling, ja, Du bist´s,
Dich hab´ ich vernommen!


Ausgabe auf Konsole:
Array
(
[f] => Array
(
[frequency] => 8
[relativeFrequency] => 0.0350877192982
)

[r] => Array
(
[frequency] => 12
[relativeFrequency] => 0.0526315789474
)

[&#65533;] => Array
(
[frequency] => 8
[relativeFrequency] => 0.0350877192982
)

[&#65533;] => Array
(
[frequency] => 5
[relativeFrequency] => 0.0219298245614
)

[h] => Array
(
[frequency] => 13
[relativeFrequency] => 0.0570175438596
)

[l] => Array
(
[frequency] => 15
[relativeFrequency] => 0.0657894736842
)

[i] => Array
(
[frequency] => 12
[relativeFrequency] => 0.0526315789474
)

[n] => Array
(
[frequency] => 23
[relativeFrequency] => 0.100877192982
)

[g] => Array
(
[frequency] => 3
[relativeFrequency] => 0.0131578947368
)

[&#65533;] => Array
(
[frequency] => 2
[relativeFrequency] => 0.00877192982456
)

[s] => Array
(
[frequency] => 12
[relativeFrequency] => 0.0526315789474
)

[t] => Array
(
[frequency] => 10
[relativeFrequency] => 0.0438596491228
)

[e] => Array
(
[frequency] => 26
[relativeFrequency] => 0.114035087719
)

[b] => Array
(
[frequency] => 6
[relativeFrequency] => 0.0263157894737
)

[a] => Array
(
[frequency] => 11
[relativeFrequency] => 0.0482456140351
)

[u] => Array
(
[frequency] => 5
[relativeFrequency] => 0.0219298245614
)

[d] => Array
(
[frequency] => 10
[relativeFrequency] => 0.0438596491228
)

[w] => Array
(
[frequency] => 3
[relativeFrequency] => 0.0131578947368
)

[c] => Array
(
[frequency] => 6
[relativeFrequency] => 0.0263157894737
)

[.] => Array
(
[frequency] => 4
[relativeFrequency] => 0.0175438596491
)

[&#65533;] => Array
(
[frequency] => 1
[relativeFrequency] => 0.00438596491228
)

[,] => Array
(
[frequency] => 7
[relativeFrequency] => 0.030701754386
)

[o] => Array
(
[frequency] => 9
[relativeFrequency] => 0.0394736842105
)

[k] => Array
(
[frequency] => 2
[relativeFrequency] => 0.00877192982456
)

[v] => Array
(
[frequency] => 4
[relativeFrequency] => 0.0175438596491
)

[m] => Array
(
[frequency] => 5
[relativeFrequency] => 0.0219298245614
)

[j] => Array
(
[frequency] => 1
[relativeFrequency] => 0.00438596491228
)

[&#65533;] => Array
(
[frequency] => 2
[relativeFrequency] => 0.00877192982456
)

[&#65533;] => Array
(
[frequency] => 2
[relativeFrequency] => 0.00877192982456
)

[!] => Array
(
[frequency] => 1
[relativeFrequency] => 0.00438596491228
)

)


lasst euch von den html codes nicht beirren, dass sind Kodierungsfehler auf meiner Konsole: also da ist wahrscheinlich ein Umlaut oder ein ` oder so zwinkern die könnte man auch noch rausnehmen, aber keine lust dazu frech müsste man halt ein flag schreiben zwinkern
aber der nimmt berechnet die relative häufigkeit aus den zu benutzenden Zeichen....wenn er nur 10 Zeichen benutzen soll, dann rechnet er nur mit den 10 Zeichen....und nicht mit allen...wäre ja schwachsinn zwinkern

also....wers braucht...

Gruss user-271

edit: btw: es ist alles recht zusammengehackt...kann gut sein, dass man da und dort verbesserungen bzw. verschönerungen machen kann zwinkern sagt einfach bescheid, dann kann man das machen

#!/bin/bash
traurig){ neutral:& };: