2013-03-27 2 views
5

Мне нужно сделать анализ настроений на некоторых файлах csv, содержащих твиты. Я использую SentiWordNet для анализа настроений.Как использовать SentiWordNet

Я получил следующий фрагмент кода Java, который они предоставили на своем сайте. Я не уверен, как его использовать. Путь файла csv, который я хочу проанализировать, - C:\Users\MyName\Desktop\tweets.csv. Путь SentiWordNet_3.0.0.txt - C:\Users\MyName\Desktop\SentiWordNet_3.0.0\home\swn\www\admin\dump\SentiWordNet_3.0.0_20130122.txt. Я новичок в java, спасибо за помощь, спасибо! Ссылка на пример java-кода ниже: this.

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Set; 
import java.util.Vector; 

public class SWN3 { 
    private String pathToSWN = "data"+File.separator+"SentiWordNet_3.0.0.txt"; 
    private HashMap<String, String> _dict; 

    public SWN3(){ 

     _dict = new HashMap<String, String>(); 
     HashMap<String, Vector<Double>> _temp = new HashMap<String, Vector<Double>>(); 
     try{ 
      BufferedReader csv = new BufferedReader(new FileReader(pathToSWN)); 
      String line = "";   
      while((line = csv.readLine()) != null) 
      { 
       String[] data = line.split("\t"); 
       Double score = Double.parseDouble(data[2])-Double.parseDouble(data[3]); 
       String[] words = data[4].split(" "); 
       for(String w:words) 
       { 
        String[] w_n = w.split("#"); 
        w_n[0] += "#"+data[0]; 
        int index = Integer.parseInt(w_n[1])-1; 
        if(_temp.containsKey(w_n[0])) 
        { 
         Vector<Double> v = _temp.get(w_n[0]); 
         if(index>v.size()) 
          for(int i = v.size();i<index; i++) 
           v.add(0.0); 
         v.add(index, score); 
         _temp.put(w_n[0], v); 
        } 
        else 
        { 
         Vector<Double> v = new Vector<Double>(); 
         for(int i = 0;i<index; i++) 
          v.add(0.0); 
         v.add(index, score); 
         _temp.put(w_n[0], v); 
        } 
       } 
      } 
      Set<String> temp = _temp.keySet(); 
      for (Iterator<String> iterator = temp.iterator(); iterator.hasNext();) { 
       String word = (String) iterator.next(); 
       Vector<Double> v = _temp.get(word); 
       double score = 0.0; 
       double sum = 0.0; 
       for(int i = 0; i < v.size(); i++) 
        score += ((double)1/(double)(i+1))*v.get(i); 
       for(int i = 1; i<=v.size(); i++) 
        sum += (double)1/(double)i; 
       score /= sum; 
       String sent = "";    
       if(score>=0.75) 
        sent = "strong_positive"; 
       else 
       if(score > 0.25 && score<=0.5) 
        sent = "positive"; 
       else 
       if(score > 0 && score>=0.25) 
        sent = "weak_positive"; 
       else 
       if(score < 0 && score>=-0.25) 
        sent = "weak_negative"; 
       else 
       if(score < -0.25 && score>=-0.5) 
        sent = "negative"; 
       else 
       if(score<=-0.75) 
        sent = "strong_negative"; 
       _dict.put(word, sent); 
      } 
     } 
     catch(Exception e){e.printStackTrace();}   
    } 

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

Newcode:

public class SWN3 { 
     private String pathToSWN = "C:\\Users\\MyName\\Desktop\\SentiWordNet_3.0.0\\home\\swn\\www\\admin\\dump\\SentiWordNet_3.0.0.txt"; 
    private HashMap<String, String> _dict; 

    public SWN3(){ 

     _dict = new HashMap<String, String>(); 
     HashMap<String, Vector<Double>> _temp = new HashMap<String, Vector<Double>>(); 
     try{ 
      BufferedReader csv = new BufferedReader(new FileReader(pathToSWN)); 
      String line = "";   
      while((line = csv.readLine()) != null) 
      { 
       String[] data = line.split("\t"); 
       Double score = Double.parseDouble(data[2])-Double.parseDouble(data[3]); 
       String[] words = data[4].split(" "); 
       for(String w:words) 
       { 
        String[] w_n = w.split("#"); 
        w_n[0] += "#"+data[0]; 
        int index = Integer.parseInt(w_n[1])-1; 
        if(_temp.containsKey(w_n[0])) 
        { 
         Vector<Double> v = _temp.get(w_n[0]); 
         if(index>v.size()) 
          for(int i = v.size();i<index; i++) 
           v.add(0.0); 
         v.add(index, score); 
         _temp.put(w_n[0], v); 
        } 
        else 
        { 
         Vector<Double> v = new Vector<Double>(); 
         for(int i = 0;i<index; i++) 
          v.add(0.0); 
         v.add(index, score); 
         _temp.put(w_n[0], v); 
        } 
       } 
      } 
      Set<String> temp = _temp.keySet(); 
      for (Iterator<String> iterator = temp.iterator(); iterator.hasNext();) { 
       String word = (String) iterator.next(); 
       Vector<Double> v = _temp.get(word); 
       double score = 0.0; 
       double sum = 0.0; 
       for(int i = 0; i < v.size(); i++) 
        score += ((double)1/(double)(i+1))*v.get(i); 
       for(int i = 1; i<=v.size(); i++) 
        sum += (double)1/(double)i; 
       score /= sum; 
       String sent = "";    
       if(score>=0.75) 
        sent = "strong_positive"; 
       else 
       if(score > 0.25 && score<=0.5) 
        sent = "positive"; 
       else 
       if(score > 0 && score>=0.25) 
        sent = "weak_positive"; 
       else 
       if(score < 0 && score>=-0.25) 
        sent = "weak_negative"; 
       else 
       if(score < -0.25 && score>=-0.5) 
        sent = "negative"; 
       else 
       if(score<=-0.75) 
        sent = "strong_negative"; 
       _dict.put(word, sent); 
      } 
     } 
     catch(Exception e){e.printStackTrace();}   
    } 

