$30 off During Our Annual Pro Sale. View Details »

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

taishi-i
August 27, 2020

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

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

taishi-i

August 27, 2020
Tweet

More Decks by taishi-i

Other Decks in Programming

Transcript

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

    View Slide

  2. 自己紹介
    ● 名前
    ○ 池田 大志(Taishi Ikeda)
    ● 略歴
    ○ 2015 - 2017: 奈良先端大 自然言語処理学研究室 出身
    ○ 2017 - 現在 : 企業にて自然言語処理に関する研究開発に従事
    ● 最近の取り組み
    ○ 形態素解析の今とこれから@言語処理学会 2018
    ○ ポスター発表@PyCon JP 2018
    ○ 全国大会@人工知能学会 2019
    ○ トークセッション 30分@PyCon JP 2019
    ○ 年次大会@言語処理学会 2020
    2

    View Slide

  3. PyCon JP 2019 での発表
    ● Python による日本語自然言語処理
    〜系列ラベリングによる実世界テキスト分析〜
    ○ 日本語コーパスから固有表現抽出モデルを実装する方法について発表
    3

    View Slide

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

    View Slide

  5. 本発表について
    ● 概要
    ○ 日本語処理ライブラリの特徴と利用方法を説明
    ○ ユーザーレビューからテキスト分類モデルを実装する方法を説明
    ● 対象となる聞き手
    ○ Python を利用して自然言語処理を始めたい人
    ○ 日本語処理ライブラリの選定に困っている人
    ○ どのように日本語処理ライブラリが実装されているか知りたい人
    ● サンプルコードは GitHub にて公開中
    ○ https://github.com/taishi-i/toiro/tree/master/PyConJP2020
    5

    View Slide

  6. 6
    本発表の目的
    ● 各自のユースケースに適したライブラリを発見してもらうことが目的
    ○ Python で利用可能な日本語処理ライブラリを比較します
    ○ 目的タスクに適したライブラリの選択基準を共有します

    View Slide

  7. 本発表の方針
    ● サンプルコードの実行は Google Colab を推奨
    ○ サンプルコードの動作環境は Google Colab 上を想定しています
    (Colab 上で実行済み、環境依存のエラーを回避するため)
    ○ http://bit.ly/pyconjp2020
    7

    View Slide

  8. 本発表の方針
    ● 発表の内容の質問について
    ○ Zoom コメントの質問は GitHub の wiki で回答します
    ○ 発表終了後の質問は GitHub の Issue でお待ちしております
    ( Labels を PyConJP2020 と設定してください)
    ○ https://github.com/taishi-i/toiro/issues
    8

    View Slide

  9. 目次(1/2)
    ● Python を利用した日本語自然言語処理
    ○ 言語処理における機械学習モデルの開発フロー
    ○ 単語分割と特徴量の選定処理
    ○ Python でどのように単語分割を実装するか?
    ● 各ライブラリの特徴と実装方法
    ○ 説明項目について
    ○ 各ライブラリの特徴と実装方法
    ○ ライブラリの機能比較
    ○ (参考)単語分割基準と品詞体系
    ○ 形態素解析比較ライブラリ toiro の紹介
    9

    View Slide

  10. 目次(2/2)
    ● 映画のユーザーレビューを利用したテキスト分類モデルの実装
    ○ テキスト分類タスクの概要
    ○ 検証用データ:Yahoo movie reviews
    ○ 各ライブラリの特徴と利用方法
    ○ テキスト分類モデルの性能比較
    10

    View Slide

  11. Python を利用した日本語自然言語処理

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. 単語分割と特徴量の選定処理
    ● 日本語テキストの言語処理では、前処理として単語分割が必要となる
    21
    入力文: Pythonで簡単に使えるツールです
    Python で 簡単 に 使える ツール です
    単語分割
    目的タスク
    文書分類 機械翻訳 質問応答 など
    出力文: An easy to use tool in Python
    目的タスクの入力

    View Slide

  22. ● Python では日本語処理ライブラリが多く存在する
    ● ライブラリの選択基準も様々
    ○ 実行速度
    ○ 単語の分割単位、単語に付与する言語情報
    ○ ライブラリの実装手段
    ○ インストールの容易さ、ライブラリの使いやすさ、参考資料の豊富さ
    ○ 目的タスクの精度
    ● ユーザー側の選択肢は増え、情報収集を含む技術選定コストは増加
    22
    Python でどのように単語分割を実装するか?
    本発表では日本語処理ライブラリを比較し、
    各ライブラリの選択基準を共有する

    View Slide

  23. 各ライブラリの特徴と利用方法

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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 ライブラリの
    インストール方法

    View Slide

  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 インタプリタ上での
    テキスト解析処理の実装方法

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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,*,*
    記号,空白,*,*,*,*, ,*,*
    で 接続詞,*,*,*,*,*,で,デ,デ
    前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   

    View Slide

  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,*,*
    記号,空白,*,*,*,*, ,*,*
    で 接続詞,*,*,*,*,*,で,デ,デ
    前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   

    View Slide

  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,*,*
    記号,空白,*,*,*,*, ,*,*
    で 接続詞,*,*,*,*,*,で,デ,デ
    前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   
    ライブラリのインポート

    View Slide

  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,*,*
    記号,空白,*,*,*,*, ,*,*
    で 接続詞,*,*,*,*,*,で,デ,デ
    前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   
    インスタンスの定義

    View Slide

  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,*,*
    記号,空白,*,*,*,*, ,*,*
    で 接続詞,*,*,*,*,*,で,デ,デ
    前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   
    入力テキストの定義

    View Slide

  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,*,*
    記号,空白,*,*,*,*, ,*,*
    で 接続詞,*,*,*,*,*,で,デ,デ
    前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン   
    解析の実行

    View Slide

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

    View Slide

  42. mecab-python3(==0.996.5)
    ● 特徴と利点
    ○ MeCab の Python ラッパー
    ○ 研究、実応用問わず幅広く使われている最もメジャーな形態素解析
    ○ MeCab を swig 経由で呼び出すため、非常に高速な解析が可能
    ● ライブラリの実装手段と実行速度
    ○ MeCab 本体:C++
    ○ Python ライブラリ:Swig による呼び出し
    ○ 25077文/秒(5900文、1文あたり平均39文字)
    ● 解析手法
    ○ 条件付き確率場(CRF)を利用した最小コスト法による解析
    ● 分割基準
    ○ IPADIC、(NEologd、JUMAN、UniDic)
    42

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. 48
    汎用テキスト処理システム MeCab が高速な理由
    ● 言語処理学会第24回年次大会ワークショップ
    ○ 形態素解析の今とこれから 「形態素解析だョ!全員集合」
    ○ 「汎用形態素解析システムMeCab」工藤拓氏 (グーグル合同会社)
    5.8 高速化のための工夫(P. 122 )
    → 実装方法が詳細に説明
    発表スライドより引用

    View Slide

  49. mecab-python3 の参考資料
    ● GitHub リンク
    ○ https://github.com/taku910/mecab
    ○ https://github.com/SamuraiT/mecab-python3
    ● 公式ドキュメント
    ○ https://taku910.github.io/mecab/
    ● 参考サイト
    ○ 汎用形態素解析システムMeCab
    ○ 言語処理学会第24回年次大会ワークショップ での招待発表スライド
    ○ MeCabが誕生した歴史的背景と設計、開発方針について説明
    49

    View Slide

  50. SudachiPy
    ● 特徴と利点
    ○ 専門家による語彙の追加や調整がなされた高品質な辞書を搭載
    ○ 企業(ワークスアプリケーションズ)による継続的な辞書更新
    ○ 複数の分割単位(3種類:A, B, C)での出力が可能
    ● ライブラリの実装手段と実行速度
    ○ Python, Cython
    ○ 591文/秒(5900文、1文あたり平均39文字)
    ● 解析手法
    ○ 条件付き確率場(CRF)を利用した最小コスト法による解析
    ● 分割基準
    ○ A は UniDic 短単位相当、C は固有表現相当、
    B は A, C の中間的な単位
    50

    View Slide

  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 ['名詞', '普通名詞', '一般', '*', '*', '*'] 

    View Slide

  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 ['名詞', '普通名詞', '一般', '*', '*', '*'] 

    View Slide

  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 ['名詞', '普通名詞', '一般', '*', '*', '*'] 
    ライブラリのインポート

    View Slide

  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 ['名詞', '普通名詞', '一般', '*', '*', '*'] 
    インスタンスの定義
    分割基準の設定

    View Slide

  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 ['名詞', '普通名詞', '一般', '*', '*', '*'] 
    解析の実行

    View Slide

  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

    View Slide

  57. GiNZA
    ● 特徴と利点
    ○ 依存構造(係り受け)解析や固有表現抽出が可能
    ○ 国際化されたフレームワーク(spaCy)上で利用可能
    ● ライブラリの実装手段と実行速度
    ○ Python, Cython
    ○ 472文/秒(5900文、1文あたり平均39文字)
    ● 解析手法
    ○ 単語分割、品詞タグ付け:SudachiPy の結果を利用
    ○ 依存構造解析、固有表現抽出:spaCyのAPIを利用し、UD Japanese BCCWJ
    v2.6を学習
    ● 分割基準
    ○ SudachiPy の結果を利用
    57

    View Slide

  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

    View Slide

  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

    View Slide

  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
    ライブラリのインポート

    View Slide

  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
    インスタンスの定義

    View Slide

  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
    解析の実行

    View Slide

  63. GiNZA の参考資料
    ● GitHub リンク
    ○ https://github.com/megagonlabs/ginza
    ● 公式サイト
    ○ https://megagonlabs.github.io/ginza/
    ● 参考サイト
    ○ GiNZA: 日本語自然言語処理オープンソースライブラリー
    ○ spaCy/GiNZA を用いた自然言語処理
    ○ GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPと
    の比較〜
    ○ 短単位品詞の用法曖昧性解決と依存関係ラベリングの同時学習
    63

    View Slide

  64. nagisa
    ● 特徴と利点
    ○ シンプルな単語分割と品詞タグ付け機能を提供
    ○ ユーザー辞書の追加が容易、系列ラベリングモデルの学習が可能
    ● ライブラリの実装手段と実行速度
    ○ Python, Cython
    ○ 383文/秒(5900文、1文あたり平均39文字)
    ● 解析手法
    ○ BLSTMs を用いた系列ラベリングによる単語分割と品詞タグ付け
    ● 分割基準
    ○ UniDic
    64

    View Slide

  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)
    ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']

    View Slide

  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)
    ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']

    View Slide

  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)
    ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']
    ライブラリのインポート

    View Slide

  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)
    ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']
    解析の実行

    View Slide

  69. nagisa の参考資料
    ● GitHub リンク
    ○ https://github.com/taishi-i/nagisa
    ● 参考サイト
    ○ nagisa: RNNによる日本語単語分割・品詞タグ付けツール
    ○ Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト
    分析〜
    ○ 形態素解析ツールのnagisa(なぎさ)を知っていますか?
    ○ Pythonで動く形態素解析ツール「nagisa」を使ってみた
    69

    View Slide

  70. SentencePiece
    ● 特徴と利点
    ○ ニューラル言語処理向けトークナイザ
    ○ 言語依存処理がなく、データから教師なしで分割(サブワード)を学習
    ○ テキストの圧縮率をベースに最適化を行い、語彙サイズを圧縮
    ● ライブラリの実装手段と実行速度
    ○ SentencePiece 本体:C++
    ○ Python ライブラリ:Swig による呼び出し
    ○ 49566文/秒(5900文、1文あたり平均39文字)
    ● 解析手法
    ○ 生文から直接言語モデルベースの分割を学習
    ● 分割基準
    ○ サブワード(語彙数や学習データに依存)
    70

    View Slide

  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]

    View Slide

  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]

    View Slide

  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]
    ライブラリのインポート

    View Slide

  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]
    インスタンスを定義

    View Slide

  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]
    モデルのロード

    View Slide

  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]
    解析の実行

    View Slide

  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

    View Slide

  78. KyTea
    ● 特徴と利点
    ○ 点予測による単語分割と品詞推定を採用し未知語に対して頑健
    ○ 部分的アノテーションによるモデル学習が可能であり分野適応が容易
    ○ 読み推定が可能
    ● ライブラリの実装手段と実行速度
    ○ KyTea本体:C++, LIBLINEAR を利用
    ○ Pythonライブラリ:Swig による呼び出し
    ○ 15868文/秒(5900文、1文あたり平均39文字)
    ● 解析手法
    ○ 線形SVM(LIBLINEAR)による単語分割と品詞推定
    ● 分割基準
    ○ UniDic
    78

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  85. Juman++ v2
    ● 特徴と利点
    ○ RNN 言語モデルを利用した高性能な形態素解析システム
    ○ 単語の並びの意味的な自然さを考慮した解析を行う
    ○ JUMAN、MeCab に比べ大きく性能が向上
    ● ライブラリの実装手段と実行速度
    ○ Juman++ V2 本体:C++
    ○ Pythonライブラリ:Subprocessによる実行、文字列処理
    ○ 738文/秒(5900文、1文あたり平均39文字)
    ● 解析手法
    ○ ラティス構築後、線形モデルとRNNモデルによるコスト推定
    ● 分割基準
    ○ JUMAN辞書基準
    85

    View Slide

  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 本体の
    インストールが必要

    View Slide

  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 本体の
    インストールが必要

    View Slide

  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
    前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん
    ライブラリのインポート

    View Slide

  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
    前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん
    インスタンスの定義

    View Slide

  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
    前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん
    解析の実行

    View Slide

  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

    View Slide

  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文/秒
    ● 赤文字はライブラリ選択のメリット、青文字はライブラリ選択のデメリット

    View Slide

  93. (参考)単語分割基準と品詞体系
    ● IPADIC
    ○ ipadic version 2.7.0 ユーザーズマニュアル
    ○ ChaSen 品詞体系 (IPA品詞体系)
    ● JUMAN
    ○ 形態素・構文タグ付きコーパス作成の作業基準 version 1.8
    ○ Juman 品詞体系
    ● UniDic
    ○ UniDic品詞体系
    ● SudachiDict
    ○ https://github.com/WorksApplications/SudachiDict
    93

    View Slide

  94. 形態素解析器比較ライブラリ toiro の紹介
    ● 日本語処理の便利機能を搭載した Python ライブラリ
    ○ 日本語コーパスのダウンローダーと前処理機能を搭載
    ○ 数行のコードで処理速度の比較、単語分割の比較、後段タスクでの精度比較
    が可能
    ○ Dockerでは、環境構築なしに9種類の解析器の比較が可能
    ○ https://github.com/taishi-i/toiro
    94

    View Slide

  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)

    View Slide

  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)

    View Slide

  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)
    ライブラリのインポート

    View Slide

  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)
    コーパスのダウンロード

    View Slide

  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)
    解析器の比較を実行

    View Slide

  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]

    View Slide

  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}}

    View Slide

  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: ▁|都|庁|所在地|は|新宿|区|。

    View Slide

  103. 映画のユーザーレビューを利用した
    テキスト分類モデルの実装

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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
    出現頻度による特徴

    View Slide

  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
    言語モデルによる特徴

    View Slide

  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
    このパターンを学習する
    言語モデルによる特徴

    View Slide

  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 これまで観た映画の中で最も恐ろしい映画だ。ホラー映画(嫌いだから
    ほとんど観たことはない)とは...

    View Slide

  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

    View Slide

  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)

    View Slide

  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)
    ライブラリのインポート

    View Slide

  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)
    コーパスのロード

    View Slide

  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)
    単語分割の定義

    View Slide

  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 の定義

    View Slide

  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 を構築

    View Slide

  118. scikit-learn の利用方法(ベクトル化)
    ● tfidf_extracter.transform を利用し、テキストをベクトル化する
    118
    >>> text = "とても良い作品でした。"
    >>> x = tfidf_extracter.transform([text])
    >>> x
    <1x92143 sparse matrix of type ''
    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

    View Slide

  119. scikit-learn の利用方法(ベクトル化)
    ● tfidf_extracter.transform を利用し、テキストをベクトル化する
    119
    テキストを TF-IDF に変換
    >>> text = "とても良い作品でした。"
    >>> x = tfidf_extracter.transform([text])
    >>> x
    <1x92143 sparse matrix of type ''
    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

    View Slide

  120. scikit-learn の利用方法(ベクトル化)
    ● tfidf_extracter.transform を利用し、テキストをベクトル化する
    120
    >>> text = "とても良い作品でした。"
    >>> x = tfidf_extracter.transform([text])
    >>> x
    <1x92143 sparse matrix of type ''
    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
    ベクトル化の結果

    View Slide

  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)

    View Slide

  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)
    ライブラリのインポート

    View Slide

  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)
    コーパスを読み込む

    View Slide

  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 に変換

    View Slide

  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)
    学習の実行

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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, :]

    View Slide

  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, :]
    ライブラリのインポート

    View Slide

  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, :]
    トークナイザーと
    モデルを定義

    View Slide

  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 に変換

    View Slide

  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, :]
    ベクトル化の実行

    View Slide

  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 ベクトルを取得操作

    View Slide

  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=)
    ベクトルの出力
    (実際は 768 次元)

    View Slide

  136. Transformers の利用方法(ベクトル化)
    ● これまでの操作により BERT モデルの C 部分のベクトルを取得
    136
    入力:['とても', '良い', '作品', 'でし', 'た', '。']
    ベクトルの出力
    (実際は 768 次元)

    View Slide

  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

    View Slide

  138. テキスト分類モデルの精度比較
    ● 9種類の日本語処理ライブラリを利用した SVM と BERT モデルを比較
    ○ 学習データは 10,000件(1件あたりの平均文字数:322文字)
    最高精度は BERT
    正解数は 1150件
    (GPU を利用して約16分)
    最速は SentencePiece
    正解数は 1136件
    (CPU を利用して約4秒)
    Python 実装による
    ライブラリの速度は
    約3分〜5分
    138

    View Slide

  139. おわりに
    ● 目的タスクに適した日本語処理ライブラリを選択しよう
    ○ 処理時間の短縮や目的タスクの精度向上に貢献する可能性あり
    判断基準 ライブラリ
    言語情報が必要
    GiNZA(固有表現情報、依存構造解析)
    Juman++ v2(意味情報)
    KyTea(読み情報)
    実行速度が必要
    mecab-python3
    SentencePiece
    複数単位の分割が必要 SudachiPy
    新語に対応したい SudachiPy
    サブワードを利用したい SentencePiece
    ユーザー辞書を簡単に登録したい nagisa
    Windows で言語処理を試したい Janome
    言語処理または Python 初心者である Janome

    View Slide

  140. 本発表で参考にした資料一覧
    ● 形態素解析の理論と実装
    ● 言語処理学会第24回年次大会ワークショップ 形態素解析の今とこれから
    ● 汎用形態素解析システムMeCab
    ● Janome ではじめるテキストマイニング
    ● Elasticsearchのための新しい形態素解析器 「Sudachi」
    ● GiNZA: 日本語自然言語処理オープンソースライブラリー
    ● Python による日本語自然言語処理 〜系列ラベリングによる実世界テキス
    ト分析〜
    ● Sentencepiece : ニューラル言語処理向けトークナイザ
    ● 日本語の単語分割 品詞推定 日本語の単語分割・品詞推定あるいは
    KyTea の話
    ● 日本語形態素解析システム JUMAN++

    View Slide