Input/Output 6000 Zeilen einlesen und String-Array vergleichen?

Kel

Aktives Mitglied
Mein Programm läuft und es funktioniert alles so wie es soll - nur leider so langsam, dass ich 3 Minuten für einen Testdurchlauf warten muss.
Hat jemand eine Idee, um das ganze zu beschleunigen?
Gearbeitet wird mit dem JCAS-Framework für semantische Textanalysen.
Die Testdaten von Twitter werden mittels Frameworkfunktionen eingelesen, geparst und dann als "GoldSentiment" (siehe Klasse "Evaluation") eingespeist, daran kann ich nichts rütteln.

Ich habe einmal meine Testdaten von Twitter (.txt) und 2 Wortlisten (.txt).
Die Wortlisten brauche ich als String-Array, um sie mit dem String-Array der Twitterdaten abgleichen zu können :rtfm:.
Wahrscheinlich ist mein Ansatz die 2 Wortlisten in ein String-Array umzuwandeln ineffizient und da kommt ihr ins Spiel :toll:.

Auszug aus einer Wortliste, einfach Zeilenweise runter:
REWARDING
REWARDS
SATISFACTION
SATISFACTORILY
SATISFACTORY



Klasse "SentimentAnalysis":
Java:
package XYZ

import java.util.Collection;
import java.io.File;
import java.util.List;
import org.apache.commons.io.FileUtils;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.CASException;
import org.apache.uima.fit.component.JCasAnnotator_ImplBase;
import org.apache.uima.fit.descriptor.ConfigurationParameter;
import org.apache.uima.fit.util.JCasUtil;
import org.apache.uima.jcas.JCas;
import org.apache.uima.resource.metadata.TypeSystemDescription;

import de.tudarmstadt.ukp.dkpro.core.api.segmentation.type.Token;
import de.unidue.langtech.teaching.pp.type.DetectedSentiment;

public class SentimentAnalysis
    extends JCasAnnotator_ImplBase
    implements Runnable
{
	
	public static final String PARAM_PositiveList = "posList";
	@ConfigurationParameter(name = PARAM_PositiveList, mandatory = true)
	private String posListdic;
	
	public static final String PARAM_NegativeList = "negList";
	@ConfigurationParameter(name = PARAM_NegativeList, mandatory = true)
	private String negListdic;
	
	public static final String PARAM_NeutralList = "neutList";
	@ConfigurationParameter(name = PARAM_NeutralList, mandatory = true)
	private String neutListdic;

    private int posNumber;
    private int negNumber;
    private String[] listePos;
    private String[] listeNeg;
    private File importWordListPos;
    private File importWordListNeg;
    private List<String> importWordListStringPos;
    private List<String> importWordListStringNeg;
	
    @Override
    public void process(JCas jcas)
    		throws AnalysisEngineProcessException
    	    {   	
    	    
    	    Collection<Token> tokens = JCasUtil.select(jcas, Token.class);
    	    DetectedSentiment sentimentAnno = new DetectedSentiment(jcas);
    	    	
    	    // Variablentyp "FILE"
    	    importWordListPos = new File(posListdic);
    	    importWordListNeg = new File(negListdic);
    	        
    	    // Positiv/Negativ-Files in List<String> umwandeln
    	    importWordListStringPos = WordListRead(importWordListPos);
    	    importWordListStringNeg = WordListRead(importWordListNeg);
    	         
    	    // List<String> in String[]-Array umwandeln
    	    listePos = listenParsen(importWordListStringPos);
    	    listeNeg = listenParsen(importWordListStringNeg);

    	    // Collection<Token> tokens iterieren lassen
    	    // Abgleich von 'token' und der gesamten Positiv/Negativ-Liste + Counter jeweils hochzählen bei Treffer
    	    posNumber = tokenAbgleichWordList(tokens, listePos);
    	    negNumber = tokenAbgleichWordList(tokens, listeNeg);		
    	    
    	    // Counter auswerten = Sentiment setzen und zum Index hinzufügen
    		counter(posNumber, negNumber, sentimentAnno);
    	    }
    	         
	public void run() {
	
	}
                    
   // File in List<String>-Objekt umwandeln
    public List<String> WordListRead(File file) {
    	
    List<String> importWordList = null;
    try {
		importWordList = FileUtils.readLines(file);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
    return importWordList;
   }
   
   // List<String> in ein String[]-Array umwandeln
   public String[] listenParsen(List<String> importWordList) {
   	String[] liste = new String[importWordList.size()];
    	for (int i = 0; i < importWordList.size(); i++) {
    		liste[i] = importWordList.get(i);
    	}
   	return liste;
   }
   
   // Durch Collection<token> iterieren und Counter hochzählen
   public int tokenAbgleichWordList(Collection<Token> tokens, String[] listePos) {
   	int number = 0;
   	for (Token token : tokens) {
    		for (int i = 0; i < listePos.length; i++) {
    			if (token.getCoveredText().toLowerCase().equals((listePos[i]).toLowerCase())) {
    			number++;
    			}		
    		}	
    	}
   	return number;
   }
   
   public void counter(int pos, int neg, DetectedSentiment sentimentAnno) {
   	if (pos > neg) {
 		sentimentAnno.setSentiment("positive");
 		sentimentAnno.addToIndexes();
 	}
 	if (neg > pos) {
 		sentimentAnno.setSentiment("negative");
 		sentimentAnno.addToIndexes();
 	}
 	if (pos == neg) {
 		sentimentAnno.setSentiment("neutral");
 		sentimentAnno.addToIndexes();
 	}
}
   }

Danach wird das hier aufgerufen in der Klasse "Evaluation" (macht das JCAS-Framework automatisch):
Java:
public void process(JCas jcas)
        throws AnalysisEngineProcessException
    {
        nrOfDocuments++; 
        
        DetectedSentiment detected = JCasUtil.selectSingle(jcas, DetectedSentiment.class);
        GoldSentiment actual = JCasUtil.selectSingle(jcas, GoldSentiment.class);
        // gibt "richtiges Sentiment (Goldsentiment) = wahrscheinliches Sentiment aus
        // System.out.println(actual.getSentiment() + " detected as " + detected.getSentiment());
        
        if (detected.getSentiment().equals(actual.getSentiment())) {
            correct++;
            // gibt den aktuellen Counter = Anzahl richtig erkannter Sentiments aus
            System.out.println(correct);
        }
    }
 
Zuletzt bearbeitet:

Zurück
Oben