2016-12-29 5 views
2

sentiment Quand je entrée la phrase:sortie incorrecte lors de l'utilisation de Stanford CoreNLP Analyse

« Alors heureux d'être de retour Nous sommes là pour renouer avec & rencontrer de nouveaux innovateurs à ghc16! »

Ensuite, le sentiment retourné est négatif. Je ne peux pas comprendre la raison pour laquelle cela se produit. L'affirmation est positive mais elle renvoie toujours une valeur négative.

class SentimentAnalyzer { 

     public TweetWithSentiment findSentiment(String line) { 

     if(line == null || line.isEmpty()) { 
      throw new IllegalArgumentException("The line must not be null or empty."); 
     } 

     Annotation annotation = processLine(line); 

     int mainSentiment = findMainSentiment(annotation); 

     if(mainSentiment < 0 || mainSentiment > 4) { //You should avoid magic numbers like 2 or 4 try to create a constant that will provide a description why 2 
      return null; //You should avoid null returns 
     } 

     TweetWithSentiment tweetWithSentiment = new TweetWithSentiment(line, toCss(mainSentiment)); 
     return tweetWithSentiment; 

    } 

    private String toCss(int sentiment) { 
     switch (sentiment) { 
     case 0: 
      return "very negative"; 
     case 1: 
      return "negative"; 
     case 2: 
      return "neutral"; 
     case 3: 
      return "positive"; 
     case 4: 
      return "very positive"; 
     default: 
      return "default"; 
     } 

    } 


    private int findMainSentiment(Annotation annotation) { 

     int mainSentiment = Integer.MIN_VALUE; 
     int longest = Integer.MIN_VALUE; 


     for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) { 

      for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) { 

       String word = token.get(CoreAnnotations.TextAnnotation.class); 
       String pos = token.get(CoreAnnotations.PartOfSpeechAnnotation.class); 
       String ne = token.get(CoreAnnotations.NamedEntityTagAnnotation.class); 
       String lemma = token.get(CoreAnnotations.LemmaAnnotation.class); 

       System.out.println("word: " + word); 
       System.out.println("pos: " + pos); 
       System.out.println("ne: " + ne); 
       System.out.println("Lemmas: " + lemma); 

      }  

      int sentenceLength = String.valueOf(sentence).length(); 

      if(sentenceLength > longest) { 

      Tree tree = sentence.get(SentimentCoreAnnotations.SentimentAnnotatedTree.class); 

      mainSentiment = RNNCoreAnnotations.getPredictedClass(tree); 

      longest = sentenceLength ; 

      } 
     } 

     return mainSentiment; 

    } 


    private Annotation processLine(String line) { 

     StanfordCoreNLP pipeline = createPieline(); 

     return pipeline.process(line); 

    } 

    private StanfordCoreNLP createPieline() { 

     Properties props = createPipelineProperties(); 

     StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 

     return pipeline; 

    } 

    private Properties createPipelineProperties() { 

     Properties props = new Properties(); 
     props.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, sentiment"); 

     return props; 

    } 


} 

Répondre

0

Ceci est un autre cas de limitation de la technologie regarding nlp lib itself, principalement pour quelques points spécifiques:

  1. mots ambigües de sentiment - "Ce produit fonctionne terriblement" contre « Ce produit est terriblement bon "

  2. Négociations manquées -" Je ne serais jamais dans des millions d'années ay que ce produit vaut la peine d'acheter «

  3. Cité/texte indirect - « Mon père dit que ce produit est terrible, mais je suis en désaccord »

  4. Comparaisons - » Ce produit est aussi utile que un trou dans la tête »

  5. Tout ce subtil - « Ce produit est laid, lent et sans intérêt, mais il est la seule chose sur le marché qui fait le travail »

Dans votre exemple, il n'y a aucun problème avec l'algorithme. Analysons quelques parties du texte individuellement:

  • So excited to be back! ->positif
  • We're here to reconnect with ->neutre
  • meet new innovators at ghc16 ->neutre

Dans une simple moyenne, nous aurions quelque chose entre neutre et positif. Cependant, l'algorithme n'est pas prévisible comme nous l'avons vu, c'est pourquoi, si vous ajoutez un seul mot à votre texte (le & est également pas bien interprété):

donc heureux d'être de retour! Nous sommes ici pour reprendre contact avec vous et rencontre nouveaux innovateurs à ghc16

...il renverra comme résultat.


Suggestions:

  1. Ne pas considérer sentiment1 comme quelque chose de négatif, une fois que vous ferez face à de telles situations;
  2. Si vous pouvez contrôler, faites le texte le plus juste et le plus concis possible, afin d'obtenir de meilleurs résultats;
  3. Divisez les phrases autant que vous le pouvez et exécutez l'algorithme individuellement pour chacune d'entre elles. Ensuite, créez une moyenne personnalisée en fonction de vos propres cas de test.

Si aucun d'entre eux ne convient, envisager de passer à un autre Machine-learning technique.

+0

est-ce que cela signifie que «&» est interprété comme un négatif et y a-t-il d'autres symboles qui ont des problèmes similaires? –

+0

Ce n'est pas qu'ils sont négatifs, mais leur présence est confuse et le logiciel peut ne pas comprendre ce que signifie. Cette confusion fait que nlp tend vers le chemin négatif (avec l'absence de ** you **, ce qui le rend encore plus confus). Le point est: si vous le pouvez, remplacez les caractères spéciaux. :) – bosco