どん底から這い上がるまでの記録

どん底から這い上がりたいけど這い上がれない人がいろいろ書くブログ(主にプログラミング)

Stanford NLPを使って日本語の形態素解析をしてみる

 

日本語の文章を単語に分割するときはMeCabを使っていた私ですが、スタンフォード大学Pythonで使用できる自然言語処理ライブラリStanfordNLPを提供していると知り、試しに使ってみました。

本記事ではStanfordNLPのインストールから簡単なサンプルプログラムを動かすまでをやってみたいと思います。

 

 

インストール

StanfordNLPのインストールですが、2つ注意点があります。

① Python 3.6以上は必須!!!

StanfordNLPはpipでインストールできますが、Pythonのバージョンが3.6以上である必要があります。

しかも、Mac限定でバージョンが<=3.6.7 or <= 3.7.1の場合、インストールには成功しても実効時にエラーが出るそうです。(※私はWindows10なので関係はありませんが)

② PyTorchが必要!!!

StanfordNLPに含まれるモジュールはPyTorchを使って構築されています。GPUが利用できる環境だと、高速に使えるとのこと。

 

と、注意点を書いたところでStanfordNLPをインストールします。

まずはPyTorchのインストールから、公式を参考にして自分の環境に合わせたインストールをします。

私の環境は、Windows10、Python 3.6.2 :: Anaconda custom (64-bit)で、GPUは使用しないのでCUDAはNoneにセットすると以下のようになりました。

f:id:pytry3g:20190817085451p:plain

コマンドプロンプト開いて下のコマンドを実行すると、少し時間がかかりましたが無事にインストールは成功しました。

conda install pytorch torchvision cpuonly -c pytorch

PyTorchのインストールができたら、StanfordNLPのインストールをします。

pip install stanfordnlp

・関連リンク - GitHub - stanfordnlp/stanfordnlp: Official Stanford NLP Python Library for Many Human Languages

セットアップ

StanfordNLPを使うには日本語用の学習済みモデルをダウンロードする必要があるので、以下のコードを実行します。

import stanfordnlp
stanfordnlp.download("ja")

このコードを実行すると、

Using the default treebank "ja_gsd" for language "ja".
Would you like to download the models for: ja_gsd now? (Y/n)

と、聞かれるのでyを入力してEnterを押します。

次に、モデルのダウンロード先を聞かれるので、そのままでよければEnterを押して進めます。

すると、ダウンロードが始まるので後は待つだけです。

私の環境の場合、一回目のダウンロードで以下のようなエラーが出ましたが、

raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file

再度、上のコードを実行すると無事にダウンロードに成功しました。

1回ダウンロードしてしまえば、これ以降モデルのダウンロードは必要ありません。

StanfordNLPを使ってみる

StanfordNLPを使う準備が整ったので、実際に使ってみます。

サンプルプログラムです。

import stanfordnlp


tokenizer = stanfordnlp.Pipeline(lang="ja", treebank="ja_gsd")
sample = "今日はいい天気ですね"

doc = tokenizer(sample)
for sent in doc.sentences:
    for word in sent.words:
        print(word.text, word.lemma, word.upos)

StanfordNLPではPipelineでテキストを処理するときの設定を行います。今回は日本語のテキストを処理するのでlangtreebankを日本語に合わせた設定をしています。

あとは処理したいテキストをPipelineを使って生成したtokenizerに渡すだけです。

解析結果はdocDocumentオブジェクトとして入っています。

このサンプルプログラムでは左から、形態素、原型、品詞を表示させています。

 

Pipelineの設定についてもう少し見てみます。

私の環境の場合、モデルのダウンロード先をデフォルトのパスではなく、別のパスを設定しました。その場合、Pipelineの引数のmodels_dirにモデルがあるディレクトリのパスを設定する必要があります。

また、GPUが使えるなら環境ならuse_gpuをTrueにすればGPUが使えるみたいです。

import stanfordnlp


MODEL_DIR = r"モデルのダウンロード先のパス"
tokenizer = stanfordnlp.Pipeline(
    lang="ja", treebank="ja_gsd", models_dir=MODEL_DIR, use_gpu=False
)
sample = "今日はいい天気ですね"
result = tokenizer(sample)
tokens = [word.text for sent in result.sentences for word in sent.words]
print(tokens)

・関連リンク - Pipeline | StanfordNLP

Google Colaboratoryで使ってみる

最後にGoogle ColaboratoryでStanfordNLPを使ってみます。

PyTorchはデフォルトでインストールされているので、StanfordNLPのみをインストールするだけです。

Google Colaboratoryを開いて、以下のコードをシェルにコピペして実行します。

# Install; note that the prefix "!" is not needed if you are running in a terminal
!pip install stanfordnlp

# Import the package
import stanfordnlp

stanfordnlp.download('ja', force=True)

 

StanfordNLPと日本語の学習済みモデルのインストールが完了したら、試しに下のコードを実行してみます。

tokenizer = stanfordnlp.Pipeline(
    lang="ja", treebank="ja_gsd", use_gpu=True
)
sample = "今日はいい天気ですね"
result = tokenizer(sample)
tokens = [word.text for sent in result.sentences for word in sent.words]
print(tokens)

エラーがでなければ成功です。

結果

結果はこんな感じです。

['今日', 'は', 'いい', '天気', 'です', 'ね']

 

・関連記事 - Google ColaboratoryでGoogle Driveにあるファイルを読み書きする方法