2016-04-23 58 views
1

我正在研究一個項目,分析實時tweet和識別用戶的心情。 因此,我使用twitter4j接收實時推文並將這些推文提供給斯坦福大學的核心NLP。我正確接收實時推文。但是當我將這些推文提供給斯坦福大學的核心NLP時,我得到了一個運行時錯誤。異常在線程「Twitter4J異步調度器[0]」java.lang.NoClassDefFoundError

PrintSampleStream類,使用twitter4j地獲取實時的鳴叫:

import javax.swing.JDialog; 
import javax.swing.JOptionPane; 

import javax.swing.Timer; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import twitter4j.*; 
import twitter4j.conf.*; 

public class PrintSampleStream { 

    private String twitter_handle; 

    PrintSampleStream() 
    { 
     twitter_handle = null; 
    } 

    PrintSampleStream(String tw) 
    { 
     twitter_handle = tw; 
    } 

    public void twitterConnector() throws TwitterException { 
     ConfigurationBuilder cb = new ConfigurationBuilder(); 
      cb.setDebugEnabled(true).setOAuthConsumerKey("bbbb") 
        .setOAuthConsumerSecret("bbbb") 
        .setOAuthAccessToken("bbbb") 
        .setOAuthAccessTokenSecret("bbbb"); 
      TwitterStream twitterStream = new TwitterStreamFactory(cb.build()) 
        .getInstance(); 
     StatusListener listener = new StatusListener() { 
      @Override 
      public void onStatus(Status status) { 
       System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText()); 
       NLP.init(); 
       System.out.println(status.getText() + " : " + NLP.findSentiment(status.getText())); 
       //storeTweets(status.getText()); 
       //JOptionPane.showMessageDialog(null, status.getText()); 
      } 

      @Override 
      public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) { 
       System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId()); 
      } 

      @Override 
      public void onTrackLimitationNotice(int numberOfLimitedStatuses) { 
       System.out.println("Got track limitation notice:" + numberOfLimitedStatuses); 
      } 

      @Override 
      public void onScrubGeo(long userId, long upToStatusId) { 
       System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId); 
      } 

      @Override 
      public void onStallWarning(StallWarning warning) { 
       System.out.println("Got stall warning:" + warning); 
      } 

      @Override 
      public void onException(Exception ex) { 
       ex.printStackTrace(); 
      } 
     }; 
     twitterStream.addListener(listener); 
     FilterQuery filtre = new FilterQuery(); 
     String[] keywordsArray = {twitter_handle}; 
     filtre.track(keywordsArray); 
     twitterStream.filter(filtre); 
    } 
} 

NLP類爲食,從twitter4j收到斯坦福大學的核心NLP實時鳴叫:

import edu.stanford.nlp.ling.CoreAnnotations; 
import edu.stanford.nlp.neural.rnn.RNNCoreAnnotations; 
import edu.stanford.nlp.pipeline.Annotation; 
import edu.stanford.nlp.pipeline.StanfordCoreNLP; 
import edu.stanford.nlp.sentiment.SentimentCoreAnnotations; 
import edu.stanford.nlp.trees.Tree; 
import edu.stanford.nlp.util.CoreMap; 

public class NLP { 
    static StanfordCoreNLP pipeline; 

    public static void init() { 
     pipeline = new StanfordCoreNLP("MyPropFile.properties"); 
    } 

    public static int findSentiment(String tweet) { 

     int mainSentiment = 0; 
     if (tweet != null && tweet.length() > 0) { 
      int longest = 0; 
      Annotation annotation = pipeline.process(tweet); 
      for (CoreMap sentence : annotation 
        .get(CoreAnnotations.SentencesAnnotation.class)) { 
       Tree tree = sentence.get(SentimentCoreAnnotations.SentimentAnnotatedTree.class); 
       int sentiment = RNNCoreAnnotations.getPredictedClass(tree); 
       String partText = sentence.toString(); 
       if (partText.length() > longest) { 
        mainSentiment = sentiment; 
        longest = partText.length(); 
       } 

      } 
     } 
     return mainSentiment; 
    } 
} 

我運行時錯誤是:

@laliyaD - Lalinda feels tired 
Exception in thread "Twitter4J Async Dispatcher[0]" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 
    at edu.stanford.nlp.pipeline.StanfordCoreNLP.<clinit>(StanfordCoreNLP.java:99) 
    at NLP.init(NLP.java:13) 
    at PrintSampleStream$1.onStatus(PrintSampleStream.java:38) 
    at twitter4j.StatusStreamImpl.onStatus(StatusStreamImpl.java:75) 
    at twitter4j.StatusStreamBase$1.run(StatusStreamBase.java:105) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    ... 8 more 

其實我從twitter4得到實時tweets學家任何幫助?

回答

1

您需要下載SLF4J(用於Java簡單的日誌門面),並將其包含在類路徑中。

您至少需要slf4j-api-1.7.21.jarslf4j-simple-1.7.21.jar以便能夠實際查看來自NLP庫的日誌消息。

http://www.slf4j.org/download.html

+0

它有大量的jar文件。我應該包括哪些jar文件/文件? –

+0

@LindindaSampath:你需要上面提到的''api''和''simple''罐子。 – ck1

1

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory表示在你的類路徑中需要slf4j庫。

如果你使用Maven的時候,你可以用這種依賴性:

<dependency> 
<groupId>org.slf4j</groupId> 
<artifactId>slf4j-simple</artifactId> 
<version>1.7.21</version> 
</dependency> 
+0

我沒有使用maven。你能告訴我哪些文件應該包含到我的slf4j庫的Java構建路徑中嗎? –

相關問題