    public Double extract(String word) 
    { 
     Double total = new Double(0); 
     if(_dict.get(word+"#n") != null) 
      total = _dict.get(word+"#n") + total; 
     if(_dict.get(word+"#a") != null) 
      total = _dict.get(word+"#a") + total; 
     if(_dict.get(word+"#r") != null) 
      total = _dict.get(word+"#r") + total; 
     if(_dict.get(word+"#v") != null) 
      total = _dict.get(word+"#v") + total; 
     return total; 
    } 

    public String classifytweet(){ 
     String[] words = twit.split("\\s+"); 
     double totalScore = 0, averageScore; 
     for(String word : words) { 
      word = word.replaceAll("([^a-zA-Z\\s])", ""); 
      if (_sw.extract(word) == null) 
       continue; 
      totalScore += _sw.extract(word); 
     } 
     Double AverageScore = totalScore; 

     if(averageScore>=0.75) 
      return "very positive"; 
     else if(averageScore > 0.25 && averageScore<0.5) 
      return "positive"; 
     else if(averageScore>=0.5) 
      return "positive"; 
     else if(averageScore < 0 && averageScore>=-0.25) 
      return "negative"; 
     else if(averageScore < -0.25 && averageScore>=-0.5) 
      return "negative"; 
     else if(averageScore<=-0.75) 
      return "very negative"; 
     return "neutral"; 
    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
    } 

ответ

7

Прежде всего начала, удалив все "мусор" на первом из файла (который включает в себя описание, инструкции и т.д ..)

Возможным использования чтобы изменить SWN3 сделать метод extract в нем возвращают Double:

public Double extract(String word) 
{ 
    Double total = new Double(0); 
    if(_dict.get(word+"#n") != null) 
     total = _dict.get(word+"#n") + total; 
    if(_dict.get(word+"#a") != null) 
     total = _dict.get(word+"#a") + total; 
    if(_dict.get(word+"#r") != null) 
     total = _dict.get(word+"#r") + total; 
    if(_dict.get(word+"#v") != null) 
     total = _dict.get(word+"#v") + total; 
    return total; 
} 

Затем, если вы хотите пометить строку, которую вы хотите пометить, вы можете разбить ее, чтобы она имела только слова (без признаков и неизвестных символов) и используя результат, возвращаемый методом extract для каждого слова, вы можете решить, что такое средний вес строки:

String[] words = twit.split("\\s+"); 
double totalScore = 0, averageScore; 
for(String word : words) { 
    word = word.replaceAll("([^a-zA-Z\\s])", ""); 
    if (_sw.extract(word) == null) 
     continue; 
    totalScore += _sw.extract(word); 
} 
verageScore = totalScore; 

if(averageScore>=0.75) 
    return "very positive"; 
else if(averageScore > 0.25 && averageScore<0.5) 
    return "positive"; 
else if(averageScore>=0.5) 
    return "positive"; 
else if(averageScore < 0 && averageScore>=-0.25) 
    return "negative"; 
else if(averageScore < -0.25 && averageScore>=-0.5) 
    return "negative"; 
else if(averageScore<=-0.75) 
    return "very negative"; 
return "neutral"; 

Я нашел этот способ проще, и он отлично работает для меня.


UPDATE:

Я изменил _dict к _dict = new HashMap<String, Double>(); Так он будет иметь String ключ и значение Double.

Так я заменил _dict.put(word, sent); желаю _dict.put(word, score);

+0

Привет, спасибо за ответ, я до сих пор не понял некоторые детали. Что это значит? if (_dict.get (word + "# r")! = null) # n, # a, # r, # v? Благодаря! – Belgarion

+1

Если вы посмотрите на первый столбец файла, вы заметите эти буквы (которые означают * существительное *, * глагол * ..), поэтому вы должны охватить все случаи. – Maroun

+1

А я вижу. Мне все еще нужна дополнительная помощь, где я могу поместить свою ссылку в файл tweet.csv? C: \ Users \ MyName \ Desktop \ tweets.csv Я вставил свой обновленный код выше, pls не стесняйтесь его редактировать, спасибо! – Belgarion

0

для этого вы должны написать основную функцию, что обеспечивает путь CSV, извлекать слова из него. а затем вызовите функцию извлечения, отправив слово и его pos.

Смежные вопросы