web-dev-qa-db-fra.com

Stanford nlp pour python

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? 

13
90abyss

Utilisez py-corenlp

Télécharger Stanford 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 ;-)

Installer le paquet

unzip stanford-corenlp-full-2018-10-05.Zip
mv stanford-english-corenlp-2018-10-05-models.jar stanford-corenlp-full-2018-10-05

Démarrer le serveur

cd stanford-corenlp-full-2018-10-05
Java -mx5g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -timeout 10000

Remarques:

  1. 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.
  2. Il y a plus d'options , vous pouvez les lister avec --help.
  3. -mx5g devrait allouer suffisamment memory , mais YMMV et vous devrez peut-être modifier l'option si votre boîte est sous-alimentée.

Installez le paquet python

pip install pycorenlp

(Voir aussi la liste officielle ).

Utilise le

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

Remarques

  1. Vous transmettez le texte entier au serveur et le divise en phrases. Il divise également les phrases en jetons.
  2. Le sentiment est attribué à chaque phrase, pas au texte entier. Le meansentimentValue d'une phrase à l'autre peut être utilisé pour estimer le sentiment de l'ensemble du texte.
  3. Le sentiment moyen d'une phrase est compris entre Neutral (2) et Negative (1), la plage va de VeryNegative (0) à VeryPositive (4), ce qui semble être assez rare.
  4. Vous pouvez arrêter le serveur en tapant Ctrl-C sur le terminal depuis lequel vous l'avez démarré ou à l'aide de la commande Shell 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.
  5. Augmentez timeout (en millisecondes) sur le serveur ou le client si vous obtenez des erreurs de délai d'attente.
  6. 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'.
  7. Attention, le modèle de sentiment est quelque peu idiosyncrasique (par exemple, , le résultat est différent selon que vous mentionnez David ou Bill ).

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).

40
sds

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

1
cutteeth

Implémentation native en Python des outils de PNL de Stanford

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:

  • tokenisation
  • extension de jeton multi-mots (MWT)
  • lemmatisation
  • marquage des parties de discours (POS) et des caractéristiques morphologiques
  • analyse de dépendance

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.

1
Aleksander Pohl

Utiliser la bibliothèque python stanfordcore-nlp

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

Usage

# 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.

Plus d'informations

0
adam shamsudeen

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)
0
Géo Jolly

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.

0
Arnaud

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()
0
zwlayer

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;
    }

}
0
Hao Lyu