Все, что я хочу сделать, это найти настроение (положительное/отрицательное/нейтральное) любой строки. При исследовании я встретил Стэнфордский НЛП. Но, к сожалению, это на Java. Любые идеи о том, как я могу заставить его работать на python?
Stanford nlp для python
Ответ 1
Используйте py-corenlp
Скачать Стэнфордский CoreNLP
Последняя версия на данный момент (2018-10-23): 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
Если у вас нет wget
, возможно, у вас есть 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
Если ничего не помогает, используйте браузер ;-)
Установить пакет
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
Заметки:
-
timeout
в миллисекундах, я установил его на 10 секунд выше. Вы должны увеличить его, если вы передаете огромные капли на сервер. - Есть еще варианты, вы можете перечислить их с помощью
--help
. -
-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
Заметки
- Вы передаете весь текст на сервер, и он разбивает его на предложения. Он также разбивает предложения на токены.
- Чувство приписывается каждому предложению, а не всему тексту. Среднее значение
sentimentValue
для предложений может использоваться для оценки настроения всего текста. - Среднее настроение предложения находится между
Neutral
(2) иNegative
(1), диапазон отVeryNegative
(0) доVeryPositive
(4), который, по-видимому, встречается довольно редко. - Вы можете остановить сервер, набрав Ctrl-C в терминале, с которого вы его запустили, или используя команду оболочки
kill $(lsof -ti tcp:9000)
.9000
является портом по умолчанию, вы можете изменить его, используя-port
при запуске сервера. - Увеличьте время
timeout
(в миллисекундах) на сервере или клиенте, если вы получаете ошибки времени ожидания. -
sentiment
- это всего лишь один аннотатор, их гораздо больше, и вы можете запросить несколько, разделив их запятой:'annotators': 'sentiment,lemma'
. - Помните, что модель настроения несколько своеобразна (например, результат будет разным в зависимости от того, упоминаете ли вы Дэвида или Билла).
PS Я не могу поверить, что я добавил 9-й ответ, но, думаю, мне пришлось, поскольку ни один из существующих ответов не помог мне (некоторые из 8 предыдущих ответов были удалены, некоторые были преобразованы в комментарии).
Ответ 2
Нативная реализация 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".
Ответ 3
Textblob
- отличный пакет для сентиментального анализа, написанный в Python
. Здесь вы можете найти . Сентиментальный анализ любого данного предложения осуществляется путем проверки слов и их соответствующей эмоциональной оценки (чувства). Вы можете начать с
$ pip install -U textblob
$ python -m textblob.download_corpora
Первая команда установки pip даст вам последнюю версию текстового блока, установленную в вашей системе (virtualenv
), так как вы проходите -U will upgrade the pip package its latest available version
. И следующий будет загружать все необходимые данные, corpus
.
Ответ 4
Я также столкнулся с подобной ситуацией. Большинство моих проектов находятся в Python, а часть сентимента - Java. К счастью, довольно легко опираться, как использовать банку stanford CoreNLP.
Вот один из моих сценариев, и вы можете загружать банки и запускать их.
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;
}
}
Ответ 5
Я столкнулся с одной и той же проблемой: возможно, решение с stanford_corenlp_py, которое использует Py4j
, как указано @roopalgarg.
stanford_corenlp_py
Это repo предоставляет интерфейс Python для вызова аннотаторов "чувства" и "сущностей" Java-пакета Stanford CoreNLP, текущего по версии 3.5.1. Он использует py4j для взаимодействия с JVM; как таковой, для запуска script подобных скриптов /runGateway.py, вы должны сначала скомпилировать и запустить классы Java, создающие шлюз JVM.
Ответ 6
Использовать библиотеку 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.
Ответ 7
Я бы предложил использовать библиотеку TextBlob. Пример реализации выглядит следующим образом:
from textblob import TextBlob
def sentiment(message):
# create TextBlob object of passed tweet text
analysis = TextBlob(message)
# set sentiment
return (analysis.sentiment.polarity)
Ответ 8
В этом вопросе достигнут совершенно новый прогресс:
Теперь вы можете использовать пакет 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()