Stanford nlp para python

Todo lo que quiero hacer es encontrar el sentimiento (positivo / negativo / neutral) de cualquier cadena dada. En la investigación me encontré con Stanford PNL. Pero lamentablemente está en Java. ¿Alguna idea sobre cómo puedo hacer que funcione para python?

Utilizar py-corenlp

Descargar Stanford CoreNLP

La última versión en este momento (2018-10-23) es 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 no tienes wget , probablemente tengas 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 todo lo demás falla, usa el navegador 😉

Instala el paquete

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

Iniciar el servidor

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

Notas:

  1. timeout es en milisegundos, lo puse a 10 segundos arriba. Deberías boostlo si pasas enormes manchas al servidor.
  2. Hay más opciones , puedes enumerarlas con --help .
  3. -mx5g debería asignar suficiente memoria , pero YMMV y es posible que deba modificar la opción si su caja tiene poca potencia.

Instala el paquete python

 pip install pycorenlp 

(Véase también la lista oficial ).

Usalo

 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"])) 

y obtendrá:

 0: 'I love you .': 3 Positive 1: 'I hate him .': 1 Negative 2: 'You are nice .': 3 Positive 3: 'He is dumb': 1 Negative 

Notas

  1. Pasas todo el texto al servidor y lo divide en oraciones. También divide oraciones en tokens.
  2. El sentimiento se atribuye a cada oración , no a todo el texto . El valor medio de sentimentValue través de las oraciones puede usarse para estimar el sentimiento de todo el texto.
  3. El sentimiento promedio de una oración es entre Neutral (2) y Negative (1), el rango es de VeryNegative (0) a VeryPositive (4) que parece ser bastante raro.
  4. Puede detener el servidor escribiendo Ctrl-C en la terminal desde la que lo inició o usando el comando de shell kill $(lsof -ti tcp:9000) . 9000 es el puerto predeterminado, puede cambiarlo utilizando la opción -port al iniciar el servidor.
  5. Aumente el timeout (en milisegundos) en el servidor o el cliente si obtiene errores de tiempo de espera.
  6. sentiment es solo un anotador, hay muchos más , y puede solicitar varios, separándolos por comas: 'annotators': 'sentiment,lemma' .
  7. Tenga en cuenta que el modelo de sentimiento es un tanto idiosincrásico (por ejemplo, el resultado es diferente dependiendo de si menciona a David o Bill ).

Pd No puedo creer que haya agregado una novena respuesta, pero supongo que tuve que hacerlo, ya que ninguna de las respuestas existentes me ayudó (algunas de las 8 respuestas anteriores ahora se han eliminado, otras se han convertido en comentarios).

Implementación nativa de Python de herramientas de PNL de Stanford

Recientemente, Stanford ha lanzado un nuevo paquete de Python que implementa algoritmos basados ​​en redes neuronales (NN) para las tareas de PNL más importantes:

  • tokenización
  • expansión de token de múltiples palabras (MWT)
  • lematización
  • Etiquetado de parte del discurso (POS) y características morfológicas
  • análisis de dependencia

Se implementa en Python y usa PyTorch como la biblioteca NN. El paquete contiene modelos precisos para más de 50 idiomas .

Para instalarlo puedes usar PIP:

 pip install stanfordnlp 

Para realizar tareas básicas, puede usar la interfaz nativa de Python con muchos algoritmos de PNL :

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

EDITAR:

Hasta ahora, la biblioteca no admite el sentimiento, pero no estoy eliminando la respuesta, ya que responde directamente a la parte de la pregunta “Stanford nlp for python”.

Textblob es un gran paquete para análisis sentimental escrito en Python . Puedes tener los documentos aquí . El análisis sentimental de cualquier oración dada se lleva a cabo mediante la inspección de las palabras y su correspondiente puntuación emocional (sentimiento). Puedes comenzar con

 $ pip install -U textblob $ python -m textblob.download_corpora 

El primer comando de instalación de pip le dará la última versión de textblob instalada en su sistema ( virtualenv ), ya que usted pasa: -U will upgrade the pip package its latest available version . Y a continuación descargaremos todos los datos requeridos, el corpus .

También me enfrenté a una situación similar. La mayoría de mis proyectos están en Python y la parte de sentimiento es Java. Por suerte, es bastante fácil aprender a usar el tarro CoreNLP de stanford.

Aquí está uno de mis scripts y puedes descargar archivos y ejecutarlo.

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

Me enfrento al mismo problema: tal vez una solución con stanford_corenlp_py que use Py4j como lo señalara @roopalgarg.

stanford_corenlp_py

Este repository proporciona una interfaz de Python para llamar a los anotadores de “sentimiento” y “entidades” del paquete de CoreNLP Java de Stanford, vigente a partir del v. 3.5.1. Utiliza py4j para interactuar con la JVM; como tal, para ejecutar un script como scripts / runGateway.py, primero debe comstackr y ejecutar las clases Java creando la puerta de enlace JVM.

Use la biblioteca de stanfordcore-nlp python

stanford-corenlp es una muy buena envoltura encima de stanfordcore-nlp para usarla en python.

wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-10-05.zip

Uso

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

Más información

Yo sugeriría usar la biblioteca TextBlob. Una implementación de ejemplo es la siguiente:

 from textblob import TextBlob def sentiment(message): # create TextBlob object of passed tweet text analysis = TextBlob(message) # set sentiment return (analysis.sentiment.polarity) 

Hay un progreso muy nuevo en este tema:

Ahora puedes usar el paquete stanfordnlp dentro de python:

Desde el 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()