Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

言語処理における機械学習モデルの開発フロー 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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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]

Slide 72

Slide 72 text

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]

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

ライブラリの機能比較 ライブラリ名 単語分割基準(単語長) 品詞体系 付与言語情報 実行速度 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文/秒 ● 赤文字はライブラリ選択のメリット、青文字はライブラリ選択のデメリット

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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)

Slide 96

Slide 96 text

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)

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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]

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

テキスト分類モデルの学習方法 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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

scikit-learn ● 特徴と利点 ○ Python によるオープンソース機械学習ライブラリ ○ サポートベクターマシン(SVM)など、様々なアルゴリズムが利用可能 ○ scikit-learn のみで機械学習に取り組むことも十分可能 ● インストール方法 ● GitHub リンク ○ https://github.com/scikit-learn/scikit-learn ● 参考サイト ○ https://scikit-learn.org/stable/ 111 $ pip install scikit-learn

Slide 112

Slide 112 text

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)

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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 ベクトル化の結果

Slide 121

Slide 121 text

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)

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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

Slide 135

Slide 135 text

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 次元)

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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