用于 python 的斯坦福 nlp

Posted

技术标签:

【中文标题】用于 python 的斯坦福 nlp【英文标题】:Stanford nlp for python 【发布时间】:2015-12-29 00:47:01 【问题描述】:

我想做的就是找到任何给定字符串的情绪(正面/负面/中性)。在研究过程中,我遇到了斯坦福 NLP。但遗憾的是它在Java中。关于如何使它适用于 python 的任何想法?

【问题讨论】:

看起来 GitHub 上的 dasmith 为此写了一个不错的小包装器:github.com/dasmith/stanford-corenlp-python NLTK 包含斯坦福 NLP 的包装器,但我不确定它是否包含情绪分析。从 Python 调用外部实用程序 - 用 Ja​​va 或其他方式 - 并不难。 【参考方案1】:

使用py-corenlp

下载Stanford CoreNLP

此时(2020-05-25)最新版本为4.0.0:

wget https://nlp.stanford.edu/software/stanford-corenlp-4.0.0.zip https://nlp.stanford.edu/software/stanford-corenlp-4.0.0-models-english.jar

如果你没有wget,你可能有curl

curl https://nlp.stanford.edu/software/stanford-corenlp-4.0.0.zip -O https://nlp.stanford.edu/software/stanford-corenlp-4.0.0-models-english.jar -O

如果一切都失败了,请使用浏览器;-)

安装包

unzip stanford-corenlp-4.0.0.zip
mv stanford-corenlp-4.0.0-models-english.jar stanford-corenlp-4.0.0

启动server

cd stanford-corenlp-4.0.0
java -mx5g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -timeout 10000

注意事项:

    timeout 以毫秒为单位,我将其设置为 10 秒以上。 如果向服务器传递巨大的 blob,则应该增加它。 有more options,你可以用--help列出来。 -mx5g 应该分配足够的memory,但是如果你的盒子功率不足,你可能需要修改 YMMV 选项。

安装python包

标准包

pip install pycorenlp

是否适用于 Python 3.9,所以您需要这样做

pip install git+https://github.com/sam-s/py-corenlp.git

(另见the official list)。

使用它

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

注意事项

    您将整个文本传递给服务器,服务器将其拆分为句子。它还将句子拆分为标记。 情感归因于每个句子,而不是整个文本。跨句子的meansentimentValue可以用来估计整个文本的情绪。 句子的平均情绪在Neutral (2) 和Negative (1) 之间,范围从VeryNegative (0) 到VeryPositive (4) 似乎很少见。 您可以stop the server 在您启动它的终端上键入Ctrl-C 或使用shell 命令kill $(lsof -ti tcp:9000)9000 是默认端口,您可以在启动服务器时使用-port 选项更改它。 如果出现超时错误,请在服务器或客户端中增加 timeout(以毫秒为单位)。 sentiment 只是一个注释器,有many more,您可以请求多个,用逗号分隔:'annotators': 'sentiment,lemma'。 请注意,情绪模型有些特殊(例如,the result is different depending on whether you mention David or Bill)。

附言。我不敢相信我添加了 9th 答案,但是,我想,我必须这样做,因为现有的答案都没有帮助我(之前的 8 个答案中的一些现在已被删除,其他一些已被删除)转换为 cmets)。

【讨论】:

感谢您的回答!我认为这是唯一有希望的。但我想知道有没有其他方法可以通过句子。假设我有一个大的 .txt 文件,其中包含超过 10,000 行并且每个句子的每一行。什么是适合我的使用方式?谢谢! 如果你会发现你不能在一个blob中传递所有10k行,你可以任意拆分(注意你的句子“每句每行”不清楚)。 @user5779223:另一种选择是增加超时 - 请参阅编辑。 for s in res["sentences"]里面,有没有办法像nlp.stanford.edu:8080/sentiment/rntnDemo.html一样漂亮地打印出来? 嗨,截至 2020 年,Stanford NLP 为 Stanza 提供了 Stanford CoreNLP 客户端。它被称为 Stanford CoreNLP Client,文档可以在这里找到:stanfordnlp.github.io/stanza/corenlp_client.html【参考方案2】:

现在他们有 STANZA。

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

发布历史 请注意,在 1.0.0 版本之前,Stanza 库被命名为“StanfordNLP”。要安装 v1.0.0 之前的历史版本,您需要运行 pip install stanfordnlp。

因此,它确认了 Stanza 是 stanford NLP 的完整 python 版本。

【讨论】:

截至 2020 年,这是该问题的最佳答案,因为 Stanza 是原生 python,因此无需运行 Java 包。可通过 pip 或 conda 获得。【参考方案3】:

斯坦福 NLP 工具的原生 Python 实现

最近斯坦福发布了一个新的Python packaged,它为最重要的 NLP 任务实现了基于神经网络 (NN) 的算法:

标记化 多字标记 (MWT) 扩展 词形化 词性 (POS) 和形态特征标记 依赖解析

它是用 Python 实现的,并使用 PyTorch 作为 NN 库。该软件包包含超过50 languages 的精确模型。

要安装,您可以使用 PIP:

pip install stanfordnlp

要执行基本任务,您可以使用带有 many NLP algorithms 的原生 Python 接口:

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”部分。

【讨论】:

感谢您的帖子。我正在尝试做类似的事情(分析陈述的情绪)。阅读您的帖子后,我才知道用于 python 的 stanfordnlp 尚未支持情绪。【参考方案4】:

在这个问题上有一个非常新的进展:

现在你可以在 python 中使用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()

【讨论】:

【参考方案5】:

我建议使用 TextBlob 库。示例实现如下所示:

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

【讨论】:

【参考方案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.

More info

【讨论】:

您能否解释一下如何使用 stanfordcorenlp 来分析语句的情绪?【参考方案7】:

我也面临同样的问题:@roopalgarg 指出,stanford_corenlp_py 可能是使用 Py4j 的解决方案。

stanford_corenlp_py

这个 repo 提供了一个 Python 接口,用于调用斯坦福大学 CoreNLP Java 包的“sentiment”和“entitymentions”注释器,最新版本为 3.5.1。它使用 py4j 与 JVM 交互;因此,为了运行像 scripts/runGateway.py 这样的脚本,您必须首先编译并运行创建 JVM 网关的 Java 类。

【讨论】:

【参考方案8】:

我也遇到过类似的情况。我的大部分项目都是用 Python 编写的,而情感部分是 Java。幸运的是,学习如何使用 stanford CoreNLP jar 非常容易。

这是我的脚本之一,您可以下载 jars 并运行它。

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;
    


【讨论】:

【参考方案9】:

Textblob 是用Python 编写的用于情感分析的出色软件包。您可以拥有 docs here 。通过检查单词及其相应的情感分数(情感)来对任何给定句子进行情感分析。你可以从

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

自从您通过 -U will upgrade the pip package its latest available version 后,第一个 pip install 命令将为您提供安装在 (virtualenv) 系统中的最新版本的 textblob。接下来将下载所需的所有数据,corpus

【讨论】:

我实际上尝试过使用 Textblob,但情绪得分非常低。因此我打算改用 stanford nlp 您是否尝试过其他答案中提到的wrapper “情感分析” (-:

以上是关于用于 python 的斯坦福 nlp的主要内容,如果未能解决你的问题,请参考以下文章

斯坦福NLP课程 | 第6讲

斯坦福NLP课程 | 第3讲

斯坦福NLP课程 | 第10讲

斯坦福的nlp学习

斯坦福 NLP 工具如何训练中文分割器模型

如何抑制斯坦福 NLP ColumnDataClassifier.makeClassifier() 函数的标准输出