Стэнфордский НЛП для питона

Все, что я хочу сделать, это найти настроение (положительное / отрицательное / нейтральное) любой данной строки. При исследовании я наткнулся на Стэнфордскую НЛП. Но, к сожалению, это на Яве. Любые идеи о том, как я могу заставить его работать на Python?

10 ответов

использование py-corenlp

Установите Stanford CoreNLP

Последняя версия на данный момент (2018-10-23): 3.9.2:

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

Запустить сервер

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

Заметки:

  1. timeout в миллисекундах, я установил его на 10 секунд выше. Вы должны увеличить его, если вы передаете огромные капли на сервер.
  2. Есть больше вариантов, вы можете перечислить их с помощью --help,
  3. -mx5g следует выделить достаточно памяти, но YMMV и вам, возможно, придется изменить опцию, если ваш ящик недостаточно силен.

Установите пакет Python

pip install pycorenlp

(Смотрите также официальный список).

Используй это

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

и вы получите:

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

Заметки

  1. Вы передаете весь текст на сервер, и он разбивает его на предложения.
  2. Чувство приписывается каждому предложению, а не всему тексту. Среднее sentimentValue Можно использовать разные предложения для оценки настроения всего текста.
  3. Среднее настроение предложения между Neutral (2) и Negative (1), диапазон от VeryNegative (0) до VeryPositive (4), которые кажутся довольно редкими.
  4. Вы можете остановить сервер, набрав Ctrl-C на терминале, с которого вы его запустили, или используя команду оболочки kill $(lsof -ti tcp:9000), 9000 порт по умолчанию, вы можете изменить его, используя -port опция при запуске сервера.
  5. Увеличение timeout (в миллисекундах) на сервере или клиенте, если вы получаете ошибки тайм-аута.
  6. sentiment это всего лишь один аннотатор, их гораздо больше, и вы можете запросить несколько, разделив их запятыми: 'annotators': 'sentiment,lemma',
  7. Помните, что модель настроения несколько своеобразна (например, результат будет разным в зависимости от того, упоминаете ли вы Дэвида или Билла).

PS Я не могу поверить, что я добавил 9-й ответ, но, думаю, мне пришлось это сделать, поскольку ни один из существующих ответов не помог мне (некоторые из 8 предыдущих ответов были удалены, некоторые были преобразованы в комментарии).

Нативная реализация Python инструментов НЛП из Стэнфорда

Недавно Стэнфорд выпустил новый Python-пакет, реализующий алгоритмы на основе нейронной сети (NN) для наиболее важных задач NLP:

  • лексический анализ
  • расширение многострочного токена (MWT)
  • лемматизации
  • помеченная часть речи (POS) и морфологические признаки
  • разбор зависимостей

Он реализован на Python и использует PyTorch в качестве библиотеки NN. Пакет содержит точные модели для более чем 50 языков.

Для установки вы можете использовать PIP:

pip install stanfordnlp

Для выполнения основных задач вы можете использовать собственный интерфейс Python со многими алгоритмами 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()

РЕДАКТИРОВАТЬ:

Пока что библиотека не поддерживает настроения, но я не удаляю ответ, так как она прямо отвечает на часть вопроса "Stanford nlp for python".

Прямо сейчас у них есть STANZA.

https://stanfordnlp.github.io/stanza/

История выпусков Обратите внимание, что до версии 1.0.0 библиотека Stanza называлась StanfordNLP. Чтобы установить исторические версии до v1.0.0, вам нужно запустить pip install stanfordnlp.

Таким образом, это подтверждает, что Stanza - это полная версия stanford NLP для Python.

Textblob отличный пакет для сентиментального анализа, написанный на Python, Вы можете иметь документы здесь. Сентиментальный анализ любого данного предложения осуществляется путем проверки слов и соответствующих им эмоциональных оценок (настроений). Вы можете начать с

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

