Comment utiliser SentiWordNet
J'ai besoin de faire l'analyse des sentiments sur certains fichiers csv contenant les tweets. Je suis en utilisant SentiWordNet à faire de l'analyse de sentiment.
J'ai eu le morceau suivant de l'exemple de code java, qu'ils ont fourni sur leur site. Je ne suis pas sûr de la façon de l'utiliser. Le chemin d'accès du fichier csv que je veux analyser est C:\Users\MyName\Desktop\tweets.csv
. Le chemin de la SentiWordNet_3.0.0.txt
est C:\Users\MyName\Desktop\SentiWordNet_3.0.0\home\swn\www\admin\dump\SentiWordNet_3.0.0_20130122.txt
. Je suis nouveau sur java, pls aider, merci! Le lien vers l'exemple de code java ci-dessous est cette.
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
}
OriginalL'auteur Belgarion | 2013-03-27
Vous devez vous connecter pour publier un commentaire.
Tout d'abord commencer par supprimer tous les "déchets" au début du fichier (qui comprend la description, instructions, etc..)
L'une des utilisations possibles est de changer
SWN3
faire de la méthodeextract
en renvoyer unDouble
:Puis, donnant une Chaîne que vous souhaitez ajouter des étiquettes, vous pouvez le séparer de sorte qu'il ne disposerez que de mots (sans les signes et les caractères inconnus) et en utilisant le résultat renvoyé de
extract
méthode sur chaque mot, vous pouvez décider quel est le poids moyen de la Chaîne:J'ai trouvé cette façon plus facile et il fonctionne très bien pour moi.
Mise à JOUR:
J'ai changé
_dict
à_dict = new HashMap<String, Double>();
Alors il aura unString
clé et unDouble
valeur.Je l'ai donc remplacé
_dict.put(word, sent);
souhaitez_dict.put(word, score);
Si vous regardez la première colonne du fichier, vous remarquerez ces lettres (qui signifie nom, verbe..), de sorte que vous devrait couvrir tous les cas.
Ah, je vois. J'ai encore besoin d'un peu plus d'aide, où j'ai mis mon lien de mon tweet.fichier csv? C:\Users\MyName\Desktop\tweets.csv j'ai collé mon code mis à jour ci-dessus, les pls se sentent libres de le modifier, merci!
Désolé de poser autant de, Haha.. je suis nouvelle, voudrais vraiment l'apprécier! =)
Je ne comprends pas votre question, pouvez-vous nous expliquer une fois de plus? Et n'hésitez pas à demander ce que vous voulez 🙂
OriginalL'auteur Maroun
pour que vous devriez écrire la fonction principale, qui fournissent le chemin de csv, extrait des mots. et puis l'appel de l'extrait de fonction en envoyant le mot et son encaissement.
OriginalL'auteur user2215524