しろかい!

アプリ開発や機械学習などの開発Tips.

Stanford CoreNLP を Python から使う方法まとめ

自然言語処理ライブラリ「Stanford CoreNLP」を Python から使えるようにするためのインストール方法と,実際の使い方をまとめました.

Stanford CoreNLP とは?

Stanford CoreNLPとは,英語をはじめとしたテキストの自然言語処理NLP)用のライブラリです.
品詞タグ付け,固有表現抽出,構文解析など,NLP に一通りの機能を備えています.
英語の自然言語処理を行う場合はとりあえずこれを使っておけば間違いないと思います.
なお,日本語には残念ながら対応していません.

詳細は公式サイトを参照して下さい(英語です).

CoreNLPはJavaで実装されているのですが,様々な言語から使えるラッパーが用意されています.
Pythonから使いたい場合は「stanford_corenlp_pywrapper」というライブラリを使用します.

以下では,CoreNLPのインストールからPythonでの使用方法を説明します.

インストール

以下,CentOS6 へのインストール手順です.
基本的に載せてあるコマンドをターミナルで順番に実行するだけでインストールできるはずです.

Java8 のインストール(CentOS6)

CoreNLP は Java8 以上でないと動作しないのでインストールします.
既に Java8 がインストールされている場合はスキップして下さい.

基本的には以下のページに載っている通りに行います.

まずは旧バージョンをアンインストールします.

# yum remove java-1.6.0-openjdk
# yum remove java-1.7.0-openjdk

Java8 をインストールします.

# wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u51-b16/jdk-8u51-linux-x64.rpm
# rpm -ivh jdk-8u51-linux-x64.rpm
# rm -rf jdk-8u51-linux-x64.rpm\?AuthParam=1437734086_72d1fd06e1b9dd5b73e0c2affcd52895

java -version を実行して以下のようにバージョンが表示されたら,Java8 のインストールは完了です.

$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

CoreNLP のインストール

インストールと言っても jar ファイル等一式をDLするだけです.
本記事執筆時点での最新版 3.5.2 をインストールします.

$ wget http://nlp.stanford.edu/software/stanford-corenlp-full-2015-04-20.zip
$ unzip stanford-corenlp-full-2015-04-20.zip
$ rm -rf stanford-corenlp-full-2015-04-20.zip

Python Wrapper のインストール

CoreNLP を Python から使うためのモジュール「stanford_corenlp_pywrapper」をインストールします.

GitHub から クローンして pip でインストールします.

# git clone https://github.com/brendano/stanford_corenlp_pywrapper
# cd stanford_corenlp_pywrapper
# pip install .

Python を起動し,stanford_corenlp_pywrapper をインポートしてもエラーが出なければインストールは完了です.

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP

使い方

とりあえず使ってみます.

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP("pos", corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> proc.parse_doc("hello world. how are you?")

/foo/bar/stanford-corenlp-full-2015-04-20/* の部分は,先程 CoreNLP のファイル一式を 解凍して生成されたディレクトリを指定して下さい.

正しく実行できれば,以下のように解析結果が表示されるはずです.

{u'sentences': 
    [
        {u'tokens': [u'hello', u'world', u'.'],
         u'lemmas': [u'hello', u'world', u'.'],
         u'pos': [u'UH', u'NN', u'.'],
         u'char_offsets': [[0, 5], [6, 11], [11, 12]]
        },
        {u'tokens': [u'how', u'are', u'you', u'?'],
         u'lemmas': [u'how', u'be', u'you', u'?'],
         u'pos': [u'WRB', u'VBP', u'PRP', u'.'],
         u'char_offsets': [[13, 16], [17, 20], [21, 24], [24, 25]]
        }
    ]
}

上記のように,基本的な使い方は至ってシンプルで,CoreNLPインスタンスを生成し,CoreNLP.parse_doc メソッドでパース(解析)するだけです.
解析結果は「辞書型」で返ってくるので,後は必要な結果を dict['sentences'][0]['tokens'][0] のような感じで取り出して下さい.

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP("pos", corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> dict = proc.parse_doc("hello world. how are you?")
>>> dict['sentences'][0]['tokens'][0]
u'hello'

また,CoreNLP インスタンス生成時に configdict オプションを渡すことで,解析して欲しい要素を指定することができます.
不必要な解析を省くことで解析時間を短縮できます.
ただし,依存関係には気を付ける必要があります(「品詞タグ付け」を行うには「単語分割」も行う必要がある,等).

以下に例を示しておくので参考にして下さい.

単語分割

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP(configdict={'annotators': 'tokenize,ssplit'}, corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> proc.parse_doc("hello world. how are you?")

品詞タグ付け

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP(configdict={'annotators': 'tokenize,ssplit,pos'}, corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> proc.parse_doc("hello world. how are you?")

※ タグの意味は Penn Treebank P.O.S. Tags を参照して下さい.

レマタイゼーション (lemmatization)

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP(configdict={'annotators': 'tokenize,ssplit,pos,lemma'}, corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> proc.parse_doc("hello world. how are you?")

固有表現抽出

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP(configdict={'annotators': 'tokenize,ssplit,pos,lemma,ner'}, corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> proc.parse_doc("hello world. how are you?")

構文解析

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP(configdict={'annotators': 'tokenize,ssplit,parse'}, corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> proc.parse_doc("hello world. how are you?")

組み合わせる

上記を組み合わせることもできます.
例えば,以下は「品詞タグ付け」と「構文解析」を行います.

$ python
>>> from stanford_corenlp_pywrapper import CoreNLP
>>> proc = CoreNLP(configdict={'annotators': 'tokenize,ssplit,pos,parse'}, corenlp_jars=["/foo/bar/stanford-corenlp-full-2015-04-20/*"])
>>> proc.parse_doc("hello world. how are you?")

まとめ

とまあ,CoreNLPを使えば英文を色々な角度から解析することができます.

CoreNLP には他にも色々な機能があります.
詳細は以下に示す参考ページを参照してみて下さい.

参考ページ

The Stanford NLP (Natural Language Processing) Group
CoreNLPの公式ページ.「Using the Stanford CoreNLP API」に解析可能な全項目が掲載されている.

brendano/stanford_corenlp_pywrapper · GitHub
stanford_corenlp_pywrapperの公式ページ.詳しい使い方もこちら.

Penn Treebank P.O.S. Tags
POSタグ (NNP とか VBD とか) の意味が分からない時はここを参照すると良い.

Stanford CoreNLP Online Demo
CoreNLP をブラウザ上で試せる.