SageMakerで日本語の自然言語処理ライブラリ「GiNZA」を使ってみた – 機械学習 on AWS Advent Calendar 2019

『機械学習 on AWS Advent Calendar 2019』の21日目のエントリです。
2019.12.21

こんにちは、Mr.Moです。

当エントリは『機械学習 on AWS Advent Calendar 2019』の21日目のエントリです。

自然言語処理が好きです。今回は日本語の自然言語処理ライブラリである「GiNZA」をSageMaker上で使ってみたいと思います!

GiNZAとは

image.png

GiNZAとは、Universal Dependenciesに基づくオープンソース日本語NLPライブラリ。後述するspaCyを日本語でも利用できるようにしたものとも言える。

https://megagonlabs.github.io/ginza/

特長

  • MITライセンスでモデルを含めて商用利用可能
    • BCCWJ由来の依存構造解析モデルをフリーで利用可能
    • 他の日本語UD解析系が使用するGSDコーパスの5倍以上の規模で学習
  • pip一行ですべて導入完了
    • SudachiPyおよび150万語彙を備えるSudachi辞書も一括インストール
    • MeCab・CaboCha等と比較してDocker等での環境構築が圧倒的に楽
  • spaCyの豊富な機能セットを利用できる
    • 日本語以外の言語モデルへの切り替えが容易 (spaCy公式サポートは8言語)
    • 依存構造解析結果の視覚化 → displaCy
    • アノテーションツール → Prodigy

https://www.slideshare.net/MegagonLabs/ginza-cabocha-udpipe-stanford-nlp https://www.recruit.co.jp/newsroom/2019/0402_18331.html

spaCy

image.png

spaCyは高度な自然言語処理を行うためプログラミング言語PythonとCythonで書かれたオープンソースソフトウェア・ライブラリ、MITライセンスの下で公開されている。研究の用途ではなく製品用途の利用に重点を置いている。ただし日本語への対応は乏しい。。GiNZAではこのspaCyを自然言語フレームワークとして採用。

主な機能

  • 非破壊的な字句解析
  • 固有表現抽出
  • 25以上の言語の字句解析サポート[11]
  • 8言語の統計モデル[12]
  • 事前学習済みの単語ベクトル
  • 品詞タグ付け
  • ラベル付き依存構文解析
  • 統語ドリブンの文分割
  • テキスト分類
  • 構文木および固有表現用のビルトインビジュアライザ
  • ディープラーニング

https://ja.wikipedia.org/wiki/SpaCy

sudachi

image.png

Sudachi は日本語形態素解析器です。形態素解析はおもに以下の3つの処理を おこないます。GiNZAではこのSudachiをToknizerとして使用。

主な特徴

Sudachi は従来の形態素解析器とくらべ、以下のような特長があります。

  • 複数の分割単位の併用
    • 必要に応じて切り替え
    • 形態素解析と固有表現抽出の融合
  • 多数の収録語彙
    • UniDic と NEologd をベースに調整
  • 機能のプラグイン化
    • 文字正規化や未知語処理に機能追加が可能
  • 同義語辞書との連携
    • 後日公開予定

https://github.com/WorksApplications/Sudachi#sudachi-%E6%97%A5%E6%9C%AC%E8%AA%9Ereadme

今後10年は継続して更新していく予定とのこと。 https://qiita.com/sorami/items/99604ef105f13d2d472b

さっそく使ってみる

前提としてSageMaker上で動かしていきます。(正直、SageMakerである必要は特に無いのですが 笑)

インストール

GiNZA自体はpipコマンド一行で実行環境を導入できます。

!pip install --upgrade pip
!pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"

image.png

形態素解析

import pandas as pd
from IPython.display import display
import spacy

nlp = spacy.load('ja_ginza')
doc = nlp('また行きたい、そんな気持ちにさせてくれるお店です。')

cols = ("text", "lemma", "POS", "explain", "stopword")
rows = []

for t in doc:    
    row = [t.text, t.lemma_, t.pos_, spacy.explain(t.pos_), t.is_stop]    
    rows.append(row)

df = pd.DataFrame(rows, columns=cols)

display(df)

image.png

係り受け木

from spacy import displacy

displacy.render(doc, style="dep")

image.png

固有表現

## https://spacy.io/api/annotation#named-entities
doc = nlp("本日でAWS機械学習アドベントカレンダー担当分は完了!")

#for ent in doc.ents:
#  print(ent.text, ent.start_char, ent.end_char, ent.label_)

from spacy import displacy
displacy.render(doc, style="ent")

image.png

単語ベクトル

print(doc[5])
doc[5].vector

image.png

文章類似度

doc1 = nlp("昔、高校の運動部で厳しい練習をしていた")
doc2 = nlp("かなり前、学校の陸上部でハードなトレーニングをしていた")

doc1.similarity(doc2)

image.png

ひとまず、簡単に使ってみました。 他にも色々できそうです、また調べて追加していきたいと思います!

GiNZAの今後の展開

  • GiNZA v3.0 - Ametrine
    • 高速化されたSudachiPy新バージョンへの移行
    • 固有表現抽出モデルの強化
  • spaCy公式言語モデルの提供
    • GiNZAの機能のサブセットをspaCyのmasterブランチに統合
    • UD_BCCWJ-GSDの非NC化(現状はCC BY-NC-SA)を待ってリリース予定
    • 課題: GSDコーパスへの固有表現タグ付与

まとめ

pipコマンド一行で実行環境を導入できるのは大変手軽ですし、これまでは機能ごとに別々のライブラリをインストールしてましたが、GiNZAはこれ1つだけで済むのが楽ですね。まだまだ改良が進んでいるみたいですので今後のバージョンアップも楽しみです! これから自然言語を始めるならGiNZAを使うのがオススメと言えそうです。

参考

https://www.ogis-ri.co.jp/otc/hiroba/technical/similar-document-search/part4.html https://qiita.com/moriyamanaoto/items/e98b8a6ff1c8fcf8e293