Aufgabe 3.6 – Statistische Analyse eines Textes

 

In dieser Aufgabe soll ein in einer Datei abgespeicherter Text statistisch analysiert werden. Schreiben Sie dazu eine Funktion textstat(), die

  1. mit Hilfe eines Dialogfensters die Auswahl der zu analysierenden Datei ermöglicht. (Erwartet wird hier eine ASCII-Datei mit der Erweiterung *.txt)
  2. den Text wortweise mit Hilfe der MATLAB-Funktion textread(filename,’%s’) aus der gewählten Datei in ein cell-array einliest.
  3. alle im Text enthaltenen Worte alphabetisch sortiert, in Kleinbuchstaben konvertiert und die Auftrittshäufigkeit eines jeden Wortes bestimmt.
  4. das Ergebnis formatiert in eine ASCII Datei schreibt. Der Name der Ergebnisdatei setzt sich dabei aus dem Namen der zu analysierenden Datei und dem Zusatz ‘_stat’ zusammen. Die Wörter werden gruppenweise nach abnehmender Häufigkeit gelistet mit alphabetischer Sortierung innerhalb der Gruppen Testen Sie Ihre Funktion anhand der Datei “beispieltext.txt” im Download-Verzeichnis zur Vorlesung! Als Resultat ergibt sich eine Datei “beispieltext_stat.txt” mit dem Inhalt

    der [4]
    die [2]
    muss [2]
    von [2]
    aus [1]
    das [1]
    den [1]
    doch [1]

    zur [1]

Lösung

function textstat()
	% dialog window to get filename and path
	[File, Path]=uigetfile('*.txt','Bitte Datei mit Text auswählen');
	if ~File
		return
	end

	% read text file
	text=textread(fullfile(Path, File),'%s'); % read text

	% convert to lower case
	text=lower(text);

	% remove non-letter characters
	for i=1:length(text)
		w=text{i};
		text{i}=w(isletter(w));
	end

	% text=regexprep(text, '\W', ''); % alternative without loop
	% sort words
	text=sort(text);

	% remove duplicates and count occurrences of words
	words=tabulate(text);

	% sort words according to descending number of occurrences
	words=sortrows(words,[-2, 1]);

	% determine number of characters in longest word
	wmax=max(cellfun(@length,words(:,1)));

	% write word statistic to output file
	OutFile=[File(1:end-4) '_stat.txt'];
	fid=fopen(OutFile,'wt');
	for i=1:size(words,1)
		fprintf(fid,['%-' num2str(wmax+2) 's [%d]\n'],words{i,1},...
		words{i,2});
	end
	fclose(fid);
end