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:
Klasse "SentimentAnalysis":
Danach wird das hier aufgerufen in der Klasse "Evaluation" (macht das JCAS-Framework automatisch):
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: