2017-02-14 65 views
0
package org.citi.sentimentapi; 

    @RestController 
    public class SentimentController{ 

     @Autowired 
     private SentimentService sv; 

     @RequestMapping("/sentiment/{text}") 
     public double apply(@PathVariable String text) throws Exception { 
      return sv.apply(text); 
     } 
} 

表示以下異常來:不滿意依賴通過實地 'SV'

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sentimentController': Unsatisfied dependency expressed through field 'sv'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sentimentService' defined in file [C:\Users\MG23625\Desktop\workspace\sentiment-apiImproved\target\classes\org\citi\sentimentapi\SentimentService.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.citi.sentimentapi.SentimentService]: Constructor threw exception; nested exception is java.lang.NullPointerException: in must not be null 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE] 
    at org.citi.sentimentapi.Sentiment.main(Sentiment.java:11) [classes/:na] 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sentimentService' defined in file [C:\Users\MG23625\Desktop\workspace\sentiment-apiImproved\target\classes\org\citi\sentimentapi\SentimentService.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.citi.sentimentapi.SentimentService]: Constructor threw exception; nested exception is java.lang.NullPointerException: in must not be null 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1155) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1099) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    ... 19 common frames omitted 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.citi.sentimentapi.SentimentService]: Constructor threw exception; nested exception is java.lang.NullPointerException: in must not be null 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1147) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    ... 30 common frames omitted 
Caused by: java.lang.NullPointerException: in must not be null 
    at java.util.Objects.requireNonNull(Objects.java:228) ~[na:1.8.0_121] 
    at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:194) ~[opennlp-tools-1.7.2.jar:1.7.2] 
    at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:173) ~[opennlp-tools-1.7.2.jar:1.7.2] 
    at opennlp.tools.postag.POSModel.<init>(POSModel.java:82) ~[opennlp-tools-1.7.2.jar:1.7.2] 
    at org.citi.sentimentapi.SentimentService$POSTagger.<init>(SentimentService.java:120) ~[classes/:na] 
    at org.citi.sentimentapi.SentimentService$SentimentAnalyzer.<init>(SentimentService.java:289) ~[classes/:na] 
    at org.citi.sentimentapi.SentimentService.<init>(SentimentService.java:388) ~[classes/:na] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_121] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_121] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_121] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_121] 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ~[spring-beans-4.3.6.RELEASE.jar:4.3.6.RELEASE] 
    ... 32 common frames omitted 

我的代碼:

package org.citi.sentimentapi; 

    @Service 
    public class SentimentService { 

     class Word 
     { 
      public Word(String word, String pennTag) 
      { 
       if (word == null || word.isEmpty()) 
        throw new IllegalArgumentException("word"); 
       if (pennTag == null || pennTag.isEmpty()) 
        throw new IllegalArgumentException("posTagInfo"); 

       this.word = word.toLowerCase(); 
       this.pennTag = pennTag.toUpperCase(); 

       tag = fromPennTreebankTag(pennTag); 
      } 
      private String word; 
      public String getWord() {return word;} 
      private String pennTag; 
      public String getPennTag() {return pennTag;} 
      private String tag; 
      public String getTag() {return tag;} 
      public boolean hasTag() {return tag != null;} 

      String fromPennTreebankTag(String value) 
      { 
       return 
        value.startsWith("J") ? "a" : 
        value.startsWith("V") ? "v" : 
        value.startsWith("N") ? "n" : 
        value.startsWith("R") ? "r" : null; 
      } 

      @Override 
      public String toString() 
      { 
       return hasTag() ? word + ":" + tag : word; 
      } 
     } 

     abstract class Phrase 
     { 
      public Phrase(Word[] words) 
      { 
       if (words.length == 0) 
        throw new IllegalArgumentException(); 
       this.words = words; 
      } 
      private Word[] words; 
      public Word[] getWords() {return words;} 
      public abstract double modifyScore(double value); 
     } 

     class Incrementer extends Phrase 
     { 
      public Incrementer(Word... words) {super(words);} 
      @Override 
      public double modifyScore(double value) {return value * 2;} 
     } 

     class Inverter extends Phrase 
     { 
      public Inverter(Word... words) {super(words);} 
      @Override 
      public double modifyScore(double value) {return value * -1;} 
     } 

     class Decrementer extends Phrase 
     { 
      public Decrementer(Word... words) {super(words);} 
      @Override 
      public double modifyScore(double value) {return value/2;} 
     } 

     class POSTagger 
     { 
      POSTaggerME posTagger; 
      Tokenizer tokenizer; 
      SentenceDetectorME sentDetector; 

      public POSTagger() throws IOException 
      { 
       ClassLoader loader = getClass().getClassLoader(); 
       //ClassLoader loader = Thread.currentThread().getContextClassLoader(); 

       posTagger = new POSTaggerME(
         new POSModel(loader.getResourceAsStream("en-pos-maxent.bin"))); 
       tokenizer = new TokenizerME(
         new TokenizerModel(loader.getResourceAsStream("en-token.bin"))); 
       sentDetector = new SentenceDetectorME(
         new SentenceModel(loader.getResourceAsStream("en-sent.bin"))); 
      } 

      public Word[][] tag(String input) 
      { 
       String[] sents = sentDetector.sentDetect(input); 
       Word[][] res = new Word[sents.length][]; 

       for (int i = 0; i < sents.length; i++) 
       { 
        String[] words = tokenizer.tokenize(sents[i]); 
        String[] tags = posTagger.tag(words); 
        Word[] sentence = new Word[words.length]; 

        for (int j = 0; j < words.length; j++) 
         sentence[j] = new Word(words[j], tags[j]); 

        res[i] = sentence; 
       } 
       return res; 
      } 
     } 

     class WordNetLemmatizer 
     { 
      Dictionary dictionary; 
      public WordNetLemmatizer() throws JWNLException 
      { 
       //dictionary = Dictionary.getDefaultResourceInstance(); 
      } 

      public Word getLemmatized(Word word) throws JWNLException 
      { 
       if (!word.hasTag()) 
        return word; 

       IndexWord iw = dictionary.lookupIndexWord(POS.getPOSForKey(word.getTag()), word.getWord()); 
       if (iw == null) 
        return word; 

       String lemma = iw.getLemma(); 
       if (lemma == null || lemma.isEmpty()) 
        return word; 

       return new Word(lemma, word.getPennTag()); 
      } 
     } 

     abstract class SentimentDictionary 
     { 
      abstract double getScore(Word word); 
     } 

     class SentiWordNet extends SentimentDictionary 
     { 
      String path = "C:\\Users\\MG23625\\Downloads\\SentiWordNet_3.0.0\\home\\swn\\www\\admin\\dump\\SentiWordNet_3.0.0_20130122.txt"; 
      Map<String, Double> dictionary; 

      public SentiWordNet() throws IOException 
      { 
       // This is our main dictionary representation 
       dictionary = new HashMap<>(); 

       // From String to list of doubles. 
       HashMap<String, HashMap<Integer, Double>> tempDictionary = new HashMap<>(); 

       try (BufferedReader csv = new BufferedReader(new FileReader(path))) 
       { 
        int lineNumber = 0; 

        String line; 
        while ((line = csv.readLine()) != null) 
        { 
         lineNumber++; 

         // If it's a comment, skip this line. 
         if (!line.trim().startsWith("#")) 
         { 
          // We use tab separation 
          String[] data = line.split("\t"); 
          String wordTypeMarker = data[0]; 

          // Example line: 
          // POS ID PosS NegS SynsetTerm#sensenumber Desc 
          // a 00009618 0.5 0.25 spartan#4 austere#3 ascetical#2 
          // ascetic#2 practicing great self-denial;...etc 

          // Is it a valid line? Otherwise, through exception. 
          if (data.length != 6) 
          { 
           throw new IllegalArgumentException(
             "Incorrect tabulation format in file, line: " + lineNumber); 
          } 

          // Calculate synset score as score = PosS - NegS 
          Double synsetScore = 
            Double.parseDouble(data[2]) - Double.parseDouble(data[3]); 

          // Get all Synset terms 
          String[] synTermsSplit = data[4].split(" "); 

          // Go through all terms of current synset. 
          for (String synTermSplit : synTermsSplit) 
          { 
           // Get synterm and synterm rank 
           String[] synTermAndRank = synTermSplit.split("#"); 
           String synTerm = synTermAndRank[0] + "#" + wordTypeMarker; 

           int synTermRank = Integer.parseInt(synTermAndRank[1]); 
           // What we get here is a map of the type: 
           // term -> {score of synset#1, score of synset#2...} 

           // Add map to term if it doesn't have one 
           if (!tempDictionary.containsKey(synTerm)) 
            tempDictionary.put(synTerm, new HashMap<Integer, Double>()); 

           // Add synset link to synterm 
           tempDictionary.get(synTerm).put(synTermRank, synsetScore); 
          } 
         } 
        } 

        // Go through all the terms. 
        for (Map.Entry<String, HashMap<Integer, Double>> entry : tempDictionary.entrySet()) 
        { 
         String word = entry.getKey(); 
         Map<Integer, Double> synSetScoreMap = entry.getValue(); 

         // Calculate weighted average. Weigh the synsets according to 
         // their rank. 
         // Score= 1/2*first + 1/3*second + 1/4*third ..... etc. 
         // Sum = 1/1 + 1/2 + 1/3 ... 
         double score = 0.0; 
         double sum = 0.0; 
         for (Map.Entry<Integer, Double> setScore : synSetScoreMap.entrySet()) 
         { 
          score += setScore.getValue()/(double) setScore.getKey(); 
          sum += 1.0/(double) setScore.getKey(); 
         } 
         score /= sum; 

         dictionary.put(word, score); 
        } 
       } 
      } 

      @Override 
      public double getScore(Word word) 
      { 
       if (!word.hasTag()) 
        return Double.NaN; 
       return dictionary.getOrDefault(word.getWord() + "#" + word.getTag(), Double.NaN); 
      } 
     } 

     class SentimentAnalyzer 
     { 
      Map<String, Phrase> phrases; 
      POSTagger posTagger; 
      WordNetLemmatizer lemmatizer; 
      SentimentDictionary sentimentDict; 

      public SentimentAnalyzer(SentimentDictionary dictionary) throws JWNLException, IOException 
      { 
       lemmatizer = new WordNetLemmatizer(); 
       posTagger = new POSTagger(); 
       sentimentDict = dictionary; 

       phrases = new HashMap<>(); 

       addPhrase(new Inverter(new Word("lack", "NN"), new Word("of", "IN"))); 
       addPhrase(new Inverter(new Word("not", "RB"))); 
       addPhrase(new Inverter(new Word("n't", "RB"))); 

       addPhrase(new Incrementer(new Word("too", "RB"))); 
       addPhrase(new Incrementer(new Word("very", "RB"))); 
       addPhrase(new Incrementer(new Word("sorely", "RB"))); 

       addPhrase(new Decrementer(new Word("barely", "RB"))); 
       addPhrase(new Decrementer(new Word("little", "RB"))); 
      } 

      void addPhrase(Phrase value) throws JWNLException 
      { 
       phrases.put(value.getWords()[0].getWord(), value); 
      } 

      public double getScore(String input) throws JWNLException 
      { 
       double totalScore = 0; 
       Word[][] sentences = posTagger.tag(input); 
       for (Word[] sentence : sentences) 
       { 
        for (int i = 0; i < sentence.length; i++) 
        { 
         Word word = sentence[i]; 
         Phrase p = phrases.get(word.getWord()); 
         Phrase phrase = null; 

         if (p != null && 
          sentence.length - i > p.getWords().length && 
          containsPhrase(sentence, i, p.getWords())) 
         { 
          phrase = p; 
          i += phrase.getWords().length; 
          int j = i; 
          for (; j < sentence.length && !sentence[j].hasTag(); j++) ; 
          if (j == sentence.length) 
           continue; 
          word = sentence[j]; 
         } 
         else if (!word.hasTag()) 
          continue; 

         double score = sentimentDict.getScore(word); 
         if (Double.isNaN(score)) 
         { 
          word = lemmatizer.getLemmatized(word); 
          score = sentimentDict.getScore(word); 
         } 

         if (!Double.isNaN(score)) 
         { 
          if (phrase != null) 
          { 
           score = phrase.modifyScore(score); 

           //out.format("<%s> ", String.join(" ", 
           // stream(phrase.getWords()).map(Word::toString).toArray(String[]::new))); 
          } 
          //out.format("%s:%.2f ", word, score); 

          totalScore += score; 
         } 
         else 
         { 
          //out.format("%s ", word); 
         } 
        } 
        //out.println(); 
       } 
       return totalScore; 
      } 

      boolean containsPhrase(Word[] sentence, int index, Word[] phrase) 
      { 
       if (phrase.length == 0 || 
        index >= sentence.length || 
        sentence.length - index < phrase.length) 
       {return false;} 

       for (int pi = 0, si = index; pi < phrase.length; pi++, si++) 
       { 
        if (sentence[si].getWord().compareTo(phrase[pi].getWord()) != 0 || 
         sentence[si].getPennTag().compareTo(phrase[pi].getPennTag()) != 0) 
        {return false;} 
       } 
       return true; 
      } 
     } 

     public SentimentService() throws Exception 
     { 
      if (analyzer == null) 
       analyzer = new SentimentAnalyzer(new SentiWordNet()); 
      //setCacheable(true); 
     } 

     static SentimentAnalyzer analyzer; 

     public double apply(String input) throws Exception 
      { 
       double score = analyzer.getScore(input);    
       return score; 
      } 


    } 

我評論setCacheable(真),因爲它是給了一個錯誤。有人可以幫忙嗎?

回答

0

您在POSTagger構造在線路120

Caused by: java.lang.NullPointerException: in must not be null 
    at java.util.Objects.requireNonNull(Objects.java:228) ~[na:1.8.0_121] 
    at opennlp.tools.util.model.BaseModel.loadModel(BaseModel.java:194) ~[opennlp-tools-1.7.2.jar:1.7.2] 
    at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:173) ~[opennlp-tools-1.7.2.jar:1.7.2] 
    at opennlp.tools.postag.POSModel.<init>(POSModel.java:82) ~[opennlp-tools-1.7.2.jar:1.7.2] 
    at org.citi.sentimentapi.SentimentService$POSTagger.<init>(SentimentService.java:120) ~[classes/:na] 
    at org.citi.sentimentapi.SentimentService$SentimentAnalyzer.<init>(SentimentService.java:289) ~[classes/:na] 

就怎麼做了NPE它檢查What is a NullPointerException, and how do I fix it?

但說實話,你最好重構你的代碼,否則你將有很多這樣的「難以逾越的「例外,因爲它是超級混亂。

首先移動類別以分開java文件。

相關問題