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:
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
)
[�] => Array
(
[frequency] => 8
[relativeFrequency] => 0.0350877192982
)
[�] => 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
)
[�] => 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
)
[�] => 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
)
[�] => Array
(
[frequency] => 2
[relativeFrequency] => 0.00877192982456
)
[�] => 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
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 user-271
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