ジオマーリン

geomerlin.com に関することを中心に。難しいことをもっと難しく書くブログ。

Stanford Corenlp をPythonで使う1(インストール〜ダンプ)

Stanford Corenlp (http://stanfordnlp.github.io/CoreNLP/)は自然言語処理の汎用ツールで、品詞の特定、構文木・依存関係の決定、固有名詞解析、共参照の特定(例えば”This is my friend ,Asami.She is from U.S.”ならthis=my friend=she=Asamiの関係を特定)などをやってくれる。素人が使うツールとしては最強!であるがデフォルトで3GBのメモリをアロケートするので注意。

 

まず、pythonでラップする対象である元のjavaプログラムをダウンロード

curl -L -O http://nlp.stanford.edu/software/stanford-corenlp-full-2014-08-27.zip

アクセス制限のエラー出たら、sudoってください。

 

解凍(僕の場合は/usr/local/libが空いてるのでここにしておく)

unzip ./stanford-corenlp-full-2014-08-27.zip -d /usr/local/lib/

 

次にpipでラッパーをインストール

sudo pip3 install corenlp-python

 

ではもう使えます

import corenlp
parser = corenlp.StanfordCoreNLP()
json_data = parser.parse(解析する英文)

エラーが出る場合は一番下へ

 

結果について説明しておきます。出力はjsonなのでjson.loadsかevalして下さい。

かなりひどいネスト構造になっています。
大まかには全体データ > 文章データ(sentences) > 単語データ(words)のネストです。

最初は大きいディクショナリは全部の文章の解析結果でキーはcoref とsentencesです。
corefの値のリストには共参照がセットになっています。
(それぞれの共参照はだいたい最後の要素が最初にでてきた表現です)

sentencesの値はそれぞれの文ごとの解析結果です。
このリストの中はディクショナリが格納されていて、キーはtext,dependencies,wordsです。
さらにwordsの値にはそれぞれの単語のデータが入っています。

wordsのkeyは固有名詞解析のNamedEntityTag,原型のLemma,品詞のPartOfSpeechからなっています。

 

文章データにあるdependenciesは依存関係を表していますが、これは依存関係の表現を知らないと使いようがありません。このドキュメントに使い方が書いてあります。

http://nlp.stanford.edu/software/dependencies_manual.pdf

 

・エラーが出る場合

次のようなエラーが出ましたか?

corenlp.corenlp.ProcessError: 'CoreNLP process terminates abnormally while parsing'

だいたいメモリ不足か自然言語とは思えない文字が混入してるかどちらかですね。

後者の場合は除去して下さい。前者の場合は、Java仮想マシンに3GBもアロケートさせるのをやめましょう。つぎのファイルにアクセスして下さい

pythonなんとか/site-packages/corenlp/corenlp.py

ここで

class StanfordCoreNLP:

    (中略)

    def __init__(self, corenlp_path=DIRECTORY, memory="3g"

のところの3gを1gか2gにしましょう。これでパーサーがメモリ飲み放題のパーティーを開いて怒られるのを防ぎます。ただし、精度は下がるでしょうから、長い文章の共参照はあきらめましょう。

他にも/site-packages/corenlp/default.propertiesの

annotators = tokenize, ssplit, pos, lemma, ner, parse, dcorefを減らすと機能が減る代わりに負担も減ります。