学会記事
GiNZA - Universal Dependencies による実用的日本語解析
松田 寛
†1 はじめに
Universal Dependencies (UD) の日本語解析系としてGiNZA1の利用が広がりを見せ,2020 年1月から5 ヶ月間のダウンロード数が2万回を超えた.また,2020年5 月に公開された UD Japanese-GSD(日本語GSD)v2.6は,日本語Webテキスト8,070文(うち訓練用7,026文)
に対して国語研基準で正解が与えられた商用利用も可能な本格的なオープンTreebankとなっ た2.さらに日本語GSD全体に固有表現の正解ラベル3を追加したv2.6-NEがMegagon Labsか ら公開された4.この最新の日本語GSDを訓練データに用いることにより様々なUD対応NLP フレームワークで日本語が扱えるようになり,利用者はGiNZA以外の選択肢も手軽に得られ るようになった.本稿では,GiNZAの使い方など概要を説明した上で,UD対応NLPフレーム ワークでの日本語の統語解析が実用レベルにあるかについて文節主辞認定を題材に評価する.
2 GiNZA
GiNZAは産業利用を想定して高速・軽量化されたNLPフレームワークであるspaCy5と形態 素解析器SudachiPy6を用いて実装されている.Python 3.6以上を導入済みの環境であれば,
$ pip install ginza
のコマンド一行でインストールが完結し,spaCyのCNNマルチタスク学習器を用いてUD Japanese-BCCWJ (Omura and Asahara 2018)から新聞記事を除外した41,072文(うち訓練用 27,314文)にGSK2014-A (橋本,乾,村上2008)の拡張固有表現を加えて学習した解析モデルを 即座に利用できる.この導入の容易さも利用者の支持を得た一つの要因となっている.GiNZA をインストールするとginzaコマンドが実行パスに登録される.ginzaコマンドは標準入力から
†株式会社リクルートMegagon Labs, Tokyo
1 https://megagonlabs.github.io/ginza/
2 日本語オープンTreebankの先駆けである京都大学Webリードコーパスは削除要件をライセンスに含むが,日本 語GSDは商用利用可能なポピュラーライセンス(CC BY-SA 4.0)のもとで公開されている.
3 固有表現ラベル定義https://github.com/megagonlabs/UD Japanese-GSD/blob/master/ene mapping.xlsx
4 https://github.com/megagonlabs/UD Japanese-GSD/releases
5 https://spacy.io
6 https://github.com/WorksApplications/SudachiPy
読み込んだテキストの解析結果をタブ区切りのCoNLL-U形式7で次のように出力する.
$ ginza
東京都選挙管理委員会は立候補を締め切った。
# text = 東京都選挙管理委員会は立候補を締め切った。
1 東京都 東京都 PROPN 名詞-固有名詞-地名-一般 2 nmod ENE=B-Public Institution
2 選挙管理委員会 選挙管理委員会 PROPN 名詞-固有名詞-一般 6 nsubj ENE=I-Public Institution
3 は は ADP 助詞-係助詞 2 case
4 立候補 立候補 NOUN 名詞-普通名詞-サ変可能 6 obj
5 を を ADP 助詞-格助詞 4 case
6 締め切っ 締め切る VERB 動詞-一般 0 root Inf=五段-ラ行,連用形-促音便
7 た た AUX 助動詞 6 aux Inf=助動詞-タ,終止形-一般
8 。 。 PUNCT 補助記号-句点 6 punct
Pythonライブラリ:GiNZAの機能をPythonプログラムで使用するサンプルを付録に示す.
2020年6月中旬にTwitter Search APIで東京都の選挙に関連するツイートを取得し,サンプル コードで得た高頻度の依存関係から特徴的なものを選別した結果を表1に示す8.
トークン化とパイプライン:GiNZAがトークン化で使用するSudachiPyのコア辞書の登録
語はUniDic短単位基準で構成されているが,長単位の複合語を分割情報付きで出力することも
できる(坂本,川原,久本,高岡,内田2018).GiNZAでは最も長い単位のモードCを用いて
パイプラインの学習を行うことで依存構造解析精度を高めている.解析結果を短単位(モード A)で取り出す場合には図1右側のようにCompoundSplitterをパイプラインに配備する.
また,UD品詞(UPOS)の推定において,UniDic短単位品詞に含まれる 名詞-普通名詞-サ変可 能 などの可能性品詞は,用法に基づいてNOUNやVERBなどに解決する必要がある.GiNZA v4ではトークン化処理で品詞bi-gram規則でUPOSを決定している.
表1 ツイート分析結果から選別した特徴的な依存関係
count subj obj pred
25 秘書 香典 渡す
11 21+人 立候補 表明
9 東京地検特捜部 事情 聴く
3 有権者 感染 恐れる
3 代表 立候補+表明 行う
7 https://universaldependencies.org/format.html(紙面の都合でmiscフィールドの読み・文節情報・SpaceAfter 等は省略した.MeCab・CaboCha・spaCyの各形式も指定できる.)
8 query=“選挙 東京OR都exclude:retweets”で得られた19,826ツイート・37,629文を使用.Sudachi同義語辞書 を用いた正規化や用言の否定判定のGiNZAへの機能追加は今後の課題である.
3 UD 対応 NLP フレームワーク
spaCy: 日本語GSD v2.6-NE (松田,若狭,山下,大村,浅原2020)のリリースからほどな くして,その学習済みモデル9がspaCy v2.3.0と同時に公式リリースされた.図2のライブラ リ構成10において,日本語モデルはTokenizerにSudachiPy及びコア辞書を使用する点で他の 言語と設計が異なっている.spaCy日本語モデルのパイプラインはSudacihPyモードA(短単 位)で学習されており,UPOS推定はGiNZAと同じ品詞bi-gram規則が用いられている.なお
図1 GiNZA v4 Pipeline Architecture
図 2 spaCy Library Architecture 図 3 Stanza Pipeline
9 https://spacy.io/models/ja
10https://spacy.io/usage/spacy-101より転載
spaCy公式オンラインコース11が有志により日本語化されている.
Stanza12:代表的なend-to-end(辞書等を使用せずトークン化を含めてパイプライン全段を 訓練コーパスのみで学習する13)アーキテクチャのNLPフレームワーク(Qi, Zhang, Zhang, Bolton, and Manning 2020).日本語モデルは前身のStandord NLPの時代から公開されてきた.
日本語GSD v2.5までの学習済みモデルはトークン化の精度がボトルネックであったが,著者
がv2.6-NEを用いて独自に訓練したモデルを評価したところ大幅な精度向上が確認された.
4 UD と文節
日本語UD (浅原,金山,宮尾,田中,大村,村脇,松本2019)に基づいて解析された依存木
から文節主辞間の関係を示す依存関係を判別できれば,その依存元トークンを根とする部分木 を文節と見なすことができる.しかしUDは言語固有の統語構造を考慮した設計ではない.本 章ではUDの解析木から文節主辞を判定するためにGiNZA v4が導入した方式を解説する14. 文節主辞間の依存関係の分布:日本語GSD v2.6-NEには国語研が付与した文節情報(Bun-
setuBILabel)が含まれており,これを利用して文節主辞から外部への依存関係に付与された依
存関係の出現数の分布と,全トークンに付与された依存関係の出現数の分布とを比較したとこ ろ,文節主辞間の関の割合が高いものは少なく,UDで定義される依存関係から直接的に文節 主辞を同定することは困難なことがわかった.
文節主辞を判別するための依存関係ラベル拡張:依存構造解析モデルの訓練時に文節主辞 トークンの依存関係のラベルを{relation} bunsetuの形に拡張することで,依存関係から文節主 辞を識別可能な形に変更して学習・評価を行った.結果を表2に示す.
表 2 依存関係ラベル拡張による文節主辞認定精度
判定対象 Recall Precision F1
文節主辞トークン全体 0.929 0.997 0.961 文節主辞のrelationが正解 0.999 1.000 1.000 文節主辞のrelationが不正解 0.126 0.902 0.220
11https://course.spacy.io/ja/
12https://stanfordnlp.github.io/stanza/
13学習・解析時に参照する単語ベクトルが形態素解析結果を参照している点で厳密にend-to-endと言えるか議論の 余地はある.Stanza以外にもUD対応NLPフレームワークはいくつか存在するが紙面の都合で解説は割愛する.
14本稿の実験はspaCy v2.3.0-dev1を使用している.また日本語GSDのうち非交差制約を満たさないエントリは 除外している.このため公式モデルと評価結果が異なる部分がある.単語ベクトルには約1億のウェブページ 文章を含む国立国語研究所の日本語ウェブコーパス(NWJC) から学習したchiVe mc90 https://github.com/
WorksApplications/chiVeのエントリを使用.依存構造解析と固有表現抽出をマルチタスク学習する形で統一して
いるため,依存構造解析をシングルタスクで学習させた場合より精度は若干低い傾向にある.
解析結果で依存関係が正解だったトークンについては拡張されたラベルから文節主辞を同定で きている.これは,文節ベースのコーパスからUDへの変換規則(Omura and Asahara 2018)を 再現することが容易であることを示している.一方,依存関係の解析自体が失敗しているコンテ キストでの文節主辞判定の再現率は0.126と低いが適合率は0.9程度を確保できている.GiNZA v4はこの依存関係ラベル拡張による文節主辞認定を採用し,さらに文節主辞が未検出となった 区間でルールベースの主辞認定を行うことで文節主辞判定のカバレッジを確保している.
5 複合語の短単位への書き換え
GiNZA v4ではCompoundSplitterを用いることで複合語を依存関係つきで短単位語に分解で きる.分解後の短単位語の依存先は,元の複合語とその依存先との間に付与された依存関係が compound, nummod, punctのいずれかの場合は,更に長い単位の複合語を形成するために短単 位語の依存先を元の複合語の依存先と同一とし,それ以外の場合は複合語末尾に位置する短単 位語を依存先としている.短単位語に付与する依存関係は,元の複合語のUPOSを手がかりに {ADJ: amod, ADP: case, NUM: nummod, PART: mark, PUNCT: punct, (default): compound} のように決定するルールを用いた15.これらの書き換え規則をモードCの出力に適用した結果,
UAS・LAS・MLAS16の各値はモードAと比べて約1%改善した17.
6 性能評価
日本語GSD v2.6-NEを用いて日本語UD解析系の性能を評価した18.spaCyは公式モデル のja core news mdを,GiNZAとStanzaは訓練セットで学習したモデルを用いた.速度評価で はテストセットの全ての文を結合したテキストを入力することでパイプラインの処理効率を最 大化した.表3においてspaCyやGiNZAが精度・速度の多くの指標でStanzaを上回っている
表 3 日本語GSD v2.6-NEを用いた日本語UD解析系のベンチマーク
Tokenize TAG UPOS UAS LAS MLAS Ent Load CPU GPU
spaCy v2.3.0 0.981 0.970 0.953 0.894 0.875 0.856 0.765 2.6 183 212 GiNZA v4.0.0 0.981 0.970 0.953 0.908 0.888 0.868 0.714 1.3 164 180 Stanza v1.0.1 0.970 — 0.952 0.890 0.877 0.801 0.805 6.5 11 37
15日本語GSDに含まれる複合語の内部の短単位語に付与されたUPOSと依存関係の共起統計を参照して実装した.
16UAS:Unlabeled Attachment Score.LAS:Labeled Attachment Score.MLAS:UPOS & LAS
17GiNZAの訓練コーパスであるUD Japanese-BCCWJ v2.6でも同様の傾向を確認している.
18Load:loading(library+model)[sec], CPU,GPU:speeds[sent/sec], Environment: Windows10 Pro Update1909 (CPU:WSL, GPU:CUDA10.0), Python version 3.8.3, Core i9-8950H, DDR4 64GB, Intel 760p, RTX2080
が,StanzaはTokenizerに形態素解析器を組み込むことで性能が向上する余地がある.
謝 辞
著者が形態素解析器ChaSen verion 2.0のリリースに関わってから20年の間に統語解析技術 は機械学習技術とともに目覚ましい進歩を遂げた.一方,それらの訓練に用いるTreebankコー パスのオープン化(特に商用目的での利用)では日本語は英語などに大きく遅れをとってきた.
OSS NLPフレームワークが世界市場でシェアを広げる中,OSSに馴染まない言語固有のコー
パス事情から日本語の解析技術が世界市場で相手にされなくなる懸念が生じていた.この問題 について著者は国立国語研究所の浅原氏とディスカッションし,まずは商用利用可能な日本語 依存構造解析器としてGiNZAを開発・公開する運びとなった.このGiNZAという名称は,日 本文化を発信し時代の最先端で世界と影響を与え合ってきた街であり,Megagon Labsが属する リクルートグループの拠点である銀座の地から,全世界のビジネスで手軽に使える日本語NLP を提供し,産業活性化に貢献したいという想いから名付けられた.
その後,浅原氏の尽力によりUD Japanese-GSDのライセンスからNon-commercial条項を削 除できたことで,このコーパスから学習した解析モデルを商用目的を含めて公開・利用できるよ うになった.さらにUD JapaneseグループによるUD Japanese-GSDの再整備(v2.6),Megagon Labsによる固有表現情報の追加(v2.6-NE)を経て,spaCyやStanzaなどのNLPフレームワー クを用いて高精度な日本語解析モデルを容易に構築できるようになった.
spaCy日本語モデルのリリースでは多くのエンジニアからコントリビュートを得た.またワー
クスアプリケーションズ徳島人工知能NLP研究所の皆様にはSudachiPyの統合にご協力いただ いた.これらのOSS・オープンデータ活動に支援をいただいた全ての方々に感謝申し上げたい.
参考文献
浅原正幸,金山博,宮尾祐介,田中貴秋,大村舞,村脇有吾,松本裕治(2019). Universal Dependencies 日本語コーパス. 自然言語処理,26(1), pp. 3–36.
橋本泰一,乾孝司,村上浩司(2008). 拡張固有表現タグ付きコーパスの構築. 情報処理学会研究 報告.自然言語処理研究会報告,188, pp. 113–120.
松田寛,若狭絢,山下華代,大村舞,浅原正幸(2020). UD Japanese GSDの再整備と固有表現 情報付与. 言語処理学会第26回年次大会発表論文集.
Omura, M. and Asahara, M. (2018). “UD-Japanese BCCWJ: Universal Dependencies Annotation for the Balanced Corpus of Contemporary Written Japanese.” In Proceedings of the 2nd Workshop on Universal Dependencies (UDW 2018), pp. 117–125, Brussels, Belgium.
Qi, P., Zhang, Y., Zhang, Y., Bolton, J., and Manning, C. D. (2020). “Stanza: A Python Natural Language Processing Toolkit for Many Human Languages.” In Proceedings of the 58th Annual Meeting of the Association for Computational Linguistics: System Demonstrations, pp. 101–108.
坂本美保,川原典子,久本空海,高岡一馬,内田佳孝(2018). 形態素解析器『Sudachi』のため の大規模辞書開発. 言語資源活用ワークショップ発表論文集,3, pp. 118–129.
付録
プログラム1 GiNZAを用いた述語と格要素の共起頻度のカウント
1 from ginza import * 2 import spacy
3 nlp = spacy.load("ja_ginza") # --- GiNZAモデルの読み込み 4
5 from collections import defaultdict
6 frames = defaultdict(lambda: 0) # --- 依存関係の出現頻度を格納 7 sentences = set() # --- 重複文検出用のset 8
9 with open("sentences.txt", "r") as fin: # - 解析対象のテキストファイルから 10 for line in fin: # --- 一行ごとに
11 doc = nlp(line.rstrip()) # --- 解析を実行し 12 for sent in doc.sents: # --- 文単位でループ 13 if sent.text in sentences:
14 continue # --- 重複文はスキップ 15 sentences.add(sent.text)
16 for t in bunsetu_head_tokens(sent): # 文節主辞トークンのうち 17 if t.pos_ not in {"ADJ", "VERB"}:
18 continue # --- 述語以外はスキップ
19 v = phrase(lemma_)(t) # --- 述語とその格要素(主語・目的語相当)の句を集める 20 dep_phrases = sub_phrases(phrase(lemma_), is_not_stop)(t)
21 subj = [phrase for dep, phrase in dep_phrases if dep in {"nsubj"}]
22 obj = [phrase for dep, phrase in dep_phrases if dep in {"obj", "iobj"}]
23 for s in subj:
24 for o in obj:
25 frames[(s, o, v)] += 1 # --- 格要素と述語の組み合わせをカウント
26
27 for frame, count in sorted(frames.items(), key=lambda t: -t[1]):
28 print(count, *frame, sep="\t") # --- 出現頻度の高い順に表示
略歴
松田 寛:2000年奈良先端科学技術大学院大学情報科学研究科博士前期課程 修了.修士(工学).2000年に株式会社ジャストシステム入社,2002年より NLP技術部門をリード,2010年より研究開発部長.2012年にベンチャーへ 転向.2018年にMegagon Labs(株式会社リクルート)へジョイン.現在に 至る.自然言語処理,文分散表現,感情分析の研究に従事.