Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜

10,680 views

Published on

Universal Dependencies シンポジウム発表資料 @ 国立国語研究所
松田寛 - Megagon Labs

Published in: Technology
  • Hello! I can recommend a site that has helped me. It's called ⇒ www.WritePaper.info ⇐ So make sure to check it out!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • God bless you Ted. You saved me tons of money. I almost went to bought an overpriced side table until I saw your plans. Thanks for all the great ideas. It's gonna keep me occupied for a long time :) ✄✄✄ https://t.cn/A62Ye5eM
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜

  1. 1. GiNZAで始める 日本語依存構造解析 CaboCha, UDPipe, Stanford NLP との比較 2019.09.04 Universal Dependencies シンポジウム@ 国立国語研究所 Megagon Labs リサーチサイエンティスト 松田寛 @hmtd223 (twitter)
  2. 2. 発表者略歴 • 松田寛 • 奈良先端科学技術大学院大学 情報科学研究科博士前期課程
 ChaSen 2.0, VisualMorphsを開発 • 株式会社ジャストシステム NLPエンジニア → 研究開発部長 • 2012- 開発者兼データサイエンティスト としてスタートアップ数社をお手伝い • 2018- Megagon Labsにjoin • 趣味 • Viola演奏・珈琲焙煎・離島巡り 2
  3. 3. Megagon Labsの紹介 •Mountain Viewと銀座の両拠点で約20名が研究に従事 •Vision • To satisfy people's needs and desires with immediate access to the most useful services and information. •Our core strength • Data Preparation and Integration • Natural Language Processing • Machine Learning • Human-Computer Interaction 3
  4. 4. Content • 40年間の進歩の歴史を概観 • グローバルサービスにおける日本語対応の課題 自然言語処理技術発展の歴史 • GiNZAの特長 GiNZAの誕生 • インストールと解析 • GPUによる高速化 GiNZAの使い方 • Stanford NLP • UDPipe • NLP-Cube • 解析結果の比較 他の日本語UD解析系 4
  5. 5. 自然言語処理技術の 発展 - 1978年 • 東芝が日本初のワードプロセッサを発表(630万円) • 日本語入力で初めて形態素解析を導入 • 同研究所ではCNNの原型が研究されていた • 日本語文字コード JIS C 6226 制定 • 生成文法理論の発展と計算機上の実証実験 • アンチテーゼとしての認知言語学の勃興 • メタファー・カテゴリ化などの認知能力の研究 出典:wikipedia 画像出典: JW-10, Dddeco, wikipedia 5
  6. 6. 自然言語処理技術の 発展 - 1985年 •PC98+DOS+一太郎の黄金期始まる • JIS第二水準漢字ROM搭載が標準化 • 日本語入力技術の開発競争激化 •初の日英自動翻訳システム発売 • PC向けの製品も同年に発売された •ルールベースNLPの飛躍的な発展 • 哲学・言語学・計算機科学の融合が進む • 日本は自然言語処理の先進国となっていく •言語学は文脈を考慮した記号処理に移行 • 語の静的意味と文脈依存(言語使用上)の 意味の分離 → 分散表現の進歩のデジャブ 出典:SemanticScholar 6
  7. 7. 自然言語処理技術の 発展 - 1993年 •32bit PC & Windowsの普及 •WebブラウザMosaicの登場 •IBMが統計的機械翻訳技術を論文発表 • 音声認識ソフトウェア発売(1994) •NLPに立ち塞がる二つの壁の顕在化 • 文法カバー率の限界(知識記述コストの壁) • データスパースネス問題(共起空間の壁) •話し言葉への注目 • 話し言葉と書き言葉を統合する文法は作れるか? 画像出典:flicker 出典:ResearchGate 7
  8. 8. 自然言語処理技術の 発展 - 1999年 •Internet普及・iモード提供開始 •掲示板・メールで独自の文体が生まれる •Unicode 3.0公開・Webの国際化が一気に進む •SVMやCRF(2003)など機械学習手法がルール の精度を超える 出典:chasen.org (CaboChaの解析モデル) 出典:ACL anthology (MeCabの解析モデル) 画像出典:iMac G3, Pedro Moura Pinheiro, flicker 8
  9. 9. 自然言語処理技術の 発展 - 2010年 •スマフォ所有率20%超え •画像・音声認識でDeep Learning 技術が精度を飛躍的に向上 •自然言語処理でもDeep Learning 応用が徐々に広まりを見せる •Googleが発表したword2vec(2013) により流れが一気に加速 •言葉の意味をベクトルで表現する Embeddingの時代に突入していく 出典:ResearchGate 出典:arxiv 出典:ACL anthology 画像出典: Iphone4, DanielZanetti, wikipedia 9
  10. 10. そして、自然言語処理技術は今 •2018年に文脈を考慮するEmbedding技術(ELMo・BERT)の発表 • 全ての研究を過去のものとする圧倒的精度向上をもたらした •これらの技術はオープンソースソフトウェアとして利用可能 • 日本語への応用も活発に行われているが商用利用には隠れた壁が… 出典:arxiv 10
  11. 11. グローバル市場での日本語対応の課題 •言語対応の優先度決定でよくあるフロー • サービス展開先のマーケットにおける言語シェアの上位9割をカバー • 開発は英語・中国語からフィージビリティ検証を開始 • 徐々に対象言語を拡張...日本語対応は後回しになりがち •自然言語処理フレームワークとして成長著しいspaCyでは • 商用利用に耐えるライブラリ品質・速度と精度のバランスも良い • 多言語対応を謳い日本語もラインナップされている • しかしspaCyには日本語の依存構造解析モデルがなかった! • Tokenizer(形態素解析)のみ対応 • やはり日本語対応は後回しに... 11
  12. 12. サービス開発現場の実情 •オープンソースを活用し効率よくサービスを日本語化したい • 検索はSolr・Elasticsearchなら標準のkuromojiで手軽に日本語が扱える • 辞書は色々あるけどひとまず新語が入ったNEologdを入れておこう • 分析を進めるうちに固有名詞を広く取りすぎる傾向に閉口し始める • 分かち書きより深い分析を行うには自力でNLPを組み込む必要がある • 独自構築したNLPをどうやってメンテしていけばよいのか... •海外では日本語よりも中国語対応を優先する傾向が強い • 簡体字中国語圏のマーケットは日本語より数倍大きく予算もつく • 日本語は商用フリーで使える言語資源が乏しい… • なら日本語は後回しにしてマーケットが大きい中国語を優先しよう 12
  13. 13. 自然言語処理技術者としての使命 •過去のコンサル経験で同様の日本語の課題に何度も遭遇 • 日本語を扱うサービスが減少する危機感をもっていた •スマートな解析フレームワークを用意することがNLPerの役割 • とにかく応用側が分析に集中できることが重要 • 品詞体系云々でデータサイエンティストを迷わせていてはダメ • ライブラリ・辞書・モデルのインストールが煩雑だと離脱者が増える • コマンド一行で導入が完了することが現場の理想 •Megagon Labsでこれら要件を満たす新NLPの実装にトライした 13
  14. 14. 新・日本語NLPの基本設計 • フレームワークにspaCyを採用 • 文法体系はspaCy標準のUniversal Dependenciesを使用 • TokenizerにはSudachiPyを使用 • Pure-python化によりインストール作業を極限までシンプル化できる • 依存構造解析学習データセットにはUD-Japanese BCCWJを使用 • 現代日本語書き言葉均衡コーパス - 約4万文に正解データを付与 • 多分野のテキストから成る日本語で最大の依存構造データセット • 口コミ・チャットなど多様な文体を高精度に解析できることに期待 • 固有表現抽出の学習には京都大学ウェブ文書リードコーパスを使用 • 条件付きながら商用利用も可能な中規模のデータセット 14
  15. 15. 技術課題:可能性品詞の用法曖昧性解消 •形態素解析の出力品詞 • UniDic短単位品詞は「名詞-普通名詞-サ変可能」のように可能性を含む • 形態素解析の可能性品詞の解決は日本語NLP業界の十年来の課題 テスト=名詞 e.g. 私はツールでテストを作った。 テスト=動詞 e.g. 私はツールでテストした。 •Universal Dependencies品詞体系は用法を区別する • 有識者との協議では効率的な解決策は見出せず • 品詞書き換えルールの開発工数は膨大・カバレッジの不安で見送り • 新たな学習モデルをspaCyに追加実装する時間はなかった 15
  16. 16. 結論:依存関係ラベリングで用法も解決 「短単位品詞の用法曖昧性解決と依存関係ラベリングの同時学習」 16
  17. 17. 学習データの概要と依存構造解析性能 詳細は下記リンクを参照 • 言語処理学会第25回年次大会 • 論文 • 発表スライド 17
  18. 18. spaCyの機械学習技術 • 依存関係ラベリングはspaCyにビルトインされた 独自実装のCNN(畳込みニューラルネットワーク) で学習・解析される • CNNのルーツは40年前の日本の研究成果 猫の神経細胞を模したネオコグニトロン 出典:NII 出典:arxiv 18
  19. 19. GiNZAの誕生 言語処理学会論文 発表と同時にGiNZA β版をGitHubでリ リース 15 March 2019 GiNZA v1.0.2 (令和対応版) 正式公開 2 April 2019 GiNZA v2.0.0 リリース 8 July 2019 spaCy公式 日本語モデル リリース Coming soon 19
  20. 20. GiNZAという名に 託した想い • 銀座の街が持つ国際的ブランドイメージ • 商人の街・銀座は日本の文化を世界に送り 出し影響を与え合ってきた • 全世界のビジネスで手軽に使える日本語 NLPを提供し産業活性化に貢献したい 出典 https://ja.wikipedia.org/wiki/海_(ドビュッシー) 20
  21. 21. GiNZA - 特長 •MITライセンスでモデルを含めて商用利用可能 • BCCWJ由来の依存構造解析モデルをフリーで利用可能 • 他の日本語UD解析系が使用するGSDコーパスの5倍以上の規模で学習 •pip一行ですべて導入完了 • SudachiPyおよび150万語彙を備えるSudachi辞書も一括インストール • MeCab・CaboCha等と比較してDocker等での環境構築が圧倒的に楽 •spaCyの豊富な機能セットを利用できる • 日本語以外の言語モデルへの切り替えが容易 (spaCy公式サポートは8言語) • 依存構造解析結果の視覚化 → displaCy • アノテーションツール → Prodigy 21
  22. 22. displaCyによる視覚化の例(論文より) 22
  23. 23. GiNZA version 2.0 での主な改良点 •Python Entry Pointsを用いたリファクタリング • インストール時に ginza コマンドを自動登録→すぐに試せる •ユーザ辞書の追加に対応 • SudachiPyをv0.3.2にupgrade •日本語を扱うための機能強化 • 文節情報(開始位置・主辞と機能語の区分)を取得可能に token._.bunsetu_bi_label → B or I token._.bunsetu_position_type → ROOT, SEM_HEAD, SYN_HEAD, NO_HEAD, FUNC, CONT • spaCy標準APIでUniDic品詞情報を取得可能に token.tag_ → 名詞-普通名詞-サ変可能 23
  24. 24. GiNZA - 使い方 • インストール (python 3.6以上) $ pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz" • 解析 $ python >>> import spacy >>> nlp = spacy.load('ja_ginza') >>> doc = nlp('また行きたい、そんな気持ちにさせてくれるお店です。') >>> for token in doc[0]: >>> print(token.i, token.orth_, token.lemma_, token.pos_, token.tag_, token.dep_, token.head.i) ※ CLIツールによるCONLL-U形式出力 $ ginza sentence_per_line.txt 24
  25. 25. GiNZA - GPUの有効化 • explosion社はspaCyとともにGPUライブラリthincを提供(cupyベース) • ginzaの後にspacyをオプション付きで再インストールする (CUDA 10.0の例) $ pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz" $ pip install -U spacy[cuda100] • 解析 $ python >>> import spacy >>> spacy.require_gpu() >>> nlp = spacy.load('ja_ginza') ※ CLI $ ginza -g sentence_pre_line.txt 25
  26. 26. 他の日本語UD解析系 Stanford NLP, UDPipe, NLP-cube
  27. 27. Stanford NLP - 特長 • CoNLL 2018 Shared Task参加時のStanfordの手法がベース • tokenize,lemmatize,tagging,parse全てをDNN実装したEnd-to-endモデル • 解析速度は遅くメモリ消費も大きい (v0.2.0でやや改善された) • Pythonによる実装 → PyTorchを使用しておりGPUで高速化できる • Apache License, Version 2.0 • 53言語対応 • 多くのモデルはNC(非商用条項)つき • 日本語モデル • UD_Japanese-GSD (r2.2?) - 7千文,16万語から学習 • VocabはGSDで出現頻度7回以上の2,260語 + 文字素性2,860件 • 学習コーパスが小さいためモデル本来の性能は得られていない? 27
  28. 28. Stanford NLP - 使い方 • インストール (python 3.6.8 or 3.7.2以上) $ pip install stanfordnlp $ python >>> import stanfordnlp >>> stanfordnlp.download('ja') • 解析 >>> nlp = stanfordnlp.Pipeline(lang='ja', treebank='ja_gsd') >>> doc = nlp('また行きたい、そんな気持ちにさせてくれるお店です。') >>> doc.sentences[0].print_dependencies() ※ CLIツールによるCONLL-U形式出力 $ python -m stanfordnlp.run_pipeline -l ja -t ja_gsd sentence_per_line.txt 28
  29. 29. Stanford NLP - GPUの有効化 • 先にanaconda3環境でpytorch CUDA環境を導入する $ pyenv local anaconda3-2019.7 $ conda install pytorch torchvision cudatoolkit=10.0 -c pytorch $ pip install stanfordnlp • 解析 $ python >>> import stanfordnlp >>> stanfordnlp.download('ja') >>> nlp = stanfordnlp.Pipeline(lang='ja', treebank='ja_gsd', use_gpu=True) ※ CLIでのGPUサポートは現時点ではなし 29
  30. 30. UDPipe - 特長 • Universal Dependenciesの標準解析系 • Charles UniversityによるC++実装 → Python, Java, C#, Perl向けbindingあり • 元来Gold Tokenを与えて依存構造解析精度を評価するためのツール • tokenizerの精度は低く産業用途には向かない • ニューラルベースの実装 • GPU対応は計画中 (v2.0 or 3.0?) • Mozilla Public License 2.0 • UD Treebankのほぼ全ての言語に対応 • 多くのモデルはNC(非商用条項)つき • 日本語を含む60言語に対応したUD2.4学習済みモデル • UD_Japanese-GSD - 7千文,16万語から学習 30
  31. 31. UDPipe - 使い方 (Python binding) • インストール (Python 2.6以上 or 3.x) $ pip install ufal.udpipe モデルページ下部のリストから japanese-gsd-ud-2.4-190531.udpipe をダウンロード • 解析 >>> from ufal.udpipe import Model, Pipeline, ProcessingError >>> model = Model.load('japanese-gsd-ud-2.4-190531.udpipe') >>> pipeline = Pipeline(model, 'tokenize', Pipeline.DEFAULT, Pipeline.DEFAULT, 'conllu') >>> error = ProcessingError() >>> text = 'また行きたい、そんな気持ちにさせてくれるお店です。' >>> processed = pipeline.process(text, error) >>> print(processed) ※ CLIツールはC++版で提供されている 31
  32. 32. NLP-cube - 特長 • CoNLL 2018 Shared Task参加時のAdobeの手法がベース • Stanford NLPと同様にEnd-to-endなニューラル実装 • パフォーマンスについても同様の傾向 • GPUで高速化できる (cube/main.pyの--use-gpuオプション) • Apache License, Version 2.0 • 51言語対応 • UD 2.2ベース (モデルのライセンスが明示されていない?) • モデルのダウンロードが非常に遅い • 日本語モデル • UD_Japanese-GSD r2.2 - 7千文,16万語から学習 32
  33. 33. NLP-cube - 使い方 • インストール (Python 3.x) $ pip install nlpcube $ python >>> from cube.api import Cube >>> cube=Cube(verbose=True) >>> cube.load("ja") • 解析 >>> sentences=cube('また行きたい、そんな気持ちにさせてくれるお店です。') >>> for t in sentences[0]: >>> print(t.index, t.word, t.lemma, t.upos, t.xpos, t.attrs, t.head, t.label, t.space_after) ※ CLIツールとして cube/main.py が提供されている (ドキュメント見当たらず) 33
  34. 34. 解析結果の比較
  35. 35. 参考: CaboChaの解析例 • 文節を決定した上で係り受け解析を行う • 依存関係ラベリングは行わない • 解析結果をUDと比較する意義は乏しい • ただし文節および主辞・付属語の区分は 産業応用においても非常に重要 35
  36. 36. 文節区切り 文節内役 割 GiNZA - 解析例 (GSDとは一部基準が異なる) 36 ※拡張フィールドには NP(名詞句)とNE(固有表現)も出力される。 # text = また行きたい、そんな気持ちにさせてくれるお店です。 1 また 又 SCONJ 接続詞 _ 2 advmod _ BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|SpaceAfter=No 2 行き 行く VERB 動詞-非自立可能 _ 12 acl _ BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|SpaceAfter=No 3 たい たい AUX 助動詞 _ 2 aux _ BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|SpaceAfter=No 4 、 、 PUNCT 補助記号-読点 _ 2 punct _ BunsetuBILabel=I|BunsetuPositionType=CONT|SpaceAfter=No 5 そんな そんな PRON 連体詞 _ 6 nmod _ BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|SpaceAfter=No|NP_B 6 気持ち 気持ち NOUN 名詞-普通名詞-一般 _ 8 iobj _ BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|SpaceAfter=No|NP_I 7 に に ADP 助詞-格助詞 _ 6 case _ BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|SpaceAfter=No 8 さ 為る AUX 動詞-非自立可能 _ 12 acl _ BunsetuBILabel=B|BunsetuPositionType=SEM_HEAD|SpaceAfter=No 9 せ せる AUX 助動詞 _ 8 aux _ BunsetuBILabel=I|BunsetuPositionType=FUNC|SpaceAfter=No 10 て て SCONJ 助詞-接続助詞 _ 8 mark _ BunsetuBILabel=I|BunsetuPositionType=FUNC|SpaceAfter=No 11 くれる呉れる AUX 動詞-非自立可能 _ 8 aux _ BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|SpaceAfter=No 12 お店 御店 NOUN 名詞-普通名詞-一般 _ 0 root _ BunsetuBILabel=B|BunsetuPositionType=ROOT|SpaceAfter=No|NP_B 13 です です AUX 助動詞 _ 12 cop _ BunsetuBILabel=I|BunsetuPositionType=SYN_HEAD|SpaceAfter=No 14 。 。 PUNCT 補助記号-句点 _ 12 punct _ BunsetuBILabel=I|BunsetuPositionType=CONT|SpaceAfter=No
  37. 37. Stanford NLP - 解析例 # text = また行きたい、そんな気持ちにさせてくれるお店です。 1 また また CCONJ _ _ 13 advmod _ _ 2 行き 行く VERB _ _ 6 acl _ _ 3 たい たい AUX _ _ 2 aux _ _ 4 、 、 PUNCT _ _ 2 punct _ _ 5 そんな そんな ADJ _ _ 6 amod _ _ 6 気持ち 気持ち NOUN _ _ 8 iobj _ _ 7 に に ADP _ _ 6 case _ _ 8 さ する VERB _ _ 13 acl _ _ 9 せ せる AUX _ _ 8 aux _ _ 10 て て SCONJ _ _ 8 mark _ _ 11 くれるくれるAUX _ _ 8 aux _ _ 12 お お NOUN _ _ 13 amod _ _ 13 店 店 NOUN _ _ 0 root _ _ 14 です だ AUX _ _ 13 cop _ _ 15 。 。 PUNCT _ _ 13 punct _ _ 37
  38. 38. UDPipe - 解析例 # text = また行きたい、そんな気持ちにさせてくれるお店です。 1 また また CCONJ CC _ 2 advmod _ SpaceAfter=No 2 行き 行く VERB VV _ 6 acl _ SpaceAfter=No 3 たい たい AUX AV _ 2 aux _ SpaceAfter=No 4 、 、 PUNCT SYM _ 2 punct _ SpaceAfter=No 5 そんな そんな ADJ JR _ 6 amod _ SpaceAfter=No 6 気持ち 気持ち NOUN NN _ 8 iobj _ SpaceAfter=No 7 に に ADP PS _ 6 case _ SpaceAfter=No 8 さ する VERB VV _ 13 acl _ SpaceAfter=No 9 せ せる AUX AV _ 8 aux _ SpaceAfter=No 10 て て SCONJ PC _ 8 mark _ SpaceAfter=No 11 くれるくれるAUX AV _ 8 aux _ SpaceAfter=No 12 お お NOUN XP _ 13 compound _SpaceAfter=No 13 店 店 NOUN XS _ 0 root _ SpaceAfter=No 14 です だ AUX AV _ 13 cop _ SpaceAfter=No 15 。 。 PUNCT SYM _ 13 punct _ SpacesAfter=n 38
  39. 39. NLP-cube - 解析例 # text = また行きたい、そんな気持ちにさせてくれるお店です。 1 また また CCONJ _ _ 2 advmod _ SpaceAfter=No 2 行き 行く VERB _ _ 6 advcl _ SpaceAfter=No 3 たい たい AUX _ _ 2 aux _ SpaceAfter=No 4 、 、 PUNCT _ _ 2 punct _ SpaceAfter=No 5 そんな そんな ADJ _ _ 6 amod _ SpaceAfter=No 6 気持ち 気持ち NOUN _ _ 8 iobj _ SpaceAfter=No 7 に に ADP _ _ 6 case _ SpaceAfter=No 8 さ する VERB _ _ 13 acl _ SpaceAfter=No 9 せ せる AUX _ _ 8 aux _ SpaceAfter=No 10 て て SCONJ _ _ 8 mark _ SpaceAfter=No 11 くれるくれるAUX _ _ 8 aux _ SpaceAfter=No 12 お お NOUN _ _ 13 amod _ SpaceAfter=No 13 店 店 NOUN _ _ 0 root _ SpaceAfter=No 14 です だ AUX _ _ 13 cop _ SpaceAfter=No 15 。 。 PUNCT _ _ 13 punct _ SpaceAfter=No 39
  40. 40. GiNZA - 今後の展開 •GiNZA v2.1 (近日公開) • Bug fix + CaboCha互換出力モード •GiNZA v3.0 - Ametrine • 高速化されたSudachiPy新バージョンへの移行 • 固有表現抽出モデルの強化 •spaCy公式言語モデルの提供 • GiNZAの機能のサブセットをspaCyのmasterブランチに統合 • UD_BCCWJ-GSDの非NC化(現状はCC BY-NC-SA)を待ってリリース予定 • 課題: GSDコーパスへの固有表現タグ付与 40

×