2013-03-27 3 views
0

나는 문장 다음 단계에서 양 또는 음인지를 찾기 위해 노력하고 있어요 :심리 분석 (SentiWordNet) - 문장의 문맥을 판단

1) 연설의 부품을 가져 오는 (동사 , 명사, 형용사 등)을 Stanford NLP 파서를 사용하여 분석합니다.

2.) SentiWordNet을 사용하여 음성의 각 부분과 관련된 양수 값과 음수 값을 찾습니다. 문장과 관련된 순 긍정적순 부정적인 값을 계산 얻은 양과 음의 값을 합산

3).

하지만 문제는 SentiWordNet이 다른 감각/상황에 따라 양수/음수 값 목록을 반환한다는 것입니다. SentiWordNet 파서에 품사와 함께 특정 문장을 전달하여 감각/문맥을 자동으로 판단하고 양수와 음수의 쌍을 쌍만 반환 할 수 있습니까?

또는이 문제에 대한 다른 해결책이 있습니까?

감사합니다.

답변

1

우리는 sentiwordnet 파서에 pos를 전달할 수 있습니다. 다운로드 패턴 파이썬 모듈

from pattern.en import wordnet 

print wordnet.synsets("kill",pos="VB")[0].weight 

wordnet.synsets는 synset을 의 목록을 반환 우리는 (극성, 주관)이 도움이 희망의 튜플 될 것이다 첫번째 항목 출력을 선택하는 것과

2

SentoWordNet Demo Code 도움이 될만한 정보가 있습니다.

// Copyright 2013 Petter Törnberg 
// 
// This demo code has been kindly provided by Petter Törnberg <[email protected]> 
// for the SentiWordNet website. 
// 
// This program is free software: you can redistribute it and/or modify 
// it under the terms of the GNU General Public License as published by 
// the Free Software Foundation, either version 3 of the License, or 
// (at your option) any later version. 
// 
// This program is distributed in the hope that it will be useful, 
// but WITHOUT ANY WARRANTY; without even the implied warranty of 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
// GNU General Public License for more details. 
// 
// You should have received a copy of the GNU General Public License 
// along with this program. If not, see <http://www.gnu.org/licenses/>. 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

public class SentiWordNetDemoCode { 

    private Map<String, Double> dictionary; 

    public SentiWordNetDemoCode(String pathToSWN) throws IOException { 
     // This is our main dictionary representation 
     dictionary = new HashMap<String, Double>(); 

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

     BufferedReader csv = null; 
     try { 
      csv = new BufferedReader(new FileReader(pathToSWN)); 
      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); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (csv != null) { 
       csv.close(); 
      } 
     } 
    } 

    public double extract(String word, String pos) { 
     return dictionary.get(word + "#" + pos); 
    } 

    public static void main(String [] args) throws IOException { 
     if(args.length<1) { 
      System.err.println("Usage: java SentiWordNetDemoCode <pathToSentiWordNetFile>"); 
      return; 
     } 

     String pathToSWN = args[0]; 
     SentiWordNetDemoCode sentiwordnet = new SentiWordNetDemoCode(pathToSWN); 

     System.out.println("good#a "+sentiwordnet.extract("good", "a")); 
     System.out.println("bad#a "+sentiwordnet.extract("bad", "a")); 
     System.out.println("blue#a "+sentiwordnet.extract("blue", "a")); 
     System.out.println("blue#n "+sentiwordnet.extract("blue", "n")); 
    } 
} 
+0

'sentiwordnet.extract()'함수의 결과로 반환되는 값 (예제와 함께)을 자세히 설명해 주시겠습니까? –