Willkommen in der Webstatt Zum Webstatt Blog und Stories
nuit nuit am 14.03.07 00: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 ;)

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 ;) 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')) {
$this->text = strtolower($this->text);
}
}

public function addFlag($flag,$pattern='',$replace='') {
if($pattern == '' and $replace == '') {
if($flag == 'n') {
$pattern = "\n";
#$replace = "";
} elseif($flag == 'r') {
$pattern = "\r";
#$replace = "";
} elseif($flag == 'w') {
$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'] != '') {
$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'); # \n => ""
$o->addFlag('r'); # \r => ""
$o->addFlag('w'); # whitespace => ""
$o->addFlag('i'); # Ignore Gross- und Kleinschreibung
#$o->addFlag('something','ö','oe'); # 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>) 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 ;)
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 ;)

eine Ausgabe kann so aussehen:

Quote
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 ;) die könnte man auch noch rausnehmen, aber keine lust dazu :P müsste man halt ein flag schreiben ;)
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 ;)

also....wers braucht...

Gruss nuit

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

netcup.de Warum gibt es hier Werbung?
Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt