Programm das Text-Analysen durchführt



  • Hallo!

    Ich suche/brauche ein Programm, dass Textanalysen durchführt zumindes aber die Anzahl der verschiedenen Wörter anzeigt und diese selbst natürlich auch anzeigt.

    Kennt jemand vielleicht so ein Programm?

    habe Textstat und andere probiert, versagen aber alle bei einer bis zu 100 MB großen Datei oder funktionieren nicht ordentlich.

    Ist wichtig/dringend,

    vielen Dank

    mfg



  • muhi schrieb:

    Hallo!

    Ich suche/brauche ein Programm, dass Textanalysen durchführt zumindes aber die Anzahl der verschiedenen Wörter anzeigt und diese selbst natürlich auch anzeigt.

    Mal so auf die schnelle:

    $ tr ' ' '\n' < DATEI | sort | uniq -c
    


  • Hallo,

    danke, das ist aber unter Linux oder?

    bin Windows-User 😃



  • Ist keine Ausrede, MSYS ( http://mingw.org/ ) 😉



  • [Edit: Whitespace Fehler korrigiert]
    @muhi: Probiers vielleicht mal damit. Habs eben nur fix zusammen gefrickelt, aber Du kannst es ja evtl. noch auf spez. Bedürfnisse anpassen. Weiß nicht, wie das Ding mit 100+ MB Files läuft. Man kann aber sicher noch viel dran optimieren, falls nötig.

    import java.io.*;
    
    class Main{
    
    public static void main(String [] args) throws Exception{
    	String filename = "Main.java";
    	if( args.length > 0 && args[0] != null ) 
    		filename = args[0];		
    	BufferedReader br = new BufferedReader( new FileReader(filename) );
    	Tree t = new Tree();
    	String line;
    	while ( (line = br.readLine()) != null ){
    
    		String[] words = line.split("\\W");
    		for(int i = 0; i < words.length; i++) 
    			if( !words[i].trim().equals("") )
    				t.add( words[i] );		
    	}
    	br.close();
    	System.out.println("Word count: " + t.countNodes(t.root) + " (all words: " + t.countAll() + ")\n");
    	t.print();	
    }
    }
    
    class Tree{
    	Node root;
    	int countAll = 0;
    
    	public void add(String s){
    		if(root == null) root = new Node(s);
    		else root.add(new Node(s));
    		countAll++;	
    	}
    
    	public void print(){ print(root); }
    
    	public void print(Node n){		
    		if( n.l != null ) print(n.l);
    		System.out.println( n.count + ":\t" + n.val );
    		if( n.r != null ) print(n.r);		
    
    	}
    
    	public int countNodes(Node n){
    		if(n == null) return 0;
    		int s = 0;
    		if(n.l != null) s += countNodes(n.l);
    		if(n.r != null)  s += countNodes(n.r);
    		return s+1;		
    	}
    
    	public int countAll(){ return countAll; }
    }
    
    class Node{
    	Node l, r;
    	String val;
    	int count = 1;
    
    	public Node(String s){ val = s; }
    
    	public void add(Node n){
    		if( val == null){
    			val = n.val; l = n.l; r = n.r;
    		}
    		else{
    			int cmp = n.val.compareToIgnoreCase(val);
    			if( cmp < 0 ){
    				if( l == null ) l = new Node(n.val);
    				else l.add(n);	
    			} 
    			else if( cmp == 0  ){
    				count++;
    			}
    			else {
    				if( r == null ) r = new Node(n.val);
    				else r.add(n);	
    			}				
    		}
    	}
    
    }
    

    Ausgabe:

    Word count: 57 (all words: 253)
    
    9:      0
    2:      1
    6:      add
    1:      all
    4:      args
    3:      br
    2:      BufferedReader
    3:      class
    1:      close
    3:      cmp
    1:      compareToIgnoreCase
    4:      count
    ...
    


  • Das sind ein paar Zeilen Code, dafür gibt es sicher kein Programm.



  • PS: Für deutsche Texte mit Umlauten könntest Du auch mal den Regex "[a-zA-Z_0-9ä-üÄ-Ü^ß\\x5E]" anstatt dem "\\W" probieren. Allerdings klappt das Splitten beim ^-Zeichen (Hex: 0x5E) noch nicht ganz. Weiß einer wieso?


Anmelden zum Antworten