最先端自然言語処理ライブラリの最適な選択と有用な利用方法 / pycon-jp-2020

7b5bbcad8cad0559a385206fbe038744?s=47 taishi-i
August 27, 2020

最先端自然言語処理ライブラリの最適な選択と有用な利用方法 / pycon-jp-2020

PyCon JP 2020 での発表スライドです。
GitHub: https://github.com/taishi-i/toiro/tree/master/PyConJP2020

7b5bbcad8cad0559a385206fbe038744?s=128

taishi-i

August 27, 2020
Tweet

Transcript

  1. 最先端自然言語処理ライブラリの 最適な選択と有用な利用方法 PyCon JP 2020 池田 大志

  2. 自己紹介 • 名前 ◦ 池田 大志(Taishi Ikeda) • 略歴 ◦

    2015 - 2017: 奈良先端大 自然言語処理学研究室 出身 ◦ 2017 - 現在 : 企業にて自然言語処理に関する研究開発に従事 • 最近の取り組み ◦ 形態素解析の今とこれから@言語処理学会 2018 ◦ ポスター発表@PyCon JP 2018 ◦ 全国大会@人工知能学会 2019 ◦ トークセッション 30分@PyCon JP 2019 ◦ 年次大会@言語処理学会 2020 2
  3. PyCon JP 2019 での発表 • Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト分析〜 ◦ 日本語コーパスから固有表現抽出モデルを実装する方法について発表

    3
  4. 言語処理学会 第26回年次大会での発表 • 文書分類におけるテキストノイズおよびラベルノイズの影響分析 ◦ 学習データに混入するノイズの影響を調査した研究 4

  5. 本発表について • 概要 ◦ 日本語処理ライブラリの特徴と利用方法を説明 ◦ ユーザーレビューからテキスト分類モデルを実装する方法を説明 • 対象となる聞き手 ◦

    Python を利用して自然言語処理を始めたい人 ◦ 日本語処理ライブラリの選定に困っている人 ◦ どのように日本語処理ライブラリが実装されているか知りたい人 • サンプルコードは GitHub にて公開中 ◦ https://github.com/taishi-i/toiro/tree/master/PyConJP2020 5
  6. 6 本発表の目的 • 各自のユースケースに適したライブラリを発見してもらうことが目的 ◦ Python で利用可能な日本語処理ライブラリを比較します ◦ 目的タスクに適したライブラリの選択基準を共有します

  7. 本発表の方針 • サンプルコードの実行は Google Colab を推奨 ◦ サンプルコードの動作環境は Google Colab

    上を想定しています (Colab 上で実行済み、環境依存のエラーを回避するため) ◦ http://bit.ly/pyconjp2020 7
  8. 本発表の方針 • 発表の内容の質問について ◦ Zoom コメントの質問は GitHub の wiki で回答します

    ◦ 発表終了後の質問は GitHub の Issue でお待ちしております ( Labels を PyConJP2020 と設定してください) ◦ https://github.com/taishi-i/toiro/issues 8
  9. 目次(1/2) • Python を利用した日本語自然言語処理 ◦ 言語処理における機械学習モデルの開発フロー ◦ 単語分割と特徴量の選定処理 ◦ Python

    でどのように単語分割を実装するか? • 各ライブラリの特徴と実装方法 ◦ 説明項目について ◦ 各ライブラリの特徴と実装方法 ◦ ライブラリの機能比較 ◦ (参考)単語分割基準と品詞体系 ◦ 形態素解析比較ライブラリ toiro の紹介 9
  10. 目次(2/2) • 映画のユーザーレビューを利用したテキスト分類モデルの実装 ◦ テキスト分類タスクの概要 ◦ 検証用データ:Yahoo movie reviews ◦

    各ライブラリの特徴と利用方法 ◦ テキスト分類モデルの性能比較 10
  11. Python を利用した日本語自然言語処理

  12. 言語処理における機械学習モデルの開発フロー 12 • まずは、どの処理で Python ライブラリが必要となるか考える コーパス ① 前処理 学習データ

    開発データ 評価データ ② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策
  13. 言語処理における機械学習モデルの開発フロー 13 • まずは、どの処理で Python ライブラリが必要となるか考える コーパス ① 前処理 学習データ

    開発データ 評価データ ② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策 単語分割と特徴量の選定処理 1. mecab-python3 2. Janome 3. SudachiPy 4. nagisa 5. GiNZA 6. Juman++ v2 7. KyTea 8. SentencePiece
  14. 言語処理における機械学習モデルの開発フロー 14 • まずは、どの処理で Python ライブラリが必要となるか考える コーパス ① 前処理 学習データ

    開発データ 評価データ ② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策 モデル学習の処理 1. scikit-learn 2. Transformers 3. spaCy 4. AllenNLP 5. FLAIR 1. mecab-python3 2. Janome 3. SudachiPy 4. nagisa 5. GiNZA 6. Juman++ v2 7. KyTea 8. SentencePiece
  15. 単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 15 入力文: Pythonで簡単に使えるツールです

  16. 単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 16 入力文: Pythonで簡単に使えるツールです Python で 簡単 に

    使える ツール です 単語分割
  17. 単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 17 入力文: Pythonで簡単に使えるツールです Python で 簡単 に

    使える ツール です Python で 簡単 に 使える ツール です 名詞 助詞 形状詞 助詞 動詞 名詞 助動詞 単語分割 品詞タグ付け
  18. Python 簡単 使える ツール 名詞 形状詞 動詞 名詞 単語分割と特徴量の選定処理 •

    日本語テキストの言語処理では、前処理として単語分割が必要となる 18 入力文: Pythonで簡単に使えるツールです Python で 簡単 に 使える ツール です 単語分割 品詞タグ付け+品詞フィルタリング Python 簡単 使える ツール 名詞 形状詞 動詞 名詞
  19. 単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 19 入力文: Pythonで簡単に使えるツールです Python で 簡単 に

    使える ツール です 単語分割 目的タスク 文書分類 機械翻訳 質問応答 など 目的タスクの入力
  20. 単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 20 入力文: Pythonで簡単に使えるツールです 単語分割+品詞フィルタリング 目的タスク 文書分類 機械翻訳

    質問応答 など 出力ラベル: IT/コンピュータ Python 簡単 使える ツール 目的タスクの入力
  21. 単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 21 入力文: Pythonで簡単に使えるツールです Python で 簡単 に

    使える ツール です 単語分割 目的タスク 文書分類 機械翻訳 質問応答 など 出力文: An easy to use tool in Python 目的タスクの入力
  22. • Python では日本語処理ライブラリが多く存在する • ライブラリの選択基準も様々 ◦ 実行速度 ◦ 単語の分割単位、単語に付与する言語情報 ◦

    ライブラリの実装手段 ◦ インストールの容易さ、ライブラリの使いやすさ、参考資料の豊富さ ◦ 目的タスクの精度 • ユーザー側の選択肢は増え、情報収集を含む技術選定コストは増加 22 Python でどのように単語分割を実装するか? 本発表では日本語処理ライブラリを比較し、 各ライブラリの選択基準を共有する
  23. 各ライブラリの特徴と利用方法

  24. Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •

    ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 24 各説明項目について
  25. Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •

    ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 25 ライブラリ名
  26. Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •

    ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 26 他のライブラリと比較した特徴と利点
  27. Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •

    ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 27 解析器本体(処理部分)の実装手段と 単語分割処理の実行速度
  28. Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •

    ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 28 テキスト解析処理の解析手法
  29. Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •

    ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 29 単語分割の分割基準
  30. Janome の利用方法 • インストール方法 • 実装方法 30 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン    Python ライブラリの インストール方法
  31. Janome の利用方法 • インストール方法 • 実装方法 31 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン    Python インタプリタ上での テキスト解析処理の実装方法
  32. Janome の参考資料 • GitHub リンク ◦ https://github.com/mocobeta/janome • 公式ドキュメント ◦

    https://mocobeta.github.io/janome/ • 参考サイト ◦ Janome ではじめるテキストマイニング ◦ 形態素解析、WordCloud、テキスト前処理/後処理、TFIDF など、 ごく基本的な知識をつけてもらうことを目的としたチュートリアル ◦ Janome 開発者の本人が作成したスライドで非常にわかりやすい 32 ライブラリの GitHub リンク
  33. Janome の参考資料 • GitHub リンク ◦ https://github.com/mocobeta/janome • 公式ドキュメント ◦

    https://mocobeta.github.io/janome/ • 参考サイト ◦ Janome ではじめるテキストマイニング ◦ 形態素解析、WordCloud、テキスト前処理/後処理、TFIDF など、 ごく基本的な知識をつけてもらうことを目的としたチュートリアル ◦ Janome 開発者の本人が作成したスライドで非常にわかりやすい 33 公式ドキュメントや参考サイト
  34. Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •

    ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 34
  35. Janome の利用方法 • インストール方法 • 実装方法 35 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   
  36. Janome の利用方法 • インストール方法 • 実装方法 36 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   
  37. Janome の利用方法 • インストール方法 • 実装方法 37 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン    ライブラリのインポート
  38. Janome の利用方法 • インストール方法 • 実装方法 38 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン    インスタンスの定義
  39. Janome の利用方法 • インストール方法 • 実装方法 39 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン    入力テキストの定義
  40. Janome の利用方法 • インストール方法 • 実装方法 40 $ pip install

    Janome >>> from janome.tokenizer import Tokenizer >>> t = Tokenizer() # Initialize Janome >>> text = "Python で前処理を実行する" >>> for token in t.tokenize(text): ... print(token) ... Python 名詞,固有名詞,組織,*,*,*,Python,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン    解析の実行
  41. Janome の参考資料 • GitHub リンク ◦ https://github.com/mocobeta/janome • 公式ドキュメント ◦

    https://mocobeta.github.io/janome/ • 参考サイト ◦ Janome ではじめるテキストマイニング ◦ 形態素解析、WordCloud、テキスト前処理/後処理、TFIDF など、 ごく基本的な知識をつけてもらうことを目的としたチュートリアル ◦ Janome 開発者の本人が作成したスライドで非常にわかりやすい 41
  42. mecab-python3(==0.996.5) • 特徴と利点 ◦ MeCab の Python ラッパー ◦ 研究、実応用問わず幅広く使われている最もメジャーな形態素解析

    ◦ MeCab を swig 経由で呼び出すため、非常に高速な解析が可能 • ライブラリの実装手段と実行速度 ◦ MeCab 本体:C++ ◦ Python ライブラリ:Swig による呼び出し ◦ 25077文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 条件付き確率場(CRF)を利用した最小コスト法による解析 • 分割基準 ◦ IPADIC、(NEologd、JUMAN、UniDic) 42
  43. mecab-python3 の利用方法 • インストール方法 • 実装方法 43 $ pip install

    mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS
  44. mecab-python3 の利用方法 • インストール方法 • 実装方法 44 $ pip install

    mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS
  45. mecab-python3 の利用方法 • インストール方法 • 実装方法 45 $ pip install

    mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS ライブラリのインポート
  46. mecab-python3 の利用方法 • インストール方法 • 実装方法 46 $ pip install

    mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS インスタンスの定義
  47. mecab-python3 の利用方法 • インストール方法 • 実装方法 47 $ pip install

    mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS 解析の実行
  48. 48 汎用テキスト処理システム MeCab が高速な理由 • 言語処理学会第24回年次大会ワークショップ ◦ 形態素解析の今とこれから 「形態素解析だョ!全員集合」 ◦

    「汎用形態素解析システムMeCab」工藤拓氏 (グーグル合同会社) 5.8 高速化のための工夫(P. 122 ) → 実装方法が詳細に説明 発表スライドより引用
  49. mecab-python3 の参考資料 • GitHub リンク ◦ https://github.com/taku910/mecab ◦ https://github.com/SamuraiT/mecab-python3 •

    公式ドキュメント ◦ https://taku910.github.io/mecab/ • 参考サイト ◦ 汎用形態素解析システムMeCab ◦ 言語処理学会第24回年次大会ワークショップ での招待発表スライド ◦ MeCabが誕生した歴史的背景と設計、開発方針について説明 49
  50. SudachiPy • 特徴と利点 ◦ 専門家による語彙の追加や調整がなされた高品質な辞書を搭載 ◦ 企業(ワークスアプリケーションズ)による継続的な辞書更新 ◦ 複数の分割単位(3種類:A, B,

    C)での出力が可能 • ライブラリの実装手段と実行速度 ◦ Python, Cython ◦ 591文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 条件付き確率場(CRF)を利用した最小コスト法による解析 • 分割基準 ◦ A は UniDic 短単位相当、C は固有表現相当、 B は A, C の中間的な単位 50
  51. SudachiPy の利用方法 • インストール方法 • 実装方法 51 $ pip install

    sudachipy sudachidict_core >>> from sudachipy import tokenizer >>> from sudachipy import dictionary >>> tokenizer_obj = dictionary.Dictionary().create() # Initialize sudachipy >>> mode = tokenizer.Tokenizer.SplitMode.C # C: 固有表現相当 >>> text = "Python で前処理を実行する "  >>> ms = tokenizer_obj.tokenize(text, mode) >>> for m in ms: ... print(m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech()) ... Python python python ['名詞', '普通名詞', '一般', '*', '*', '*'] 
  52. SudachiPy の利用方法 • インストール方法 • 実装方法 52 $ pip install

    sudachipy sudachidict_core >>> from sudachipy import tokenizer >>> from sudachipy import dictionary >>> tokenizer_obj = dictionary.Dictionary().create() # Initialize sudachipy >>> mode = tokenizer.Tokenizer.SplitMode.C # C: 固有表現相当 >>> text = "Python で前処理を実行する "  >>> ms = tokenizer_obj.tokenize(text, mode) >>> for m in ms: ... print(m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech()) ... Python python python ['名詞', '普通名詞', '一般', '*', '*', '*'] 
  53. SudachiPy の利用方法 • インストール方法 • 実装方法 53 $ pip install

    sudachipy sudachidict_core >>> from sudachipy import tokenizer >>> from sudachipy import dictionary >>> tokenizer_obj = dictionary.Dictionary().create() # Initialize sudachipy >>> mode = tokenizer.Tokenizer.SplitMode.C # C: 固有表現相当 >>> text = "Python で前処理を実行する "  >>> ms = tokenizer_obj.tokenize(text, mode) >>> for m in ms: ... print(m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech()) ... Python python python ['名詞', '普通名詞', '一般', '*', '*', '*']  ライブラリのインポート
  54. SudachiPy の利用方法 • インストール方法 • 実装方法 54 $ pip install

    sudachipy sudachidict_core >>> from sudachipy import tokenizer >>> from sudachipy import dictionary >>> tokenizer_obj = dictionary.Dictionary().create() # Initialize sudachipy >>> mode = tokenizer.Tokenizer.SplitMode.C # C: 固有表現相当 >>> text = "Python で前処理を実行する "  >>> ms = tokenizer_obj.tokenize(text, mode) >>> for m in ms: ... print(m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech()) ... Python python python ['名詞', '普通名詞', '一般', '*', '*', '*']  インスタンスの定義 分割基準の設定
  55. SudachiPy の利用方法 • インストール方法 • 実装方法 55 $ pip install

    sudachipy sudachidict_core >>> from sudachipy import tokenizer >>> from sudachipy import dictionary >>> tokenizer_obj = dictionary.Dictionary().create() # Initialize sudachipy >>> mode = tokenizer.Tokenizer.SplitMode.C # C: 固有表現相当 >>> text = "Python で前処理を実行する "  >>> ms = tokenizer_obj.tokenize(text, mode) >>> for m in ms: ... print(m.surface(), m.dictionary_form(), m.reading_form(), m.part_of_speech()) ... Python python python ['名詞', '普通名詞', '一般', '*', '*', '*']  解析の実行
  56. SudachiPy の参考資料 • GitHub リンク ◦ https://github.com/WorksApplications/SudachiPy • ワークス徳島人工知能NLP研究所 ◦

    https://www.worksap.co.jp/about/csr/nlp/ • 参考サイト ◦ Elasticsearchのための新しい形態素解析器 「Sudachi」 ◦ 白金鉱業.FM 22. 特別ゲスト@soramiさん(前編:形態素解析器Sudachiにつ いて) ◦ 形態素解析器 Sudachi の概要やウラバナシについて聞ける Podcast 56
  57. GiNZA • 特徴と利点 ◦ 依存構造(係り受け)解析や固有表現抽出が可能 ◦ 国際化されたフレームワーク(spaCy)上で利用可能 • ライブラリの実装手段と実行速度 ◦

    Python, Cython ◦ 472文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 単語分割、品詞タグ付け:SudachiPy の結果を利用 ◦ 依存構造解析、固有表現抽出:spaCyのAPIを利用し、UD Japanese BCCWJ v2.6を学習 • 分割基準 ◦ SudachiPy の結果を利用 57
  58. GiNZA の利用方法 • インストール方法 • 実装方法 58 $ pip install

    spacy ginza >>> import spacy >>> nlp = spacy.load('ja_ginza') >>> text = 'Python で前処理を実行する' >>> tokens = nlp(text) >>> for token in tokens: ... print(token, token.tag_, token.dep_, token.head.i) ... Python 名詞-普通名詞-一般 nmod 4 で 接続詞 case 0 前処理 名詞-普通名詞-一般 obj 4 を 助詞-格助詞 case 2 実行 名詞-普通名詞-サ変可能 ROOT 4 する 動詞-非自立可能 aux 4
  59. GiNZA の利用方法 • インストール方法 • 実装方法 59 $ pip install

    spacy ginza >>> import spacy >>> nlp = spacy.load('ja_ginza') >>> text = 'Python で前処理を実行する' >>> tokens = nlp(text) >>> for token in tokens: ... print(token, token.tag_, token.dep_, token.head.i) ... Python 名詞-普通名詞-一般 nmod 4 で 接続詞 case 0 前処理 名詞-普通名詞-一般 obj 4 を 助詞-格助詞 case 2 実行 名詞-普通名詞-サ変可能 ROOT 4 する 動詞-非自立可能 aux 4
  60. GiNZA の利用方法 • インストール方法 • 実装方法 60 $ pip install

    spacy ginza >>> import spacy >>> nlp = spacy.load('ja_ginza') >>> text = 'Python で前処理を実行する' >>> tokens = nlp(text) >>> for token in tokens: ... print(token, token.tag_, token.dep_, token.head.i) ... Python 名詞-普通名詞-一般 nmod 4 で 接続詞 case 0 前処理 名詞-普通名詞-一般 obj 4 を 助詞-格助詞 case 2 実行 名詞-普通名詞-サ変可能 ROOT 4 する 動詞-非自立可能 aux 4 ライブラリのインポート
  61. GiNZA の利用方法 • インストール方法 • 実装方法 61 $ pip install

    spacy ginza >>> import spacy >>> nlp = spacy.load('ja_ginza') >>> text = 'Python で前処理を実行する' >>> tokens = nlp(text) >>> for token in tokens: ... print(token, token.tag_, token.dep_, token.head.i) ... Python 名詞-普通名詞-一般 nmod 4 で 接続詞 case 0 前処理 名詞-普通名詞-一般 obj 4 を 助詞-格助詞 case 2 実行 名詞-普通名詞-サ変可能 ROOT 4 する 動詞-非自立可能 aux 4 インスタンスの定義
  62. GiNZA の利用方法 • インストール方法 • 実装方法 62 $ pip install

    spacy ginza >>> import spacy >>> nlp = spacy.load('ja_ginza') >>> text = 'Python で前処理を実行する' >>> tokens = nlp(text) >>> for token in tokens: ... print(token, token.tag_, token.dep_, token.head.i) ... Python 名詞-普通名詞-一般 nmod 4 で 接続詞 case 0 前処理 名詞-普通名詞-一般 obj 4 を 助詞-格助詞 case 2 実行 名詞-普通名詞-サ変可能 ROOT 4 する 動詞-非自立可能 aux 4 解析の実行
  63. GiNZA の参考資料 • GitHub リンク ◦ https://github.com/megagonlabs/ginza • 公式サイト ◦

    https://megagonlabs.github.io/ginza/ • 参考サイト ◦ GiNZA: 日本語自然言語処理オープンソースライブラリー ◦ spaCy/GiNZA を用いた自然言語処理 ◦ GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPと の比較〜 ◦ 短単位品詞の用法曖昧性解決と依存関係ラベリングの同時学習 63
  64. nagisa • 特徴と利点 ◦ シンプルな単語分割と品詞タグ付け機能を提供 ◦ ユーザー辞書の追加が容易、系列ラベリングモデルの学習が可能 • ライブラリの実装手段と実行速度 ◦

    Python, Cython ◦ 383文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ BLSTMs を用いた系列ラベリングによる単語分割と品詞タグ付け • 分割基準 ◦ UniDic 64
  65. nagisa の利用方法 • インストール方法 • 実装方法 65 $ pip install

    nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞  /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']
  66. nagisa の利用方法 • インストール方法 • 実装方法 66 $ pip install

    nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞  /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']
  67. nagisa の利用方法 • インストール方法 • 実装方法 67 $ pip install

    nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞  /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞'] ライブラリのインポート
  68. nagisa の利用方法 • インストール方法 • 実装方法 68 $ pip install

    nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞  /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞'] 解析の実行
  69. nagisa の参考資料 • GitHub リンク ◦ https://github.com/taishi-i/nagisa • 参考サイト ◦

    nagisa: RNNによる日本語単語分割・品詞タグ付けツール ◦ Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト 分析〜 ◦ 形態素解析ツールのnagisa(なぎさ)を知っていますか? ◦ Pythonで動く形態素解析ツール「nagisa」を使ってみた 69
  70. SentencePiece • 特徴と利点 ◦ ニューラル言語処理向けトークナイザ ◦ 言語依存処理がなく、データから教師なしで分割(サブワード)を学習 ◦ テキストの圧縮率をベースに最適化を行い、語彙サイズを圧縮 •

    ライブラリの実装手段と実行速度 ◦ SentencePiece 本体:C++ ◦ Python ライブラリ:Swig による呼び出し ◦ 49566文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 生文から直接言語モデルベースの分割を学習 • 分割基準 ◦ サブワード(語彙数や学習データに依存) 70
  71. SentencePiece の利用方法 • インストール方法 • 実装方法 71 $ pip install

    sentencepiece >>> import sentencepiece as spm >>> sp = spm.SentencePieceProcessor() >>> sp.load(f"ja.text8.txt.spm.model") >>> text = 'Python で前処理を実行する' >>> pieces = sp.encode_as_pieces(text) >>> print(pieces) ['▁', 'P', 'y', 'th', 'on', '▁', 'で', '前', '処理', 'を', ' 実行', 'する'] >>> ids = sp.encode_as_ids(text) >>> print(ids) [5, 0, 210, 1040, 905, 5, 14, 144, 2828, 7, 3749, 22]
  72. SentencePiece の利用方法 • インストール方法 • 実装方法 72 $ pip install

    sentencepiece >>> import sentencepiece as spm >>> sp = spm.SentencePieceProcessor() >>> sp.load(f"ja.text8.txt.spm.model") >>> text = 'Python で前処理を実行する' >>> pieces = sp.encode_as_pieces(text) >>> print(pieces) ['▁', 'P', 'y', 'th', 'on', '▁', 'で', '前', '処理', 'を', ' 実行', 'する'] >>> ids = sp.encode_as_ids(text) >>> print(ids) [5, 0, 210, 1040, 905, 5, 14, 144, 2828, 7, 3749, 22]
  73. SentencePiece の利用方法 • インストール方法 • 実装方法 73 $ pip install

    sentencepiece >>> import sentencepiece as spm >>> sp = spm.SentencePieceProcessor() >>> sp.load(f"ja.text8.txt.spm.model") >>> text = 'Python で前処理を実行する' >>> pieces = sp.encode_as_pieces(text) >>> print(pieces) ['▁', 'P', 'y', 'th', 'on', '▁', 'で', '前', '処理', 'を', ' 実行', 'する'] >>> ids = sp.encode_as_ids(text) >>> print(ids) [5, 0, 210, 1040, 905, 5, 14, 144, 2828, 7, 3749, 22] ライブラリのインポート
  74. SentencePiece の利用方法 • インストール方法 • 実装方法 74 $ pip install

    sentencepiece >>> import sentencepiece as spm >>> sp = spm.SentencePieceProcessor() >>> sp.load(f"ja.text8.txt.spm.model") >>> text = 'Python で前処理を実行する' >>> pieces = sp.encode_as_pieces(text) >>> print(pieces) ['▁', 'P', 'y', 'th', 'on', '▁', 'で', '前', '処理', 'を', ' 実行', 'する'] >>> ids = sp.encode_as_ids(text) >>> print(ids) [5, 0, 210, 1040, 905, 5, 14, 144, 2828, 7, 3749, 22] インスタンスを定義
  75. SentencePiece の利用方法 • インストール方法 • 実装方法 75 $ pip install

    sentencepiece >>> import sentencepiece as spm >>> sp = spm.SentencePieceProcessor() >>> sp.load(f"ja.text8.txt.spm.model") >>> text = 'Python で前処理を実行する' >>> pieces = sp.encode_as_pieces(text) >>> print(pieces) ['▁', 'P', 'y', 'th', 'on', '▁', 'で', '前', '処理', 'を', ' 実行', 'する'] >>> ids = sp.encode_as_ids(text) >>> print(ids) [5, 0, 210, 1040, 905, 5, 14, 144, 2828, 7, 3749, 22] モデルのロード
  76. SentencePiece の利用方法 • インストール方法 • 実装方法 76 $ pip install

    sentencepiece >>> import sentencepiece as spm >>> sp = spm.SentencePieceProcessor() >>> sp.load(f"ja.text8.txt.spm.model") >>> text = 'Python で前処理を実行する' >>> pieces = sp.encode_as_pieces(text) >>> print(pieces) ['▁', 'P', 'y', 'th', 'on', '▁', 'で', '前', '処理', 'を', ' 実行', 'する'] >>> ids = sp.encode_as_ids(text) >>> print(ids) [5, 0, 210, 1040, 905, 5, 14, 144, 2828, 7, 3749, 22] 解析の実行
  77. SentencePiece の参考資料 • GitHub リンク ◦ https://github.com/google/sentencepiece • 参考サイト ◦

    Sentencepiece : ニューラル言語処理向けトークナイザ ◦ SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing ◦ BERT with SentencePiece で日本語専用の pre-trained モデルを学習し、そ れを基にタスクを解く 77
  78. KyTea • 特徴と利点 ◦ 点予測による単語分割と品詞推定を採用し未知語に対して頑健 ◦ 部分的アノテーションによるモデル学習が可能であり分野適応が容易 ◦ 読み推定が可能 •

    ライブラリの実装手段と実行速度 ◦ KyTea本体:C++, LIBLINEAR を利用 ◦ Pythonライブラリ:Swig による呼び出し ◦ 15868文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 線形SVM(LIBLINEAR)による単語分割と品詞推定 • 分割基準 ◦ UniDic 78
  79. KyTea の利用方法 • インストール方法 • 実装方法 79 $ pip install

    kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する KyTea 本体の インストールが必要
  80. KyTea の利用方法 • インストール方法 • 実装方法 80 $ pip install

    kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する KyTea 本体の インストールが必要
  81. KyTea の利用方法 • インストール方法 • 実装方法 81 $ pip install

    kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する ライブラリのインポート
  82. KyTea の利用方法 • インストール方法 • 実装方法 82 $ pip install

    kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する インスタンスの定義
  83. KyTea の利用方法 • インストール方法 • 実装方法 83 $ pip install

    kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する 解析の実行
  84. KyTea の参考資料 • GitHub リンク ◦ https://github.com/neubig/kytea ◦ https://github.com/chezou/Mykytea-python •

    公式サイト ◦ KyTea 本体のインストールはこちらを参考にしてください ◦ http://www.phontron.com/kytea/index-ja.html • 参考サイト ◦ 日本語の単語分割 品詞推定 日本語の単語分割・品詞推定あるいは KyTea の話 ◦ Windows 64bitでMeCab(とKyTea)を使う方法 2018 84
  85. Juman++ v2 • 特徴と利点 ◦ RNN 言語モデルを利用した高性能な形態素解析システム ◦ 単語の並びの意味的な自然さを考慮した解析を行う ◦

    JUMAN、MeCab に比べ大きく性能が向上 • ライブラリの実装手段と実行速度 ◦ Juman++ V2 本体:C++ ◦ Pythonライブラリ:Subprocessによる実行、文字列処理 ◦ 738文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ ラティス構築後、線形モデルとRNNモデルによるコスト推定 • 分割基準 ◦ JUMAN辞書基準 85
  86. Juman++ v2 の利用方法 • インストール方法 • 実装方法 86 $ pip

    install pyknp >>> from pyknp import Juman >>> jumanpp = Juman() # default is JUMAN++ >>> text = 'Python で前処理を実行する' >>> tokens = jumanpp.analysis(text) >>> for mrph in tokens.mrph_list(): ... print(mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname) ... Python Python Python 未定義語 アルファベット * * 未知語:ローマ字 品詞推定: 名詞       特殊 空白 * * 代表表記:S/* 元半角 S/* で で で 助詞 格助詞 * * NIL 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん Juman++ v2 本体の インストールが必要
  87. Juman++ v2 の利用方法 • インストール方法 • 実装方法 87 $ pip

    install pyknp >>> from pyknp import Juman >>> jumanpp = Juman() # default is JUMAN++ >>> text = 'Python で前処理を実行する' >>> tokens = jumanpp.analysis(text) >>> for mrph in tokens.mrph_list(): ... print(mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname) ... Python Python Python 未定義語 アルファベット * * 未知語:ローマ字 品詞推定: 名詞       特殊 空白 * * 代表表記:S/* 元半角 S/* で で で 助詞 格助詞 * * NIL 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん Juman++ v2 本体の インストールが必要
  88. Juman++ v2 の利用方法 • インストール方法 • 実装方法 88 $ pip

    install pyknp >>> from pyknp import Juman >>> jumanpp = Juman() # default is JUMAN++ >>> text = 'Python で前処理を実行する' >>> tokens = jumanpp.analysis(text) >>> for mrph in tokens.mrph_list(): ... print(mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname) ... Python Python Python 未定義語 アルファベット * * 未知語:ローマ字 品詞推定: 名詞       特殊 空白 * * 代表表記:S/* 元半角 S/* で で で 助詞 格助詞 * * NIL 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん ライブラリのインポート
  89. Juman++ v2 の利用方法 • インストール方法 • 実装方法 89 $ pip

    install pyknp >>> from pyknp import Juman >>> jumanpp = Juman() # default is JUMAN++ >>> text = 'Python で前処理を実行する' >>> tokens = jumanpp.analysis(text) >>> for mrph in tokens.mrph_list(): ... print(mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname) ... Python Python Python 未定義語 アルファベット * * 未知語:ローマ字 品詞推定: 名詞       特殊 空白 * * 代表表記:S/* 元半角 S/* で で で 助詞 格助詞 * * NIL 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん インスタンスの定義
  90. Juman++ v2 の利用方法 • インストール方法 • 実装方法 90 $ pip

    install pyknp >>> from pyknp import Juman >>> jumanpp = Juman() # default is JUMAN++ >>> text = 'Python で前処理を実行する' >>> tokens = jumanpp.analysis(text) >>> for mrph in tokens.mrph_list(): ... print(mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname) ... Python Python Python 未定義語 アルファベット * * 未知語:ローマ字 品詞推定: 名詞       特殊 空白 * * 代表表記:S/* 元半角 S/* で で で 助詞 格助詞 * * NIL 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん 解析の実行
  91. Juman++ v2 の参考資料 • GitHub リンク ◦ https://github.com/ku-nlp/jumanpp • 公式サイト

    ◦ Juman++ v2 のインストールはこちらを参考にしてください ◦ http://nlp.ist.i.kyoto-u.ac.jp/index.php?JUMAN++ • 参考サイト ◦ pyknp: Python Module for JUMAN++/KNP ◦ ColabでJUMAN++を使う 91
  92. ライブラリの機能比較 ライブラリ名 単語分割基準(単語長) 品詞体系 付与言語情報 実行速度 Janome IPADIC(やや短い) IPA品詞体系 -

    698文/秒 mecab-python3 IPADIC(やや短い) NEologd(長い) JUMAN(長い) Unidic(短い) 各辞書に依存 各辞書に依存 25077文/秒 SudachiPy 複数の分割単位 (3種類:A, B, C) SudachiDict体系 表記正規化 591文/秒 GiNZA SudachiPyと同様 SudachiPyと同様 固有表現情報 依存構造解析 472文/秒 Juman++ v2 JUMAN(長い) JUMAN 品詞体系 意味情報 738文/秒 nagisa UniDic(短い) UniDic品詞体系の 大分類のみ - 383文/秒 KyTea UniDic(短い) UniDic品詞体系の 大分類のみ 読み情報 15868文/秒 SentencePiece サブワード - - 49566文/秒 • 赤文字はライブラリ選択のメリット、青文字はライブラリ選択のデメリット
  93. (参考)単語分割基準と品詞体系 • IPADIC ◦ ipadic version 2.7.0 ユーザーズマニュアル ◦ ChaSen

    品詞体系 (IPA品詞体系) • JUMAN ◦ 形態素・構文タグ付きコーパス作成の作業基準 version 1.8 ◦ Juman 品詞体系 • UniDic ◦ UniDic品詞体系 • SudachiDict ◦ https://github.com/WorksApplications/SudachiDict 93
  94. 形態素解析器比較ライブラリ toiro の紹介 • 日本語処理の便利機能を搭載した Python ライブラリ ◦ 日本語コーパスのダウンローダーと前処理機能を搭載 ◦

    数行のコードで処理速度の比較、単語分割の比較、後段タスクでの精度比較 が可能 ◦ Dockerでは、環境構築なしに9種類の解析器の比較が可能 ◦ https://github.com/taishi-i/toiro 94
  95. toiro の利用方法 • インストール方法 • 実装方法 95 $ pip install

    toiro[all_tokenizers] >>> from toiro import tokenizers >>> from toiro import datadownloader >>> corpus = 'livedoor_news_corpus' >>> datadownloader.download_corpus(corpus) >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus) >>> texts = train_df[1] >>> report = tokenizers.compare(texts)
  96. toiro の利用方法 • インストール方法 • 実装方法 96 $ pip install

    toiro[all_tokenizers] >>> from toiro import tokenizers >>> from toiro import datadownloader >>> corpus = 'livedoor_news_corpus' >>> datadownloader.download_corpus(corpus) >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus) >>> texts = train_df[1] >>> report = tokenizers.compare(texts)
  97. toiro の利用方法 • インストール方法 • 実装方法 97 $ pip install

    toiro[all_tokenizers] >>> from toiro import tokenizers >>> from toiro import datadownloader >>> corpus = 'livedoor_news_corpus' >>> datadownloader.download_corpus(corpus) >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus) >>> texts = train_df[1] >>> report = tokenizers.compare(texts) ライブラリのインポート
  98. toiro の利用方法 • インストール方法 • 実装方法 98 $ pip install

    toiro[all_tokenizers] >>> from toiro import tokenizers >>> from toiro import datadownloader >>> corpus = 'livedoor_news_corpus' >>> datadownloader.download_corpus(corpus) >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus) >>> texts = train_df[1] >>> report = tokenizers.compare(texts) コーパスのダウンロード
  99. toiro の利用方法 • インストール方法 • 実装方法 99 $ pip install

    toiro[all_tokenizers] >>> from toiro import tokenizers >>> from toiro import datadownloader >>> corpus = 'livedoor_news_corpus' >>> datadownloader.download_corpus(corpus) >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus) >>> texts = train_df[1] >>> report = tokenizers.compare(texts) 解析器の比較を実行
  100. toiro の利用方法 • インストール方法 • tqdm による処理過程の表示 100 $ pip

    install toiro[all_tokenizers] [1/9] Tokenizer: mecab-python3 100%|██████████████| 5900/5900 [00:00<00:00, 66155.86it/s] [2/9] Tokenizer: janome 100%|████████████████| 5900/5900 [00:07<00:00, 786.07it/s] [3/9] Tokenizer: nagisa 100%|████████████████| 5900/5900 [00:15<00:00, 387.23it/s] [4/9] Tokenizer: sudachipy 100%|████████████████| 5900/5900 [00:08<00:00, 701.22it/s] [5/9] Tokenizer: spacy 100%|████████████████| 5900/5900 [00:10<00:00, 560.73it/s] [6/9] Tokenizer: ginza 100%|████████████████| 5900/5900 [00:10<00:00, 546.22it/s] [7/9] Tokenizer: kytea 100%|██████████████| 5900/5900 [00:00<00:00, 16671.25it/s] [8/9] Tokenizer: jumanpp 100%|███████████████| 5900/5900 [00:03<00:00, 1525.75it/s] [9/9] Tokenizer: sentencepiece 100%|██████████████| 5900/5900 [00:00<00:00, 58736.64it/s]
  101. toiro の利用方法 • インストール方法 • Python のバージョンや CPU 情報の確認が可能 101

    $ pip install toiro[all_tokenizers] >>> print(report) {'execution_environment': {'python_version': '3.7.8.final.0 (64 bit)', 'arch': 'X86_64', 'brand_raw': 'Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz', 'count': 8}, 'data': {'number_of_sentences': 5900, 'average_length': 37.69593220338983}, 'mecab-python3': {'elapsed_time': 0.08929705619812012}, 'janome': {'elapsed_time': 7.5058019161224365}, 'nagisa': {'elapsed_time': 15.23674201965332}, 'sudachipy': {'elapsed_time': 8.414058446884155}, 'spacy': {'elapsed_time': 10.522215127944946}, 'ginza': {'elapsed_time': 10.801583766937256}, 'kytea': {'elapsed_time': 0.35404515266418457}, 'jumanpp': {'elapsed_time': 3.867039918899536}, 'sentencepiece': {'elapsed_time': 0.10055661201477051}}
  102. Docker 環境による実行 • コンテナの実行方法 • 実装方法(コンテナ内で python3 を実行) 102 $

    docker run --rm -it taishii/toiro /bin/bash >>> from toiro import tokenizers >>> text = "都庁所在地は新宿区。" >>> tokenizers.print_words(text, delimiter="|") mecab-python3: 都庁|所在地|は|新宿|区|。 janome: 都庁|所在地|は|新宿|区|。 nagisa: 都庁|所在|地|は|新宿|区|。 sudachipy: 都庁|所在地|は|新宿区|。 spacy: 都庁|所在|地|は|新宿|区|。 ginza: 都庁|所在地|は|新宿区|。 kytea: 都庁|所在|地|は|新宿|区|。 jumanpp: 都庁|所在|地|は|新宿|区|。 sentencepiece: ▁|都|庁|所在地|は|新宿|区|。
  103. 映画のユーザーレビューを利用した テキスト分類モデルの実装

  104. テキスト分類タスクの概要 • テキスト分類は、テキストを入力としてラベルを出力するタスク 104 入力文: Pythonで簡単に使えるツールです 単語分割+品詞フィルタリング 目的タスク 文書分類 機械翻訳

    質問応答 など 出力ラベル: IT/コンピュータ Python 簡単 使える ツール 目的タスクの入力
  105. テキスト分類モデルの学習方法 105 • 準備した学習データからテキスト文書モデルを作成する コーパス ① 前処理 学習データ 開発データ 評価データ

    ② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策 モデル学習の処理 1. scikit-learn 2. Transformers 3. spaCy 4. AllenNLP 5. FLAIR 1. mecab-python3 2. Janome 3. SudachiPy 4. nagisa 5. GiNZA 6. Juman++ v2 7. KyTea 8. SentencePiece
  106. 106 • まずは、入力テキストを形態素解析器等で単語分割する ◦ テキストをコンピュータで処理しやすい単位(単語列)に変換 scikit-learn spaCy Transformers AllenNLP FLAIR

    Python ライブラリ BOW TF-IDF CNN BiLSTM BERT 特徴量の表現手法 モデル学習の内部処理 入力テキスト ① 前処理 特徴量 ② 学習 学習済みモデル とても良い作品でした。 ['とても', '良い', '作品', 'でし', 'た', '。'] [ 2.6584e-01, 1.5733e-02, -5.5184e-01] ラベル:ポジティブ model.pkl
  107. 107 • 次に、単語列を特徴量(数値表現)に変換する ◦ 例えば、scikit-learn を利用して、単語列を TF-IDF ベクトルに変換 scikit-learn spaCy

    Transformers AllenNLP FLAIR Python ライブラリ BOW TF-IDF CNN BiLSTM BERT 特徴量の表現手法 モデル学習の内部処理 入力テキスト ① 前処理 特徴量 ② 学習 学習済みモデル とても良い作品でした。 ['とても', '良い', '作品', 'でし', 'た', '。'] [ 2.6584e-01, 1.5733e-02, -5.5184e-01] ラベル:ポジティブ model.pkl 出現頻度による特徴
  108. 108 • 次に、単語列を特徴量(数値表現)に変換する ◦ 例えば、Transformers を利用して、単語列を BERT ベクトルに変換 scikit-learn spaCy

    Transformers AllenNLP FLAIR Python ライブラリ BOW TF-IDF CNN BiLSTM BERT 特徴量の表現手法 モデル学習の内部処理 入力テキスト ① 前処理 特徴量 ② 学習 学習済みモデル とても良い作品でした。 ['とても', '良い', '作品', 'でし', 'た', '。'] [ 3.7371e-01, -5.9107e-02, -2.2306e-01] ラベル:ポジティブ model.pkl 言語モデルによる特徴
  109. 109 • 特徴量とラベルを利用して、テキスト分類モデルを学習する ◦ Python ライブラリの機能を利用して、モデルを保存する scikit-learn spaCy Transformers AllenNLP

    FLAIR Python ライブラリ BOW TF-IDF CNN BiLSTM BERT 特徴量の表現手法 モデル学習の内部処理 入力テキスト ① 前処理 特徴量 ② 学習 学習済みモデル とても良い作品でした。 ['とても', '良い', '作品', 'でし', 'た', '。'] [ 3.7371e-01, -5.9107e-02, -2.2306e-01] ラベル:ポジティブ model.pkl このパターンを学習する 言語モデルによる特徴
  110. 検証用データセット:Yahoo Movie Reviews • 映画作品のユーザーレビューデータセット ◦ 学習データ:10,000 件、開発データ:1,250 件、評価データ:1,250件 ◦

    学習データのラベル割合 ポジティブ:5,038件、ネガティブ:4,962件 ◦ ユーザーレビュー1件の平均文字数:322文字 • コーパスをダウンロードし、 pandas.DataFrame として読み込む 110 >>> from toiro import datadownloader >>> corpus = 'yahoo_movie_reviews' >>> datadownloader.download_corpus(corpus) >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> print(train_df) # 1 これまで観た映画の中で最も恐ろしい映画だ。ホラー映画(嫌いだから ほとんど観たことはない)とは...
  111. scikit-learn • 特徴と利点 ◦ Python によるオープンソース機械学習ライブラリ ◦ サポートベクターマシン(SVM)など、様々なアルゴリズムが利用可能 ◦ scikit-learn

    のみで機械学習に取り組むことも十分可能 • インストール方法 • GitHub リンク ◦ https://github.com/scikit-learn/scikit-learn • 参考サイト ◦ https://scikit-learn.org/stable/ 111 $ pip install scikit-learn
  112. scikit-learn の利用方法(TF-IDF の構築) • Janome を単語分割に利用し、学習データから TF-IDF を構築する 112 >>>

    from toiro import tokenizers >>> from toiro import datadownloader >>> from sklearn.feature_extraction.text import TfidfVectorizer >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> tokenize_janome = tokenizers.tokenize_janome >>> tfidf_extracter = TfidfVectorizer(ngram_range=(1, 2), tokenizer=tokenize_janome, max_df=0.9, min_df=3, sublinear_tf=1) >>> train_texts = train_df[1] >>> train_X = tfidf_extracter.fit_transform(train_texts)
  113. scikit-learn の利用方法(TF-IDF の構築) • Janome を単語分割に利用し、学習データから TF-IDF を構築する 113 >>>

    from toiro import tokenizers >>> from toiro import datadownloader >>> from sklearn.feature_extraction.text import TfidfVectorizer >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> tokenize_janome = tokenizers.tokenize_janome >>> tfidf_extracter = TfidfVectorizer(ngram_range=(1, 2), tokenizer=tokenize_janome, max_df=0.9, min_df=3, sublinear_tf=1) >>> train_texts = train_df[1] >>> train_X = tfidf_extracter.fit_transform(train_texts) ライブラリのインポート
  114. scikit-learn の利用方法(TF-IDF の構築) • Janome を単語分割に利用し、学習データから TF-IDF を構築する 114 >>>

    from toiro import tokenizers >>> from toiro import datadownloader >>> from sklearn.feature_extraction.text import TfidfVectorizer >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> tokenize_janome = tokenizers.tokenize_janome >>> tfidf_extracter = TfidfVectorizer(ngram_range=(1, 2), tokenizer=tokenize_janome, max_df=0.9, min_df=3, sublinear_tf=1) >>> train_texts = train_df[1] >>> train_X = tfidf_extracter.fit_transform(train_texts) コーパスのロード
  115. scikit-learn の利用方法(TF-IDF の構築) • Janome を単語分割に利用し、学習データから TF-IDF を構築する 115 >>>

    from toiro import tokenizers >>> from toiro import datadownloader >>> from sklearn.feature_extraction.text import TfidfVectorizer >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> tokenize_janome = tokenizers.tokenize_janome >>> tfidf_extracter = TfidfVectorizer(ngram_range=(1, 2), tokenizer=tokenize_janome, max_df=0.9, min_df=3, sublinear_tf=1) >>> train_texts = train_df[1] >>> train_X = tfidf_extracter.fit_transform(train_texts) 単語分割の定義
  116. scikit-learn の利用方法(TF-IDF の構築) • Janome を単語分割に利用し、学習データから TF-IDF を構築する 116 >>>

    from toiro import tokenizers >>> from toiro import datadownloader >>> from sklearn.feature_extraction.text import TfidfVectorizer >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> tokenize_janome = tokenizers.tokenize_janome >>> tfidf_extracter = TfidfVectorizer(ngram_range=(1, 2), tokenizer=tokenize_janome, max_df=0.9, min_df=3, sublinear_tf=1) >>> train_texts = train_df[1] >>> train_X = tfidf_extracter.fit_transform(train_texts) TF-IDF の定義
  117. scikit-learn の利用方法(TF-IDF の構築) • Janome を単語分割に利用し、学習データから TF-IDF を構築する 117 >>>

    from toiro import tokenizers >>> from toiro import datadownloader >>> from sklearn.feature_extraction.text import TfidfVectorizer >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> tokenize_janome = tokenizers.tokenize_janome >>> tfidf_extracter = TfidfVectorizer(ngram_range=(1, 2), tokenizer=tokenize_janome, max_df=0.9, min_df=3, sublinear_tf=1) >>> train_texts = train_df[1] >>> train_X = tfidf_extracter.fit_transform(train_texts) TF-IDF を構築
  118. scikit-learn の利用方法(ベクトル化) • tfidf_extracter.transform を利用し、テキストをベクトル化する 118 >>> text = "とても良い作品でした。"

    >>> x = tfidf_extracter.transform([text]) >>> x <1x92143 sparse matrix of type '<class 'numpy.float64'>' with 9 stored elements in Compressed Sparse Row format> >>> print(x.toarray()) [[0. 0. 0. ... 0. 0. 0.]] >>> print(x) (0, 82076) 0.514308329463325 (0, 82033) 0.28160641839600237 (0, 55430) 0.38687226972136557 (0, 55412) 0.19207036483503126 (0, 26101) 0.5550955457160239 (0, 26030) 0.28642855817395746 (0, 23958) 0.1805941673948253
  119. scikit-learn の利用方法(ベクトル化) • tfidf_extracter.transform を利用し、テキストをベクトル化する 119 テキストを TF-IDF に変換 >>>

    text = "とても良い作品でした。" >>> x = tfidf_extracter.transform([text]) >>> x <1x92143 sparse matrix of type '<class 'numpy.float64'>' with 9 stored elements in Compressed Sparse Row format> >>> print(x.toarray()) [[0. 0. 0. ... 0. 0. 0.]] >>> print(x) (0, 82076) 0.514308329463325 (0, 82033) 0.28160641839600237 (0, 55430) 0.38687226972136557 (0, 55412) 0.19207036483503126 (0, 26101) 0.5550955457160239 (0, 26030) 0.28642855817395746 (0, 23958) 0.1805941673948253
  120. scikit-learn の利用方法(ベクトル化) • tfidf_extracter.transform を利用し、テキストをベクトル化する 120 >>> text = "とても良い作品でした。"

    >>> x = tfidf_extracter.transform([text]) >>> x <1x92143 sparse matrix of type '<class 'numpy.float64'>' with 9 stored elements in Compressed Sparse Row format> >>> print(x.toarray()) [[0. 0. 0. ... 0. 0. 0.]] >>> print(x) (0, 82076) 0.514308329463325 (0, 82033) 0.28160641839600237 (0, 55430) 0.38687226972136557 (0, 55412) 0.19207036483503126 (0, 26101) 0.5550955457160239 (0, 26030) 0.28642855817395746 (0, 23958) 0.1805941673948253 ベクトル化の結果
  121. scikit-learn の利用方法(SVM モデルの学習) • LinearSVC を利用し、線形 SVM モデルを学習する 121 >>>

    from sklearn.svm import LinearSVC >>> corpus = 'yahoo_movie_reviews' >>> train_df, _, _ = datadownloader.load_corpus(corpus, n=12500) >>> train_X = tfidf_extracter.fit_transform(train_texts) >>> train_Y = train_df[0] >>> svm = LinearSVC() >>> svm.fit(train_X, train_Y)
  122. scikit-learn の利用方法(SVM モデルの学習) • LinearSVC を利用し、線形 SVM モデルを学習する 122 >>>

    from sklearn.svm import LinearSVC >>> corpus = 'yahoo_movie_reviews' >>> train_df, _, _ = datadownloader.load_corpus(corpus, n=12500) >>> train_X = tfidf_extracter.fit_transform(train_texts) >>> train_Y = train_df[0] >>> svm = LinearSVC() >>> svm.fit(train_X, train_Y) ライブラリのインポート
  123. scikit-learn の利用方法(SVM モデルの学習) • LinearSVC を利用し、線形 SVM モデルを学習する 123 >>>

    from sklearn.svm import LinearSVC >>> corpus = 'yahoo_movie_reviews' >>> train_df, _, _ = datadownloader.load_corpus(corpus, n=12500) >>> train_X = tfidf_extracter.fit_transform(train_texts) >>> train_Y = train_df[0] >>> svm = LinearSVC() >>> svm.fit(train_X, train_Y) コーパスを読み込む
  124. scikit-learn の利用方法(SVM モデルの学習) • LinearSVC を利用し、線形 SVM モデルを学習する 124 >>>

    from sklearn.svm import LinearSVC >>> corpus = 'yahoo_movie_reviews' >>> train_df, _, _ = datadownloader.load_corpus(corpus, n=12500) >>> train_X = tfidf_extracter.fit_transform(train_texts) >>> train_Y = train_df[0] >>> svm = LinearSVC() >>> svm.fit(train_X, train_Y) テキストを TF-IDF に変換
  125. scikit-learn の利用方法(SVM モデルの学習) • LinearSVC を利用し、線形 SVM モデルを学習する 125 >>>

    from sklearn.svm import LinearSVC >>> corpus = 'yahoo_movie_reviews' >>> train_df, _, _ = datadownloader.load_corpus(corpus, n=12500) >>> train_X = tfidf_extracter.fit_transform(train_texts) >>> train_Y = train_df[0] >>> svm = LinearSVC() >>> svm.fit(train_X, train_Y) 学習の実行
  126. toiro によるテキスト分類モデル(SVM)の学習 • SVM モデルの学習とラベル予測方法 ◦ LinearSVC と tfidf_extracter を利用し、容易にモデル学習が可能

    126 >>> from toiro import classifiers >>> from toiro import datadownloader >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> model = classifiers.SVMClassificationModel(tokenizer='mecab-python3 ') >>> model.fit(train_df, dev_df) >>> text = "とても良い作品でした。" >>> pred_y = model.predict(text) >>> print(pred_y) 1
  127. toiro によるテキスト分類モデル(SVM)の学習 • SVM モデルの評価結果の出力 ◦ sklearn.metrics の結果を確認 127 >>>

    result = model.eval(test_df) >>> print(result) accuracy_score: 0.9088 macro_f1_score: 0.9087663676337645 classification_report: precision recall f1-score support 0 0.93 0.90 0.91 647 1 0.89 0.92 0.91 603 accuracy 0.91 1250 macro avg 0.91 0.91 0.91 1250 weighted avg 0.91 0.91 0.91 1250 elapsed_time: 4.420864582061768
  128. Transformers • 特徴と利点 ◦ Pytorch と TensorFlow 2.0 による最先端自然言語処理ライブラリ ◦

    BERT や XLNET など、最先端のモデルが利用可能 ◦ 日本語 BERT モデル(bert-base-japanese)が利用可能 • インストール方法 • GitHub リンク ◦ https://github.com/huggingface/transformers • 参考サイト ◦ https://huggingface.co/transformers/ 128 $ pip install torch transformers
  129. Transformers の利用方法(ベクトル化 ) • 日本語 BERT モデルによるテキストのベクトル化 129 >>> import

    torch >>> from transformers.tokenization_bert_japanese import BertJapaneseTokenizer >>> from transformers import BertModel >>> model_name = "cl-tohoku/bert-base-japanese-whole-word-masking" >>> tokenizer = BertJapaneseTokenizer.from_pretrained(model_name) >>> model = BertModel.from_pretrained(model_name) >>> input_batch = ["とても良い作品でした。"] >>> encoded_data = tokenizer.batch_encode_plus(input_batch, pad_to_max_length=True, add_special_tokens=True) >>> input_ids = torch.tensor(encoded_data["input_ids"]) >>> outputs = model(input_ids) >>> last_hidden_states = outputs[0] >>> sentence_vec = last_hidden_states[:, 0, :]
  130. Transformers の利用方法(ベクトル化 ) • 日本語 BERT モデルによるテキストのベクトル化 130 >>> import

    torch >>> from transformers.tokenization_bert_japanese import BertJapaneseTokenizer >>> from transformers import BertModel >>> model_name = "cl-tohoku/bert-base-japanese-whole-word-masking" >>> tokenizer = BertJapaneseTokenizer.from_pretrained(model_name) >>> model = BertModel.from_pretrained(model_name) >>> input_batch = ["とても良い作品でした。"] >>> encoded_data = tokenizer.batch_encode_plus(input_batch, pad_to_max_length=True, add_special_tokens=True) >>> input_ids = torch.tensor(encoded_data["input_ids"]) >>> outputs = model(input_ids) >>> last_hidden_states = outputs[0] >>> sentence_vec = last_hidden_states[:, 0, :] ライブラリのインポート
  131. Transformers の利用方法(ベクトル化 ) • 日本語 BERT モデルによるテキストのベクトル化 131 >>> import

    torch >>> from transformers.tokenization_bert_japanese import BertJapaneseTokenizer >>> from transformers import BertModel >>> model_name = "cl-tohoku/bert-base-japanese-whole-word-masking" >>> tokenizer = BertJapaneseTokenizer.from_pretrained(model_name) >>> model = BertModel.from_pretrained(model_name) >>> input_batch = ["とても良い作品でした。"] >>> encoded_data = tokenizer.batch_encode_plus(input_batch, pad_to_max_length=True, add_special_tokens=True) >>> input_ids = torch.tensor(encoded_data["input_ids"]) >>> outputs = model(input_ids) >>> last_hidden_states = outputs[0] >>> sentence_vec = last_hidden_states[:, 0, :] トークナイザーと モデルを定義
  132. Transformers の利用方法(ベクトル化 ) • 日本語 BERT モデルによるテキストのベクトル化 132 >>> import

    torch >>> from transformers.tokenization_bert_japanese import BertJapaneseTokenizer >>> from transformers import BertModel >>> model_name = "cl-tohoku/bert-base-japanese-whole-word-masking" >>> tokenizer = BertJapaneseTokenizer.from_pretrained(model_name) >>> model = BertModel.from_pretrained(model_name) >>> input_batch = ["とても良い作品でした。"] >>> encoded_data = tokenizer.batch_encode_plus(input_batch, pad_to_max_length=True, add_special_tokens=True) >>> input_ids = torch.tensor(encoded_data["input_ids"]) >>> outputs = model(input_ids) >>> last_hidden_states = outputs[0] >>> sentence_vec = last_hidden_states[:, 0, :] テキストを id に変換
  133. Transformers の利用方法(ベクトル化 ) • 日本語 BERT モデルによるテキストのベクトル化 133 >>> import

    torch >>> from transformers.tokenization_bert_japanese import BertJapaneseTokenizer >>> from transformers import BertModel >>> model_name = "cl-tohoku/bert-base-japanese-whole-word-masking" >>> tokenizer = BertJapaneseTokenizer.from_pretrained(model_name) >>> model = BertModel.from_pretrained(model_name) >>> input_batch = ["とても良い作品でした。"] >>> encoded_data = tokenizer.batch_encode_plus(input_batch, pad_to_max_length=True, add_special_tokens=True) >>> input_ids = torch.tensor(encoded_data["input_ids"]) >>> outputs = model(input_ids) >>> last_hidden_states = outputs[0] >>> sentence_vec = last_hidden_states[:, 0, :] ベクトル化の実行
  134. Transformers の利用方法(ベクトル化 ) • 日本語 BERT モデルによるテキストのベクトル化 134 >>> import

    torch >>> from transformers.tokenization_bert_japanese import BertJapaneseTokenizer >>> from transformers import BertModel >>> model_name = "cl-tohoku/bert-base-japanese-whole-word-masking" >>> tokenizer = BertJapaneseTokenizer.from_pretrained(model_name) >>> model = BertModel.from_pretrained(model_name) >>> input_batch = ["とても良い作品でした。"] >>> encoded_data = tokenizer.batch_encode_plus(input_batch, pad_to_max_length=True, add_special_tokens=True) >>> input_ids = torch.tensor(encoded_data["input_ids"]) >>> outputs = model(input_ids) >>> last_hidden_states = outputs[0] >>> sentence_vec = last_hidden_states[:, 0, :] • 日本語 BERT モデルによるテキストのベクトル化 CLS ベクトルを取得操作
  135. Transformers の利用方法(ベクトル化) • 日本語 BERT モデルによるテキストのベクトル化 135 >>> print(sentence_vec) tensor([[

    2.6584e-01, 1.5733e-02, -5.5184e-01, -2.6881e-01, -3.3179e-01, 3.7371e-01, -5.9107e-02, -2.2306e-01, 4.1955e-01, -5.0272e-01, -5.1751e-01, -1.0767e-01, 1.1714e-02, 4.1104e-01, 3.6833e-01, 8.5412e-01, -1.4727e-03, 3.8684e-01, -2.3235e-01, -5.9252e-01, 7.5186e-01, -6.9910e-01, -8.3287e-01, 3.9897e-01, -4.2667e-02, -3.5826e-01, 4.5544e-02, -4.8805e-01, -1.6543e-02, -4.3460e-02, 2.5553e-01, 7.1770e-02, -5.0605e-01, -6.4106e-01, 2.5535e-01, -2.2166e-01, 9.8572e-02, -1.3150e-01, 4.7107e-01, -1.2239e+00, 4.3229e-01, 2.3325e-01, -7.4171e-01, -2.3981e-01, 2.3239e-01, -4.8776e-01]], grad_fn=<SliceBackward>) ベクトルの出力 (実際は 768 次元)
  136. Transformers の利用方法(ベクトル化) • これまでの操作により BERT モデルの C 部分のベクトルを取得 136 入力:['とても',

    '良い', '作品', 'でし', 'た', '。'] ベクトルの出力 (実際は 768 次元)
  137. toiro によるテキスト分類モデル(BERT)の学習 • インストール方法 • 実装方法 137 $ pip install

    toiro[all] >>> from toiro import classifiers >>> from toiro import datadownloader >>> corpus = 'yahoo_movie_reviews' >>> train_df, dev_df, test_df = datadownloader.load_corpus(corpus, n=12500) >>> model = classifiers.BERTClassificationModel() >>> model.fit(train_df, dev_df) >>> text = "とても良い作品でした。" >>> pred_y = model.predict(text) >>> print(pred_y) 1
  138. テキスト分類モデルの精度比較 • 9種類の日本語処理ライブラリを利用した SVM と BERT モデルを比較 ◦ 学習データは 10,000件(1件あたりの平均文字数:322文字)

    最高精度は BERT 正解数は 1150件 (GPU を利用して約16分) 最速は SentencePiece 正解数は 1136件 (CPU を利用して約4秒) Python 実装による ライブラリの速度は 約3分〜5分 138
  139. おわりに • 目的タスクに適した日本語処理ライブラリを選択しよう ◦ 処理時間の短縮や目的タスクの精度向上に貢献する可能性あり 判断基準 ライブラリ 言語情報が必要 GiNZA(固有表現情報、依存構造解析) Juman++

    v2(意味情報) KyTea(読み情報) 実行速度が必要 mecab-python3 SentencePiece 複数単位の分割が必要 SudachiPy 新語に対応したい SudachiPy サブワードを利用したい SentencePiece ユーザー辞書を簡単に登録したい nagisa Windows で言語処理を試したい Janome 言語処理または Python 初心者である Janome
  140. 本発表で参考にした資料一覧 • 形態素解析の理論と実装 • 言語処理学会第24回年次大会ワークショップ 形態素解析の今とこれから • 汎用形態素解析システムMeCab • Janome

    ではじめるテキストマイニング • Elasticsearchのための新しい形態素解析器 「Sudachi」 • GiNZA: 日本語自然言語処理オープンソースライブラリー • Python による日本語自然言語処理 〜系列ラベリングによる実世界テキス ト分析〜 • Sentencepiece : ニューラル言語処理向けトークナイザ • 日本語の単語分割 品詞推定 日本語の単語分割・品詞推定あるいは KyTea の話 • 日本語形態素解析システム JUMAN++