\documentclass[japanese,tombow,other]{jnlp_3.1}
\usepackage{jnlpbbl_1.4}
\usepackage[dvipdfmx]{graphicx}
\usepackage{amsmath}
\usepackage{gentombow}
\settombowbleed{5mm}
%%%%\usepackage{hangcaption_jnlp}
%%%%\usepackage{udline}
%%%%\setulminsep{1.2ex}{0.2ex}
%%%%\let\underline=\ul

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% author's definition
\usepackage{url}
\usepackage{listings,plistings}
\renewcommand{\lstlistingname}{プログラム}
\lstset{%
 columns=[l]{fullflexible}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\renewcommand\UrlFont{\rmfamily}


\Volume{27}
\Number{3}
\Month{September}
\Year{2020}
%%%%\Issuetitle{「　　　　」特集号}

\setcounter{page}{695}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\jsubject{学会記事}
\jtitle{GiNZA - Universal Dependenciesによる実用的日本語解析}
\jauthor{松田　　寛\affiref{Author_1}}
%%%% 英語タイトル・英語著者名は出力せず
\etitle{GiNZA - Practical Japanese NLP based on Universal Dependencies}
\eauthor{Hiroshi Matsuda\affiref{Author_1}} 

\headauthor{松田}
\headtitle{GiNZA - Universal Dependenciesによる実用的日本語解析}

%%%% 英語所属は出力せず
\affilabel{Author_1}{株式会社リクルート Megagon Labs, Tokyo}{Affiliation-1 (Megagon Labs, Tokyo)}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\maketitle


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{はじめに}

Universal Dependencies (UD) の日本語解析系としてGiNZA\footnote{\url{https://megagonlabs.github.io/ginza/}}の利用が広がりを見せ，2020年1月から5ヶ月間のダウンロード数が2万回を超えた．
また，2020年5月に公開されたUD\_Japanese-GSD（日本語GSD）v2.6は，日本語Webテキスト8,070文（うち訓練用7,026文）に対して国語研基準で正解が与えられた商用利用も可能な本格的なオープンTreebankとなった\footnote{%
日本語オープンTreebankの先駆けである京都大学Webリードコーパスは削除要件をライセンスに含むが，日本語GSDは商用利用可能なポピュラーライセンス (CC BY-SA 4.0) のもとで公開されている．}．
さらに日本語GSD全体に固有表現の正解ラベル\footnote{固有表現ラベル定義 \url{https://github.com/megagonlabs/UD_Japanese-GSD/blob/master/ene_mapping.xlsx}}を追加したv2.6-NEがMegagon Labsから公開された\footnote{\url{https://github.com/megagonlabs/UD_Japanese-GSD/releases}}．
この最新の日本語GSDを訓練データに用いることにより様々なUD対応NLPフレームワークで日本語が扱えるようになり，利用者はGiNZA以外の選択肢も手軽に得られるようになった．
本稿では，GiNZAの使い方など概要を説明した上で，UD対応NLPフレームワークでの日本語の統語解析が実用レベルにあるかについて文節主辞認定を題材に評価する．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{GiNZA}

GiNZAは産業利用を想定して高速・軽量化されたNLPフレームワークであるspaCy\footnote{\url{https://spacy.io}}と形態素解析器SudachiPy\footnote{\url{https://github.com/WorksApplications/SudachiPy}}を用いて実装されている．
Python 3.6以上を導入済みの環境であれば，
\vspace{0.5\Cvs}

%%%%\begin{lstlisting}
\hspace{1.2zw}\$ pip install ginza
%%%%\end{lstlisting}
\vspace{0.5\Cvs}

\noindent
のコマンド一行でインストールが完結し，spaCyのCNNマルチタスク学習器を用いてUD\_\linebreak[2]Japanese-BCCWJ \cite{Omura_2018}から新聞記事を除外した41,072文（うち訓練用27,314文）にGSK2014-A \cite{橋本_2008}の拡張固有表現を加えて学習した解析モデルを即座に利用できる．
この導入の容易さも利用者の支持を得た一つの要因となっている．
GiNZAをインストールするとginzaコマンドが実行パスに登録される．
ginzaコマンドは標準入力から読み込んだテキストの解析結果をタブ区切りのCoNLL-U形式
\footnote{\url{https://universaldependencies.org/format.html}（紙面の都合でmiscフィールドの読み・文節情報・SpaceAfter等は省略した．MeCab・CaboCha・spaCyの各形式も指定できる．）}
で次のように出力する．
\vspace{1\Cvs}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
{
\setlength{\tabcolsep}{0.75mm}
%%%%\begin{table}[ht]
 \centering
 \footnotesize\ttfamily
  \begin{tabular}{llllllllll}
    \multicolumn{10}{l}{\$ ginza} \\
    \multicolumn{10}{l}{東京都選挙管理委員会は立候補を締め切った。} \\
    \multicolumn{10}{l}{\# 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 & \_ & \_ \\
  \end{tabular}
%%%%\end{table}
}
\vspace{1\Cvs}

{\bf Pythonライブラリ：} GiNZAの機能をPythonプログラムで使用するサンプルを付録に示す．
2020年6月中旬にTwitter Search APIで東京都の選挙に関連するツイートを取得し，サンプルコードで得た高頻度の依存関係から特徴的なものを選別した結果を表\ref{table:tweet_relations}に示す\footnote{query=``選挙 東京 OR 都 exclude:retweets'' で得られた19,826ツイート・37,629文を使用．Sudachi同義語辞書を用いた正規化や用言の否定判定のGiNZAへの機能追加は今後の課題である．}．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 1
\begin{table}[b]
\caption{ツイート分析結果から選別した特徴的な依存関係}
\label{table:tweet_relations}
\begin{center}
\begin{tabular}{cccc}
\hline
count & subj & obj & pred \\
\hline
25 & 秘書 & 香典 & 渡す \\
11 & 21+人 & 立候補 & 表明 \\
9 & 東京地検特捜部 & 事情 & 聴く \\
3 & 有権者 & 感染 & 恐れる \\
3 & 代表 & 立候補+表明 & 行う \\
\hline
\end{tabular}
\end{center}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

{\bf トークン化とパイプライン：} GiNZAがトークン化で使用するSudachiPyのコア辞書の登録語はUniDic短単位基準で構成されているが，長単位の複合語を分割情報付きで出力することもできる\cite{坂本_2018}．
GiNZAでは最も長い単位のモードCを用いてパイプラインの学習を行うことで依存構造解析精度を高めている．
解析結果を短単位（モードA）で取り出す場合には図\ref{fig:ginza}右側のようにCompoundSplitterをパイプラインに配備する．

また，UD品詞 (UPOS) の推定において，UniDic短単位品詞に含まれる 名詞-普通名詞-サ変可能 などの可能性品詞は，用法に基づいてNOUNやVERBなどに解決する必要がある．
GiNZA v4ではトークン化処理で品詞bi-gram規則でUPOSを決定している．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fig. 1
\begin{figure}[b]
\begin{center}
\includegraphics{27-3ia14f1.eps}
\end{center}
\caption{GiNZA v4 Pipeline Architecture}
\label{fig:ginza}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% fig. 2 and 3
\begin{figure}[b]
\begin{minipage}[b]{222pt}
\includegraphics{27-3ia14f2.eps}
\caption{spaCy Library Architecture}
\label{fig:spacy}
\end{minipage}
\hfill
\begin{minipage}[b]{169pt}
\includegraphics{27-3ia14f3.eps}
\caption{Stanza Pipeline}
\label{fig:stanza}
\end{minipage}
\end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{UD対応NLPフレームワーク}

{\bf spaCy: } 日本語GSD v2.6-NE \cite{松田_2020}のリリースからほどなくして，その学習済みモデル\footnote{https://spacy.io/models/ja}がspaCy v2.3.0と同時に公式リリースされた．
図\ref{fig:spacy}のライブラリ構成\footnote{\url{https://spacy.io/usage/spacy-101}より転載}において，日本語モデルはTokenizerにSudachiPy及びコア辞書を使用する点で他の言語と設計が異なっている．
spaCy日本語モデルのパイプラインはSudacihPyモードA（短単位）で学習されており，UPOS推定はGiNZAと同じ品詞bi-gram規則が用いられている．
なおspaCy公式オンラインコース\footnote{\url{https://course.spacy.io/ja/}}が有志により日本語化されている．


{\bf Stanza\footnote{https://stanfordnlp.github.io/stanza/}：} 代表的なend-to-end（辞書等を使用せずトークン化を含めてパイプライン全段を訓練コーパスのみで学習する\footnote{学習・解析時に参照する単語ベクトルが形態素解析結果を参照している点で厳密にend-to-endと言えるか議論の余地はある．Stanza以外にもUD対応NLPフレームワークはいくつか存在するが紙面の都合で解説は割愛する．}）アーキテクチャのNLPフレームワーク\cite{Qi_2020}．
日本語モデルは前身のStandord NLPの時代から公開されてきた．
日本語GSD v2.5までの学習済みモデルはトークン化の精度がボトルネックであったが，著者がv2.6-NEを用いて独自に訓練したモデルを評価したところ大幅な精度向上が確認された．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{UDと文節}

日本語UD \cite{浅原_2019}に基づいて解析された依存木から文節主辞間の関係を示す依存関係を判別できれば，その依存元トークンを根とする部分木を文節と見なすことができる．
しかしUDは言語固有の統語構造を考慮した設計ではない．
本章ではUDの解析木から文節主辞を判定するためにGiNZA v4が導入した方式を解説する\footnote{本稿の実験はspaCy v2.3.0-dev1を使用している．また日本語GSDのうち非交差制約を満たさないエントリは除外している．このため公式モデルと評価結果が異なる部分がある．単語ベクトルには約1億のウェブページ文章を含む国立国語研究所の日本語ウェブコーパス (NWJC) から学習したchiVe mc90 \url{https://github.com/WorksApplications/chiVe}のエントリを使用．依存構造解析と固有表現抽出をマルチタスク学習する形で統一しているため，依存構造解析をシングルタスクで学習させた場合より精度は若干低い傾向にある．}．


{\bf 文節主辞間の依存関係の分布：} 日本語GSD v2.6-NEには国語研が付与した文節情報(BunsetuBILabel)が含まれており，これを利用して文節主辞から外部への依存関係に付与された依存関係の出現数の分布と，全トークンに付与された依存関係の出現数の分布とを比較したところ，文節主辞間の関の割合が高いものは少なく，UDで定義される依存関係から直接的に文節主辞を同定することは困難なことがわかった．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 2
\begin{table}[b]
\caption{依存関係ラベル拡張による文節主辞認定精度}
\label{table:expand_relation_labels}
\begin{center}
\begin{tabular}{lccc}
\hline
\multicolumn{1}{c}{判定対象}  & Recall  & Precision  & F1 \\
\hline
文節主辞トークン全体  & 0.929  & 0.997  & 0.961 \\
文節主辞のrelationが正解  & 0.999  & 1.000  & 1.000 \\
文節主辞のrelationが不正解  & 0.126  & 0.902  & 0.220 \\
\hline
\end{tabular}
\end{center}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

{\bf 文節主辞を判別するための依存関係ラベル拡張：} 依存構造解析モデルの訓練時に文節主辞トークンの依存関係のラベルを\{relation\}\_bunsetuの形に拡張することで，依存関係から文節主辞を識別可能な形に変更して学習・評価を行った．
結果を表\ref{table:expand_relation_labels}に示す．

解析結果で依存関係が正解だったトークンについては拡張されたラベルから文節主辞を同定できている．
これは，文節ベースのコーパスからUDへの変換規則\cite{Omura_2018}を再現することが容易であることを示している．一方，依存関係の解析自体が失敗しているコンテキストでの文節主辞判定の再現率は0.126と低いが適合率は0.9程度を確保できている．
GiNZA v4はこの依存関係ラベル拡張による文節主辞認定を採用し，さらに文節主辞が未検出となった区間でルールベースの主辞認定を行うことで文節主辞判定のカバレッジを確保している．

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% table 3
\begin{table}[b]
\caption{日本語GSD v2.6-NEを用いた日本語UD解析系のベンチマーク}
\label{table:benchmark}
\begin{center}
\begin{tabular}{l|ccc|ccc|c|ccc}
\hline
& Tokenize & TAG & UPOS & UAS & LAS & MLAS & Ent & Load & CPU & GPU \\
\hline
spaCy v2.3.0 & \bf{0.981} & \bf{0.970} & \bf{0.953} & 0.894 & 0.875 & 0.856 & 0.765 & 2.6 & \bf{183} & \bf{212} \\
GiNZA v4.0.0 & \bf{0.981} & \bf{0.970} & \bf{0.953} & \bf{0.908} & \bf{0.888} & \bf{0.868} & 0.714 & \bf{1.3} & 164 & 180 \\
Stanza v1.0.1 & 0.970 & --- & 0.952 & 0.890 & 0.877 & 0.801 & \bf{0.805} & 6.5 & \phantom{0}11 & \phantom{0}37 \\
\hline
\end{tabular}
\end{center}
\end{table}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{複合語の短単位への書き換え}

GiNZA v4ではCompoundSplitterを用いることで複合語を依存関係つきで短単位語に分解できる．
分解後の短単位語の依存先は，元の複合語とその依存先との間に付与された依存関係がcompound, nummod, punctのいずれかの場合は，更に長い単位の複合語を形成するために短単位語の依存先を元の複合語の依存先と同一とし，それ以外の場合は複合語末尾に位置する短単位語を依存先としている．
短単位語に付与する依存関係は，元の複合語のUPOSを手がかりに\{ADJ: amod, ADP: case, NUM: nummod, PART: mark, PUNCT: punct, (default): compound\} のように決定するルールを用いた\footnote{日本語GSDに含まれる複合語の内部の短単位語に付与されたUPOSと依存関係の共起統計を参照して実装した．}．
これらの書き換え規則をモードCの出力に適用した結果，UAS・LAS・MLAS\footnote{UAS:Unlabeled Attachment Score．LAS:Labeled Attachment Score．MLAS:UPOS \& LAS}の各値はモードAと比べて約1\%改善した\footnote{GiNZAの訓練コーパスであるUD\_Japanese-BCCWJ v2.6でも同様の傾向を確認している．}．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{性能評価}

日本語GSD v2.6-NEを用いて日本語UD解析系の性能を評価した\footnote{Load: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}．
spaCyは公式モデルのja\_core\_news\_mdを，GiNZAとStanzaは訓練セットで学習したモデルを用いた．
速度評価ではテストセットの全ての文を結合したテキストを入力することでパイプラインの処理効率を最大化した．
表\ref{table:benchmark}においてspaCyやGiNZAが精度・速度の多くの指標でStanzaを上回っているが，StanzaはTokenizerに形態素解析器を組み込むことで性能が向上する余地がある．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\acknowledgment

著者が形態素解析器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・オープンデータ活動に支援をいただいた全ての方々に感謝申し上げたい．


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bibliographystyle{jnlpbbl_1.5}
\bibliography{14refs}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\appendix

%%%%\section*{Appendix}

\begin{lstlisting}[
 caption=GiNZAを用いた述語と格要素の共起頻度のカウント,
 label=sample_code,
 basicstyle=\footnotesize\ttfamily,
 numbers=left,%
 xrightmargin=0zw,%
 xleftmargin=3zw,%
 numberstyle={\scriptsize},%
 stepnumber=1,
 numbersep=1zw,%
 lineskip=-0.5ex%
]
from ginza import *
import spacy
nlp = spacy.load("ja_ginza") # ------------ GiNZAモデルの読み込み

from collections import defaultdict
frames = defaultdict(lambda: 0) # --------- 依存関係の出現頻度を格納
sentences = set() # ----------------------- 重複文検出用のset

with open("sentences.txt", "r") as fin: # - 解析対象のテキストファイルから
  for line in fin: # ---------------------- 一行ごとに
    doc = nlp(line.rstrip()) # ------------ 解析を実行し
    for sent in doc.sents: # -------------- 文単位でループ
      if sent.text in sentences:
        continue # ------------------------ 重複文はスキップ
      sentences.add(sent.text)
      for t in bunsetu_head_tokens(sent): # 文節主辞トークンのうち
        if t.pos_ not in {"ADJ", "VERB"}:
          continue # ---------------------- 述語以外はスキップ
        v = phrase(lemma_)(t) # ----------- 述語とその格要素(主語・目的語相当)の句を集める
        dep_phrases = sub_phrases(phrase(lemma_), is_not_stop)(t)
        subj = [phrase for dep, phrase in dep_phrases if dep in {"nsubj"}]
        obj  = [phrase for dep, phrase in dep_phrases if dep in {"obj", "iobj"}]
        for s in subj:
          for o in obj:
            frames[(s, o, v)] += 1 # ------ 格要素と述語の組み合わせをカウント

for frame, count in sorted(frames.items(), key=lambda t: -t[1]):
  print(count, *frame, sep="\t") # -------- 出現頻度の高い順に表示
\end{lstlisting}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{biography}

\bioauthor{松田　　寛}{%
2000年奈良先端科学技術大学院大学情報科学研究科博士前期課程修了．修士（工学）．2000年に株式会社ジャストシステム入社，2002年よりNLP技術部門をリード，2010年より研究開発部長．2012年にベンチャーへ転向．2018年にMegagon Labs（株式会社リクルート）へジョイン．現在に至る．自然言語処理，文分散表現，感情分析の研究に従事．
}
\end{biography}



\end{document}