Первая команда pip install даст вам последнюю версию textblob, установленную в вашем (virtualenv) система с момента прохождения -U will upgrade the pip package its latest available version, А следующий загрузит все необходимые данные,corpus,

      import os
import numpy as np
import pandas as pd

inputFile = 'senti_post3.csv'

# Add empty column columns
df = pd.read_csv(inputFile)
df.head(5)

# header_list_new = ['numSentence', 'numWords', 'totSentiment', 'avgSentiment', 'Sfreq0','Sfreq1','Sfreq2','Sfreq3','Sfreq4','Sfreq5']
# for i, name in enumerate(header_list_new):
#     df[name] = 0

from pycorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP('http://localhost:9000')

# Function; Output = # sentence, # words, avg.sentimentValue, sentimentHist
def stanford_sentiment(text_str):
    res = nlp.annotate(text_str,
                   properties={
                       'annotators': 'sentiment',
                       'outputFormat': 'json',
                       'timeout': 40000,
                   })
    numSentence = len(res["sentences"])
    numWords = len(text_str.split())
    
    # data arrangement
    arraySentVal = np.zeros(numSentence)

    for i, s in enumerate(res["sentences"]):
        arraySentVal[i] = int(s["sentimentValue"])

    # sum of sentiment values 
    totSentiment = sum(arraySentVal)

    # avg. of sentiment values 
    avgSentiment = np.mean(arraySentVal)

    # frequency of sentimentValue
    bins = [0,1,2,3,4,5,6]
    freq = np.histogram(arraySentVal, bins)[0]    # getting freq. only w/o bins

    return(numSentence, numWords, totSentiment, avgSentiment, freq)
# dfLength = len(df)
# for i in range(dfLength):
for i in range(54000,55284):
    try:
        numSentence, numWords, totSentiment, avgSentiment, freq = stanford_sentiment(df.clean_text[i].replace('\n'," "))
        df.loc[i,'numSentence'] = numSentence
        df.loc[i,'numWords'] = numWords
        df.loc[i,'totSentiment'] = totSentiment
        df.loc[i,'avgSentiment'] = avgSentiment
        df.loc[i,'Sfreq0'] = freq[0]
        df.loc[i,'Sfreq1'] = freq[1]
        df.loc[i,'Sfreq2'] = freq[2]
        df.loc[i,'Sfreq3'] = freq[3]
        df.loc[i,'Sfreq4'] = freq[4]
        df.loc[i,'Sfreq5'] = freq[5]
    except:
        print("error where i =", i)
  
outputFile = 'senti_post16.csv'
df.to_csv(outputFile, encoding='utf-8', index=False )

Я тоже столкнулся с подобной ситуацией. Большинство моих проектов написаны на Python, а сентиментальная часть - Java. К счастью, довольно легко понять, как использовать банку из Стэнфорда CoreNLP.

Вот один из моих скриптов, и вы можете скачать jar и запустить его.

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

}

Использовать библиотеку stanfordcore-nlp python

stanford-corenlp - действительно хорошая обертка поверх stanfordcore-nlp для использования в 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.

Больше информации

Я бы предложил использовать библиотеку TextBlob. Пример реализации выглядит следующим образом:

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

Я сталкиваюсь с той же проблемой: возможно, решение с https://github.com/e5c/stanford_corenlp_py, которое использует Py4j как указано @roopalgarg.

stanford_corenlp_py

Это репозиторий предоставляет интерфейс Python для вызова аннотаторов "sentiment" и "entitymentions" Java-пакета Stanford CoreNLP, действующего по состоянию на v. 3.5.1. Он использует py4j для взаимодействия с JVM; таким образом, чтобы запустить скрипт, такой как scripts / runGateway.py, вы должны сначала скомпилировать и запустить классы Java, создающие шлюз JVM.

В этом вопросе достигнут совершенно новый прогресс:

Теперь вы можете использовать stanfordnlp пакет внутри питона:

Из 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()
Другие вопросы по тегам