web-dev-qa-db-ja.com

pythonのスタンフォードnlp

やりたいことは、与えられた文字列の感情(ポジティブ/ネガティブ/ニュートラル)を見つけることだけです。調査中に、スタンフォードNLPに出会いました。しかし、悲しいことにJavaにあります。どのようにPythonで動作させることができますか?

21
90abyss

_py-corenlp_ を使用します

ダウンロード Stanford 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
_

server を開始します

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

ノート:

  1. timeoutはミリ秒単位で、上記の10秒に設定します。巨大なblobをサーバーに渡す場合は、増やす必要があります。
  2. その他のオプション があり、_--help_でリストできます。
  3. _-mx5g_は十分な memory を割り当てる必要がありますが、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. 感情は、文全体ではなく、各に帰属します。文全体で meansentimentValueを使用して、テキスト全体の感情を推定できます。
  3. 文の平均感情はNeutral(2)とNegative(1)の間で、範囲はVeryNegative(0)からVeryPositive(4 )非常にまれであるように見えます。
  4. サーバーを停止する を入力して Ctrl-C 起動した端末で、またはシェルコマンドkill $(lsof -ti tcp:9000)を使用して。 _9000_がデフォルトのポートです。サーバーの起動時に_-port_オプションを使用して変更できます。
  5. タイムアウトエラーが発生した場合は、サーバーまたはクライアントでtimeout(ミリ秒単位)を増やします。
  6. sentimentは単なるoneアノテーター、 多くの があり、いくつかを要求することができます。コンマ:_'annotators': 'sentiment,lemma'_。
  7. 感情モデルはやや特異なものであることに注意してください(例: DavidとBillのどちらに言及したかによって結果は異なります )。

[〜#〜] ps [〜#〜]9thの回答を追加したとは信じられませんが、既存の回答はどれも私を助けてくれなかったので(以前の回答は削除され、他の回答はコメントに変換されました)。

50
sds

ネイティブPython StanfordのNLPツールの実装

最近、スタンフォード大学は新しい Pythonパッケージ をリリースしました。最も重要なNLPタスク用のニューラルネットワーク(NN)ベースのアルゴリズムを実装しています。

  • トークン化
  • マルチワードトークン(MWT)拡張
  • 補題
  • 品詞(POS)および形態学的特徴のタグ付け
  • 依存関係解析

Pythonで実装され、NNライブラリとしてPyTorchを使用します。パッケージには 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()

編集:

これまでのところ、ライブラリはセンチメント分析をサポートしていません質問の。

5
Aleksander Pohl

Textblobは、Pythonで記述された感傷分析に最適なパッケージです。 docs here を使用できます。特定の文のセンチメンタル分析は、単語とそれに対応する感情スコア(センチメント)を調べることで実行されます。で始めることができます

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

最初のpip installコマンドは、-U will upgrade the pip package its latest available versionを渡すため、(virtualenv)システムにインストールされているtextblobの最新バージョンを提供します。次に、必要なすべてのデータthe corpusがダウンロードされます。

1
cutteeth

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.

詳細

0
adam shamsudeen

TextBlobライブラリを使用することをお勧めします。サンプル実装は次のようになります。

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

私は同じ問題に直面しています:@ -roopalgargが指摘したようにPy4jを使用する stanford_corenlp_py のソリューションかもしれません。

stanford_corenlp_py

このレポジトリは、v。3.5.1の時点でスタンフォードのCoreNLP Pythonパッケージの「センチメント」および「エンティティ」アノテーターを呼び出すためのJavaインターフェースを提供します。 py4jを使用してJVMと対話します。そのため、scripts/runGateway.pyのようなスクリプトを実行するには、最初にJavaクラスをコンパイルして実行し、JVMゲートウェイを作成する必要があります。

0
Arnaud

この問題には非常に新しい進展があります。

これで、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()
0
zwlayer

私も同様の状況に直面しました。私のプロジェクトのほとんどはPythonであり、感情部分はJavaです。幸いなことに、スタンフォードCoreNLP jarの使用方法は非常に簡単です。

これが私のスクリプトの1つで、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;
    }

}
0
Hao Lyu