SageMakerで日本語の自然言語処理ライブラリ「GiNZA」を使ってみた – 機械学習 on AWS Advent Calendar 2019
こんにちは、Mr.Moです。
当エントリは『機械学習 on AWS Advent Calendar 2019』の21日目のエントリです。
- クラスメソッド 機械学習 on AWS Advent Calendar 2019 - Qiita
- クラスメソッド 機械学習 on AWS Advent Calendar 2019 | シリーズ | Developers.IO
自然言語処理が好きです。今回は日本語の自然言語処理ライブラリである「GiNZA」をSageMaker上で使ってみたいと思います!
GiNZAとは
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
spaCyは高度な自然言語処理を行うためプログラミング言語PythonとCythonで書かれたオープンソースソフトウェア・ライブラリ、MITライセンスの下で公開されている。研究の用途ではなく製品用途の利用に重点を置いている。ただし日本語への対応は乏しい。。GiNZAではこのspaCyを自然言語フレームワークとして採用。
主な機能
- 非破壊的な字句解析
- 固有表現抽出
- 25以上の言語の字句解析サポート[11]
- 8言語の統計モデル[12]
- 事前学習済みの単語ベクトル
- 品詞タグ付け
- ラベル付き依存構文解析
- 統語ドリブンの文分割
- テキスト分類
- 構文木および固有表現用のビルトインビジュアライザ
- ディープラーニング
https://ja.wikipedia.org/wiki/SpaCy
sudachi
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"
形態素解析
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)
係り受け木
from spacy import displacy displacy.render(doc, style="dep")
固有表現
## 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")
単語ベクトル
print(doc[5]) doc[5].vector
文章類似度
doc1 = nlp("昔、高校の運動部で厳しい練習をしていた") doc2 = nlp("かなり前、学校の陸上部でハードなトレーニングをしていた") doc1.similarity(doc2)
ひとまず、簡単に使ってみました。 他にも色々できそうです、また調べて追加していきたいと思います!
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