Tout ce que je veux faire est de trouver le sentiment (positif/négatif/neutre) d'une chaîne donnée. En faisant des recherches, je suis tombé sur la PNL de Stanford. Mais malheureusement, c'est en Java. Des idées sur comment puis-je le faire fonctionner pour Python?
py-corenlp
La dernière version en ce moment (2018-10-23) est la 3.9.2:
wget https://nlp.stanford.edu/software/stanford-corenlp-full-2018-10-05.Zip https://nlp.stanford.edu/software/stanford-english-corenlp-2018-10-05-models.jar
Si vous n'avez pas wget
, vous avez probablement curl
:
curl https://nlp.stanford.edu/software/stanford-corenlp-full-2018-10-05.Zip -O https://nlp.stanford.edu/software/stanford-english-corenlp-2018-10-05-models.jar -O
Si tout échoue, utilisez le navigateur ;-)
unzip stanford-corenlp-full-2018-10-05.Zip
mv stanford-english-corenlp-2018-10-05-models.jar stanford-corenlp-full-2018-10-05
cd stanford-corenlp-full-2018-10-05
Java -mx5g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -timeout 10000
Remarques:
timeout
est en millisecondes, je l'ai réglé à 10 secondes plus haut. Vous devriez l'augmenter si vous transmettez d'énormes blobs au serveur.--help
.-mx5g
devrait allouer suffisamment memory , mais YMMV et vous devrez peut-être modifier l'option si votre boîte est sous-alimentée.pip install pycorenlp
(Voir aussi la liste officielle ).
from pycorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('http://localhost:9000')
res = nlp.annotate("I love you. I hate him. You are Nice. He is dumb",
properties={
'annotators': 'sentiment',
'outputFormat': 'json',
'timeout': 1000,
})
for s in res["sentences"]:
print("%d: '%s': %s %s" % (
s["index"],
" ".join([t["Word"] for t in s["tokens"]]),
s["sentimentValue"], s["sentiment"]))
et vous obtiendrez:
0: 'I love you .': 3 Positive
1: 'I hate him .': 1 Negative
2: 'You are Nice .': 3 Positive
3: 'He is dumb': 1 Negative
sentimentValue
d'une phrase à l'autre peut être utilisé pour estimer le sentiment de l'ensemble du texte.Neutral
(2) et Negative
(1), la plage va de VeryNegative
(0) à VeryPositive
(4), ce qui semble être assez rare.kill $(lsof -ti tcp:9000)
. 9000
est le port par défaut, vous pouvez le modifier à l'aide de l'option -port
lors du démarrage du serveur.timeout
(en millisecondes) sur le serveur ou le client si vous obtenez des erreurs de délai d'attente.sentiment
est juste un annotateur, il y a beaucoup plus , et vous pouvez en demander plusieurs en les séparant par virgule: 'annotators': 'sentiment,lemma'
.PS. Je ne peux pas croire que j’ai ajouté une neuvième réponse, mais je suppose que j’ai dû le faire, puisqu’aucune des réponses existantes ne m’a aidé (certaines des 8 les réponses précédentes ont été supprimées, d'autres ont été converties en commentaires).
Textblob
est un excellent package pour l'analyse sentimentale écrite en Python
. Vous pouvez avoir les docs ici . L'analyse sentimentale d'une phrase donnée est effectuée en inspectant les mots et leur score émotionnel correspondant (sentiment). Vous pouvez commencer avec
$ pip install -U textblob
$ python -m textblob.download_corpora
La première commande pip install vous donnera la dernière version de textblob installée sur votre système (virtualenv
) puisque vous passez -U will upgrade the pip package its latest available version
. Et la prochaine téléchargera toutes les données requises, la corpus
.
Récemment, Stanford a publié un nouvel algorithme basé sur le réseau de neurones (NN) mis en œuvre par Python pour les tâches les plus importantes de la PNL:
Il est implémenté en Python et utilise PyTorch comme bibliothèque NN. Le paquet contient des modèles précis pour plus de 50 langues .
Pour installer, vous pouvez utiliser PIP:
pip install stanfordnlp
Pour effectuer des tâches de base, vous pouvez utiliser l'interface Python native avec de nombreux algorithmes NLP :
import stanfordnlp
stanfordnlp.download('en') # This downloads the English models for the neural pipeline
nlp = stanfordnlp.Pipeline() # This sets up a default neural pipeline in English
doc = nlp("Barack Obama was born in Hawaii. He was elected president in 2008.")
doc.sentences[0].print_dependencies()
MODIFIER:
Jusqu'à présent, la bibliothèque ne supporte pas le sentiment, mais je ne supprime pas la réponse, car elle répond directement à la partie "Stanford nlp for python" de la question.
stanford-corenlp est un très bon wrapper sur stanfordcore-nlp pour l’utiliser en python.
wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-10-05.Zip
# Simple usage
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('/Users/name/stanford-corenlp-full-2018-10-05')
sentence = 'Guangdong University of Foreign Studies is located in Guangzhou.'
print('Tokenize:', nlp.Word_tokenize(sentence))
print('Part of Speech:', nlp.pos_tag(sentence))
print('Named Entities:', nlp.ner(sentence))
print('Constituency Parsing:', nlp.parse(sentence))
print('Dependency Parsing:', nlp.dependency_parse(sentence))
nlp.close() # Do not forget to close! The backend server will consume a lot memory.
Je suggère d'utiliser la bibliothèque TextBlob. Un exemple d'implémentation ressemble à ceci:
from textblob import TextBlob
def sentiment(message):
# create TextBlob object of passed Tweet text
analysis = TextBlob(message)
# set sentiment
return (analysis.sentiment.polarity)
Je suis confronté au même problème: peut-être une solution avec stanford_corenlp_py qui utilise Py4j
comme indiqué par @roopalgarg.
stanford_corenlp_py
Ce référentiel fournit une interface Python pour appeler les annotateurs "sentiment" et "entitymentions" du package Java CoreNLP de Stanford, à jour de la v. 3.5.1. Il utilise py4j pour interagir avec la machine virtuelle Java; en tant que tel, pour exécuter un script tel que scripts/runGateway.py, vous devez d’abord compiler et exécuter les classes Java créant la passerelle JVM.
Il y a un progrès très nouveau sur cette question:
Vous pouvez maintenant utiliser le paquetage stanfordnlp
dans le python:
À partir du README :
>>> import stanfordnlp
>>> stanfordnlp.download('en') # This downloads the English models for the neural pipeline
>>> nlp = stanfordnlp.Pipeline() # This sets up a default neural pipeline in English
>>> doc = nlp("Barack Obama was born in Hawaii. He was elected president in 2008.")
>>> doc.sentences[0].print_dependencies()
J'ai aussi fait face à une situation similaire. La plupart de mes projets sont en Python et la partie sentiment est en Java. Heureusement, il est assez facile de savoir comment utiliser le bocal stanford CoreNLP.
Voici l'un de mes scripts et vous pouvez télécharger des fichiers JAR et les exécuter.
import Java.util.List;
import Java.util.Properties;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.neural.rnn.RNNCoreAnnotations;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.sentiment.SentimentCoreAnnotations.SentimentAnnotatedTree;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.util.ArrayCoreMap;
import edu.stanford.nlp.util.CoreMap;
public class Simple_NLP {
static StanfordCoreNLP pipeline;
public static void init() {
Properties props = new Properties();
props.setProperty("annotators", "tokenize, ssplit, parse, sentiment");
pipeline = new StanfordCoreNLP(props);
}
public static String findSentiment(String Tweet) {
String SentiReturn = "";
String[] SentiClass ={"very negative", "negative", "neutral", "positive", "very positive"};
//Sentiment is an integer, ranging from 0 to 4.
//0 is very negative, 1 negative, 2 neutral, 3 positive and 4 very positive.
int sentiment = 2;
if (Tweet != null && Tweet.length() > 0) {
Annotation annotation = pipeline.process(Tweet);
List<CoreMap> sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class);
if (sentences != null && sentences.size() > 0) {
ArrayCoreMap sentence = (ArrayCoreMap) sentences.get(0);
Tree tree = sentence.get(SentimentAnnotatedTree.class);
sentiment = RNNCoreAnnotations.getPredictedClass(tree);
SentiReturn = SentiClass[sentiment];
}
}
return SentiReturn;
}
}