Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
最先端自然言語処理ライブラリの最適な選択と有用な利用方法 / pycon-jp-2020
taishi-i
August 27, 2020
Programming
24
14k
最先端自然言語処理ライブラリの最適な選択と有用な利用方法 / pycon-jp-2020
PyCon JP 2020 での発表スライドです。
GitHub:
https://github.com/taishi-i/toiro/tree/master/PyConJP2020
taishi-i
August 27, 2020
Tweet
Share
More Decks by taishi-i
See All by taishi-i
Python ライブラリ開発における失敗談 〜開発者に選ばれるライブラリを作るために必要なこと〜 / pycon-jp-2022
taishii
3
5.8k
Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト分析〜 / PyCon JP 2019
taishii
24
16k
Other Decks in Programming
See All in Programming
Gradle build: The time is now
nonews
1
470
Functional Data Engineering - A Blueprint for adopting functional principles in data pipeline
vananth22
0
180
ポケモンで学ぶiOS 16弾丸ツアー 🚅
giginet
PRO
1
610
Step Functions Distributed Map を使ってみた
codemountains
0
100
An Advanced Introduction to R
nicetak
0
1.8k
OSSから学んだPR Descriptionの書き方
fugakkbn
4
130
僕が考えた超最強のKMMアプリの作り方
spbaya0141
0
180
監視せなあかんし、五大紙だけにオオカミってな🐺🐺🐺🐺🐺
sadnessojisan
2
1.5k
NGK2023S - OCaml最高! スマホ開発にも使えちゃう?!
haochenxie
0
120
Hono v3 - Do Everything, Run Anywhere, But Small, And Faster
yusukebe
4
130
レガシーフレームワークからの移行
ug
0
120
ECテックカンファレンス2023
kspace
1
340
Featured
See All Featured
Stop Working from a Prison Cell
hatefulcrawdad
263
18k
Scaling GitHub
holman
453
140k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
22
1.7k
Why You Should Never Use an ORM
jnunemaker
PRO
49
7.9k
Building Your Own Lightsaber
phodgson
96
4.9k
Pencils Down: Stop Designing & Start Developing
hursman
114
10k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
239
19k
How New CSS Is Changing Everything About Graphic Design on the Web
jensimmons
214
12k
Faster Mobile Websites
deanohume
295
29k
Rails Girls Zürich Keynote
gr2m
87
12k
YesSQL, Process and Tooling at Scale
rocio
159
12k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
15
1.2k
Transcript
最先端自然言語処理ライブラリの 最適な選択と有用な利用方法 PyCon JP 2020 池田 大志
自己紹介 • 名前 ◦ 池田 大志(Taishi Ikeda) • 略歴 ◦
2015 - 2017: 奈良先端大 自然言語処理学研究室 出身 ◦ 2017 - 現在 : 企業にて自然言語処理に関する研究開発に従事 • 最近の取り組み ◦ 形態素解析の今とこれから@言語処理学会 2018 ◦ ポスター発表@PyCon JP 2018 ◦ 全国大会@人工知能学会 2019 ◦ トークセッション 30分@PyCon JP 2019 ◦ 年次大会@言語処理学会 2020 2
PyCon JP 2019 での発表 • Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト分析〜 ◦ 日本語コーパスから固有表現抽出モデルを実装する方法について発表
3
言語処理学会 第26回年次大会での発表 • 文書分類におけるテキストノイズおよびラベルノイズの影響分析 ◦ 学習データに混入するノイズの影響を調査した研究 4
本発表について • 概要 ◦ 日本語処理ライブラリの特徴と利用方法を説明 ◦ ユーザーレビューからテキスト分類モデルを実装する方法を説明 • 対象となる聞き手 ◦
Python を利用して自然言語処理を始めたい人 ◦ 日本語処理ライブラリの選定に困っている人 ◦ どのように日本語処理ライブラリが実装されているか知りたい人 • サンプルコードは GitHub にて公開中 ◦ https://github.com/taishi-i/toiro/tree/master/PyConJP2020 5
6 本発表の目的 • 各自のユースケースに適したライブラリを発見してもらうことが目的 ◦ Python で利用可能な日本語処理ライブラリを比較します ◦ 目的タスクに適したライブラリの選択基準を共有します
本発表の方針 • サンプルコードの実行は Google Colab を推奨 ◦ サンプルコードの動作環境は Google Colab
上を想定しています (Colab 上で実行済み、環境依存のエラーを回避するため) ◦ http://bit.ly/pyconjp2020 7
本発表の方針 • 発表の内容の質問について ◦ Zoom コメントの質問は GitHub の wiki で回答します
◦ 発表終了後の質問は GitHub の Issue でお待ちしております ( Labels を PyConJP2020 と設定してください) ◦ https://github.com/taishi-i/toiro/issues 8
目次(1/2) • Python を利用した日本語自然言語処理 ◦ 言語処理における機械学習モデルの開発フロー ◦ 単語分割と特徴量の選定処理 ◦ Python
でどのように単語分割を実装するか? • 各ライブラリの特徴と実装方法 ◦ 説明項目について ◦ 各ライブラリの特徴と実装方法 ◦ ライブラリの機能比較 ◦ (参考)単語分割基準と品詞体系 ◦ 形態素解析比較ライブラリ toiro の紹介 9
目次(2/2) • 映画のユーザーレビューを利用したテキスト分類モデルの実装 ◦ テキスト分類タスクの概要 ◦ 検証用データ:Yahoo movie reviews ◦
各ライブラリの特徴と利用方法 ◦ テキスト分類モデルの性能比較 10
Python を利用した日本語自然言語処理
言語処理における機械学習モデルの開発フロー 12 • まずは、どの処理で Python ライブラリが必要となるか考える コーパス ① 前処理 学習データ
開発データ 評価データ ② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策
言語処理における機械学習モデルの開発フロー 13 • まずは、どの処理で Python ライブラリが必要となるか考える コーパス ① 前処理 学習データ
開発データ 評価データ ② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策 単語分割と特徴量の選定処理 1. mecab-python3 2. Janome 3. SudachiPy 4. nagisa 5. GiNZA 6. Juman++ v2 7. KyTea 8. SentencePiece
言語処理における機械学習モデルの開発フロー 14 • まずは、どの処理で Python ライブラリが必要となるか考える コーパス ① 前処理 学習データ
開発データ 評価データ ② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策 モデル学習の処理 1. scikit-learn 2. Transformers 3. spaCy 4. AllenNLP 5. FLAIR 1. mecab-python3 2. Janome 3. SudachiPy 4. nagisa 5. GiNZA 6. Juman++ v2 7. KyTea 8. SentencePiece
単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 15 入力文: Pythonで簡単に使えるツールです
単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 16 入力文: Pythonで簡単に使えるツールです Python で 簡単 に
使える ツール です 単語分割
単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 17 入力文: Pythonで簡単に使えるツールです Python で 簡単 に
使える ツール です Python で 簡単 に 使える ツール です 名詞 助詞 形状詞 助詞 動詞 名詞 助動詞 単語分割 品詞タグ付け
Python 簡単 使える ツール 名詞 形状詞 動詞 名詞 単語分割と特徴量の選定処理 •
日本語テキストの言語処理では、前処理として単語分割が必要となる 18 入力文: Pythonで簡単に使えるツールです Python で 簡単 に 使える ツール です 単語分割 品詞タグ付け+品詞フィルタリング Python 簡単 使える ツール 名詞 形状詞 動詞 名詞
単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 19 入力文: Pythonで簡単に使えるツールです Python で 簡単 に
使える ツール です 単語分割 目的タスク 文書分類 機械翻訳 質問応答 など 目的タスクの入力
単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 20 入力文: Pythonで簡単に使えるツールです 単語分割+品詞フィルタリング 目的タスク 文書分類 機械翻訳
質問応答 など 出力ラベル: IT/コンピュータ Python 簡単 使える ツール 目的タスクの入力
単語分割と特徴量の選定処理 • 日本語テキストの言語処理では、前処理として単語分割が必要となる 21 入力文: Pythonで簡単に使えるツールです Python で 簡単 に
使える ツール です 単語分割 目的タスク 文書分類 機械翻訳 質問応答 など 出力文: An easy to use tool in Python 目的タスクの入力
• Python では日本語処理ライブラリが多く存在する • ライブラリの選択基準も様々 ◦ 実行速度 ◦ 単語の分割単位、単語に付与する言語情報 ◦
ライブラリの実装手段 ◦ インストールの容易さ、ライブラリの使いやすさ、参考資料の豊富さ ◦ 目的タスクの精度 • ユーザー側の選択肢は増え、情報収集を含む技術選定コストは増加 22 Python でどのように単語分割を実装するか? 本発表では日本語処理ライブラリを比較し、 各ライブラリの選択基準を共有する
各ライブラリの特徴と利用方法
Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •
ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 24 各説明項目について
Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •
ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 25 ライブラリ名
Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •
ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 26 他のライブラリと比較した特徴と利点
Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •
ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 27 解析器本体(処理部分)の実装手段と 単語分割処理の実行速度
Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •
ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 28 テキスト解析処理の解析手法
Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •
ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 29 単語分割の分割基準
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 ライブラリの インストール方法
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 インタプリタ上での テキスト解析処理の実装方法
Janome の参考資料 • GitHub リンク ◦ https://github.com/mocobeta/janome • 公式ドキュメント ◦
https://mocobeta.github.io/janome/ • 参考サイト ◦ Janome ではじめるテキストマイニング ◦ 形態素解析、WordCloud、テキスト前処理/後処理、TFIDF など、 ごく基本的な知識をつけてもらうことを目的としたチュートリアル ◦ Janome 開発者の本人が作成したスライドで非常にわかりやすい 32 ライブラリの GitHub リンク
Janome の参考資料 • GitHub リンク ◦ https://github.com/mocobeta/janome • 公式ドキュメント ◦
https://mocobeta.github.io/janome/ • 参考サイト ◦ Janome ではじめるテキストマイニング ◦ 形態素解析、WordCloud、テキスト前処理/後処理、TFIDF など、 ごく基本的な知識をつけてもらうことを目的としたチュートリアル ◦ Janome 開発者の本人が作成したスライドで非常にわかりやすい 33 公式ドキュメントや参考サイト
Janome • 特徴と利点 ◦ Pure python 実装でインストールが容易、依存ライブラリが不要 ◦ 品詞フィルター等の便利機能を標準機能として搭載 •
ライブラリの実装手段と実行速度 ◦ Pure python ◦ 698文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ mecab-ipadic-2.7.0-20070801コストを利用した最小コスト法による解析 • 分割基準 ◦ IPADIC 34
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,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン
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,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン
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,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン ライブラリのインポート
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,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン インスタンスの定義
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,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 入力テキストの定義
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,*,* 記号,空白,*,*,*,*, ,*,* で 接続詞,*,*,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 解析の実行
Janome の参考資料 • GitHub リンク ◦ https://github.com/mocobeta/janome • 公式ドキュメント ◦
https://mocobeta.github.io/janome/ • 参考サイト ◦ Janome ではじめるテキストマイニング ◦ 形態素解析、WordCloud、テキスト前処理/後処理、TFIDF など、 ごく基本的な知識をつけてもらうことを目的としたチュートリアル ◦ Janome 開発者の本人が作成したスライドで非常にわかりやすい 41
mecab-python3(==0.996.5) • 特徴と利点 ◦ MeCab の Python ラッパー ◦ 研究、実応用問わず幅広く使われている最もメジャーな形態素解析
◦ MeCab を swig 経由で呼び出すため、非常に高速な解析が可能 • ライブラリの実装手段と実行速度 ◦ MeCab 本体:C++ ◦ Python ライブラリ:Swig による呼び出し ◦ 25077文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 条件付き確率場(CRF)を利用した最小コスト法による解析 • 分割基準 ◦ IPADIC、(NEologd、JUMAN、UniDic) 42
mecab-python3 の利用方法 • インストール方法 • 実装方法 43 $ pip install
mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS
mecab-python3 の利用方法 • インストール方法 • 実装方法 44 $ pip install
mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS
mecab-python3 の利用方法 • インストール方法 • 実装方法 45 $ pip install
mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS ライブラリのインポート
mecab-python3 の利用方法 • インストール方法 • 実装方法 46 $ pip install
mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS インスタンスの定義
mecab-python3 の利用方法 • インストール方法 • 実装方法 47 $ pip install
mecab-python3==0.996.5 >>> import MeCab >>> tagger = MeCab.Tagger() >>> text = 'Python で前処理を実行する' >>> print(tagger.parse(text)) Python 名詞,一般,*,*,*,*,* で 助詞,格助詞,一般,*,*,*,で,デ,デ 前 接頭詞,名詞接続,*,*,*,*,前,ゼン,ゼン 処理名詞,サ変接続,*,*,*,*,処理,ショリ,ショリ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 実行名詞,サ変接続,*,*,*,*,実行,ジッコウ,ジッコー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル EOS 解析の実行
48 汎用テキスト処理システム MeCab が高速な理由 • 言語処理学会第24回年次大会ワークショップ ◦ 形態素解析の今とこれから 「形態素解析だョ!全員集合」 ◦
「汎用形態素解析システムMeCab」工藤拓氏 (グーグル合同会社) 5.8 高速化のための工夫(P. 122 ) → 実装方法が詳細に説明 発表スライドより引用
mecab-python3 の参考資料 • GitHub リンク ◦ https://github.com/taku910/mecab ◦ https://github.com/SamuraiT/mecab-python3 •
公式ドキュメント ◦ https://taku910.github.io/mecab/ • 参考サイト ◦ 汎用形態素解析システムMeCab ◦ 言語処理学会第24回年次大会ワークショップ での招待発表スライド ◦ MeCabが誕生した歴史的背景と設計、開発方針について説明 49
SudachiPy • 特徴と利点 ◦ 専門家による語彙の追加や調整がなされた高品質な辞書を搭載 ◦ 企業(ワークスアプリケーションズ)による継続的な辞書更新 ◦ 複数の分割単位(3種類:A, B,
C)での出力が可能 • ライブラリの実装手段と実行速度 ◦ Python, Cython ◦ 591文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 条件付き確率場(CRF)を利用した最小コスト法による解析 • 分割基準 ◦ A は UniDic 短単位相当、C は固有表現相当、 B は A, C の中間的な単位 50
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 ['名詞', '普通名詞', '一般', '*', '*', '*']
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 ['名詞', '普通名詞', '一般', '*', '*', '*']
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 ['名詞', '普通名詞', '一般', '*', '*', '*'] ライブラリのインポート
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 ['名詞', '普通名詞', '一般', '*', '*', '*'] インスタンスの定義 分割基準の設定
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 ['名詞', '普通名詞', '一般', '*', '*', '*'] 解析の実行
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
GiNZA • 特徴と利点 ◦ 依存構造(係り受け)解析や固有表現抽出が可能 ◦ 国際化されたフレームワーク(spaCy)上で利用可能 • ライブラリの実装手段と実行速度 ◦
Python, Cython ◦ 472文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 単語分割、品詞タグ付け:SudachiPy の結果を利用 ◦ 依存構造解析、固有表現抽出:spaCyのAPIを利用し、UD Japanese BCCWJ v2.6を学習 • 分割基準 ◦ SudachiPy の結果を利用 57
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
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
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 ライブラリのインポート
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 インスタンスの定義
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 解析の実行
GiNZA の参考資料 • GitHub リンク ◦ https://github.com/megagonlabs/ginza • 公式サイト ◦
https://megagonlabs.github.io/ginza/ • 参考サイト ◦ GiNZA: 日本語自然言語処理オープンソースライブラリー ◦ spaCy/GiNZA を用いた自然言語処理 ◦ GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPと の比較〜 ◦ 短単位品詞の用法曖昧性解決と依存関係ラベリングの同時学習 63
nagisa • 特徴と利点 ◦ シンプルな単語分割と品詞タグ付け機能を提供 ◦ ユーザー辞書の追加が容易、系列ラベリングモデルの学習が可能 • ライブラリの実装手段と実行速度 ◦
Python, Cython ◦ 383文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ BLSTMs を用いた系列ラベリングによる単語分割と品詞タグ付け • 分割基準 ◦ UniDic 64
nagisa の利用方法 • インストール方法 • 実装方法 65 $ pip install
nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞 /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']
nagisa の利用方法 • インストール方法 • 実装方法 66 $ pip install
nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞 /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞']
nagisa の利用方法 • インストール方法 • 実装方法 67 $ pip install
nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞 /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞'] ライブラリのインポート
nagisa の利用方法 • インストール方法 • 実装方法 68 $ pip install
nagisa >>> import nagisa >>> text = 'Python で前処理を実行する' >>> tokens = nagisa.tagging(text) >>> print(tokens) Python/名詞 /空白 で/助詞 前/名詞 処理/名詞 を/助詞 実行/名詞 する/動詞 >>> print(tokens.words) ['Python', '\u3000', 'で', '前', '処理', 'を', '実行', 'する'] >>> print(tokens.postags) ['名詞', '空白', '助詞', '名詞', '名詞', '助詞', '名詞', '動詞'] 解析の実行
nagisa の参考資料 • GitHub リンク ◦ https://github.com/taishi-i/nagisa • 参考サイト ◦
nagisa: RNNによる日本語単語分割・品詞タグ付けツール ◦ Python による日本語自然言語処理 〜系列ラベリングによる実世界テキスト 分析〜 ◦ 形態素解析ツールのnagisa(なぎさ)を知っていますか? ◦ Pythonで動く形態素解析ツール「nagisa」を使ってみた 69
SentencePiece • 特徴と利点 ◦ ニューラル言語処理向けトークナイザ ◦ 言語依存処理がなく、データから教師なしで分割(サブワード)を学習 ◦ テキストの圧縮率をベースに最適化を行い、語彙サイズを圧縮 •
ライブラリの実装手段と実行速度 ◦ SentencePiece 本体:C++ ◦ Python ライブラリ:Swig による呼び出し ◦ 49566文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 生文から直接言語モデルベースの分割を学習 • 分割基準 ◦ サブワード(語彙数や学習データに依存) 70
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]
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]
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] ライブラリのインポート
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] インスタンスを定義
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] モデルのロード
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] 解析の実行
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
KyTea • 特徴と利点 ◦ 点予測による単語分割と品詞推定を採用し未知語に対して頑健 ◦ 部分的アノテーションによるモデル学習が可能であり分野適応が容易 ◦ 読み推定が可能 •
ライブラリの実装手段と実行速度 ◦ KyTea本体:C++, LIBLINEAR を利用 ◦ Pythonライブラリ:Swig による呼び出し ◦ 15868文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ 線形SVM(LIBLINEAR)による単語分割と品詞推定 • 分割基準 ◦ UniDic 78
KyTea の利用方法 • インストール方法 • 実装方法 79 $ pip install
kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する KyTea 本体の インストールが必要
KyTea の利用方法 • インストール方法 • 実装方法 80 $ pip install
kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する KyTea 本体の インストールが必要
KyTea の利用方法 • インストール方法 • 実装方法 81 $ pip install
kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する ライブラリのインポート
KyTea の利用方法 • インストール方法 • 実装方法 82 $ pip install
kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する インスタンスの定義
KyTea の利用方法 • インストール方法 • 実装方法 83 $ pip install
kytea >>> import Mykytea >>> mk = Mykytea.Mykytea('') >>> text = 'Python で前処理を実行する' >>> tokens = mk.getTagsToString(text) >>> print(tokens) Python/名詞/PYTHON /補助記号/UNK で/助動詞/で 前/名詞/まえ 処理/名詞/しょり を/助詞/を 実行/名詞/じっこう する/動詞/する 解析の実行
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
Juman++ v2 • 特徴と利点 ◦ RNN 言語モデルを利用した高性能な形態素解析システム ◦ 単語の並びの意味的な自然さを考慮した解析を行う ◦
JUMAN、MeCab に比べ大きく性能が向上 • ライブラリの実装手段と実行速度 ◦ Juman++ V2 本体:C++ ◦ Pythonライブラリ:Subprocessによる実行、文字列処理 ◦ 738文/秒(5900文、1文あたり平均39文字) • 解析手法 ◦ ラティス構築後、線形モデルとRNNモデルによるコスト推定 • 分割基準 ◦ JUMAN辞書基準 85
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 本体の インストールが必要
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 本体の インストールが必要
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 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん ライブラリのインポート
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 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん インスタンスの定義
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 前 ぜん 前 接頭辞 名詞接頭辞 * * 代表表記:前/ぜん 内容語 前/ぜん 解析の実行
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
ライブラリの機能比較 ライブラリ名 単語分割基準(単語長) 品詞体系 付与言語情報 実行速度 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文/秒 • 赤文字はライブラリ選択のメリット、青文字はライブラリ選択のデメリット
(参考)単語分割基準と品詞体系 • IPADIC ◦ ipadic version 2.7.0 ユーザーズマニュアル ◦ ChaSen
品詞体系 (IPA品詞体系) • JUMAN ◦ 形態素・構文タグ付きコーパス作成の作業基準 version 1.8 ◦ Juman 品詞体系 • UniDic ◦ UniDic品詞体系 • SudachiDict ◦ https://github.com/WorksApplications/SudachiDict 93
形態素解析器比較ライブラリ toiro の紹介 • 日本語処理の便利機能を搭載した Python ライブラリ ◦ 日本語コーパスのダウンローダーと前処理機能を搭載 ◦
数行のコードで処理速度の比較、単語分割の比較、後段タスクでの精度比較 が可能 ◦ Dockerでは、環境構築なしに9種類の解析器の比較が可能 ◦ https://github.com/taishi-i/toiro 94
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)
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)
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) ライブラリのインポート
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) コーパスのダウンロード
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) 解析器の比較を実行
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]
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}}
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: ▁|都|庁|所在地|は|新宿|区|。
映画のユーザーレビューを利用した テキスト分類モデルの実装
テキスト分類タスクの概要 • テキスト分類は、テキストを入力としてラベルを出力するタスク 104 入力文: Pythonで簡単に使えるツールです 単語分割+品詞フィルタリング 目的タスク 文書分類 機械翻訳
質問応答 など 出力ラベル: IT/コンピュータ Python 簡単 使える ツール 目的タスクの入力
テキスト分類モデルの学習方法 105 • 準備した学習データからテキスト文書モデルを作成する コーパス ① 前処理 学習データ 開発データ 評価データ
② 学習 学習済み モデル ③ 評価 実験結果 ④ 解析ミスの対策 モデル学習の処理 1. scikit-learn 2. Transformers 3. spaCy 4. AllenNLP 5. FLAIR 1. mecab-python3 2. Janome 3. SudachiPy 4. nagisa 5. GiNZA 6. Juman++ v2 7. KyTea 8. SentencePiece
106 • まずは、入力テキストを形態素解析器等で単語分割する ◦ テキストをコンピュータで処理しやすい単位(単語列)に変換 scikit-learn spaCy Transformers AllenNLP FLAIR
Python ライブラリ BOW TF-IDF CNN BiLSTM BERT 特徴量の表現手法 モデル学習の内部処理 入力テキスト ① 前処理 特徴量 ② 学習 学習済みモデル とても良い作品でした。 ['とても', '良い', '作品', 'でし', 'た', '。'] [ 2.6584e-01, 1.5733e-02, -5.5184e-01] ラベル:ポジティブ model.pkl
107 • 次に、単語列を特徴量(数値表現)に変換する ◦ 例えば、scikit-learn を利用して、単語列を TF-IDF ベクトルに変換 scikit-learn spaCy
Transformers AllenNLP FLAIR Python ライブラリ BOW TF-IDF CNN BiLSTM BERT 特徴量の表現手法 モデル学習の内部処理 入力テキスト ① 前処理 特徴量 ② 学習 学習済みモデル とても良い作品でした。 ['とても', '良い', '作品', 'でし', 'た', '。'] [ 2.6584e-01, 1.5733e-02, -5.5184e-01] ラベル:ポジティブ model.pkl 出現頻度による特徴
108 • 次に、単語列を特徴量(数値表現)に変換する ◦ 例えば、Transformers を利用して、単語列を BERT ベクトルに変換 scikit-learn spaCy
Transformers AllenNLP FLAIR Python ライブラリ BOW TF-IDF CNN BiLSTM BERT 特徴量の表現手法 モデル学習の内部処理 入力テキスト ① 前処理 特徴量 ② 学習 学習済みモデル とても良い作品でした。 ['とても', '良い', '作品', 'でし', 'た', '。'] [ 3.7371e-01, -5.9107e-02, -2.2306e-01] ラベル:ポジティブ model.pkl 言語モデルによる特徴
109 • 特徴量とラベルを利用して、テキスト分類モデルを学習する ◦ 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 このパターンを学習する 言語モデルによる特徴
検証用データセット: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 これまで観た映画の中で最も恐ろしい映画だ。ホラー映画(嫌いだから ほとんど観たことはない)とは...
scikit-learn • 特徴と利点 ◦ Python によるオープンソース機械学習ライブラリ ◦ サポートベクターマシン(SVM)など、様々なアルゴリズムが利用可能 ◦ scikit-learn
のみで機械学習に取り組むことも十分可能 • インストール方法 • GitHub リンク ◦ https://github.com/scikit-learn/scikit-learn • 参考サイト ◦ https://scikit-learn.org/stable/ 111 $ pip install scikit-learn
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)
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) ライブラリのインポート
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) コーパスのロード
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) 単語分割の定義
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 の定義
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 を構築
scikit-learn の利用方法(ベクトル化) • tfidf_extracter.transform を利用し、テキストをベクトル化する 118 >>> text = "とても良い作品でした。"
>>> x = tfidf_extracter.transform([text]) >>> x <1x92143 sparse matrix of type '<class 'numpy.float64'>' with 9 stored elements in Compressed Sparse Row format> >>> print(x.toarray()) [[0. 0. 0. ... 0. 0. 0.]] >>> print(x) (0, 82076) 0.514308329463325 (0, 82033) 0.28160641839600237 (0, 55430) 0.38687226972136557 (0, 55412) 0.19207036483503126 (0, 26101) 0.5550955457160239 (0, 26030) 0.28642855817395746 (0, 23958) 0.1805941673948253
scikit-learn の利用方法(ベクトル化) • tfidf_extracter.transform を利用し、テキストをベクトル化する 119 テキストを TF-IDF に変換 >>>
text = "とても良い作品でした。" >>> x = tfidf_extracter.transform([text]) >>> x <1x92143 sparse matrix of type '<class 'numpy.float64'>' with 9 stored elements in Compressed Sparse Row format> >>> print(x.toarray()) [[0. 0. 0. ... 0. 0. 0.]] >>> print(x) (0, 82076) 0.514308329463325 (0, 82033) 0.28160641839600237 (0, 55430) 0.38687226972136557 (0, 55412) 0.19207036483503126 (0, 26101) 0.5550955457160239 (0, 26030) 0.28642855817395746 (0, 23958) 0.1805941673948253
scikit-learn の利用方法(ベクトル化) • tfidf_extracter.transform を利用し、テキストをベクトル化する 120 >>> text = "とても良い作品でした。"
>>> x = tfidf_extracter.transform([text]) >>> x <1x92143 sparse matrix of type '<class 'numpy.float64'>' with 9 stored elements in Compressed Sparse Row format> >>> print(x.toarray()) [[0. 0. 0. ... 0. 0. 0.]] >>> print(x) (0, 82076) 0.514308329463325 (0, 82033) 0.28160641839600237 (0, 55430) 0.38687226972136557 (0, 55412) 0.19207036483503126 (0, 26101) 0.5550955457160239 (0, 26030) 0.28642855817395746 (0, 23958) 0.1805941673948253 ベクトル化の結果
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)
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) ライブラリのインポート
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) コーパスを読み込む
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 に変換
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) 学習の実行
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
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
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
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, :]
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, :] ライブラリのインポート
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, :] トークナイザーと モデルを定義
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 に変換
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, :] ベクトル化の実行
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 ベクトルを取得操作
Transformers の利用方法(ベクトル化) • 日本語 BERT モデルによるテキストのベクトル化 135 >>> print(sentence_vec) tensor([[
2.6584e-01, 1.5733e-02, -5.5184e-01, -2.6881e-01, -3.3179e-01, 3.7371e-01, -5.9107e-02, -2.2306e-01, 4.1955e-01, -5.0272e-01, -5.1751e-01, -1.0767e-01, 1.1714e-02, 4.1104e-01, 3.6833e-01, 8.5412e-01, -1.4727e-03, 3.8684e-01, -2.3235e-01, -5.9252e-01, 7.5186e-01, -6.9910e-01, -8.3287e-01, 3.9897e-01, -4.2667e-02, -3.5826e-01, 4.5544e-02, -4.8805e-01, -1.6543e-02, -4.3460e-02, 2.5553e-01, 7.1770e-02, -5.0605e-01, -6.4106e-01, 2.5535e-01, -2.2166e-01, 9.8572e-02, -1.3150e-01, 4.7107e-01, -1.2239e+00, 4.3229e-01, 2.3325e-01, -7.4171e-01, -2.3981e-01, 2.3239e-01, -4.8776e-01]], grad_fn=<SliceBackward>) ベクトルの出力 (実際は 768 次元)
Transformers の利用方法(ベクトル化) • これまでの操作により BERT モデルの C 部分のベクトルを取得 136 入力:['とても',
'良い', '作品', 'でし', 'た', '。'] ベクトルの出力 (実際は 768 次元)
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
テキスト分類モデルの精度比較 • 9種類の日本語処理ライブラリを利用した SVM と BERT モデルを比較 ◦ 学習データは 10,000件(1件あたりの平均文字数:322文字)
最高精度は BERT 正解数は 1150件 (GPU を利用して約16分) 最速は SentencePiece 正解数は 1136件 (CPU を利用して約4秒) Python 実装による ライブラリの速度は 約3分〜5分 138
おわりに • 目的タスクに適した日本語処理ライブラリを選択しよう ◦ 処理時間の短縮や目的タスクの精度向上に貢献する可能性あり 判断基準 ライブラリ 言語情報が必要 GiNZA(固有表現情報、依存構造解析) Juman++
v2(意味情報) KyTea(読み情報) 実行速度が必要 mecab-python3 SentencePiece 複数単位の分割が必要 SudachiPy 新語に対応したい SudachiPy サブワードを利用したい SentencePiece ユーザー辞書を簡単に登録したい nagisa Windows で言語処理を試したい Janome 言語処理または Python 初心者である Janome
本発表で参考にした資料一覧 • 形態素解析の理論と実装 • 言語処理学会第24回年次大会ワークショップ 形態素解析の今とこれから • 汎用形態素解析システムMeCab • Janome
ではじめるテキストマイニング • Elasticsearchのための新しい形態素解析器 「Sudachi」 • GiNZA: 日本語自然言語処理オープンソースライブラリー • Python による日本語自然言語処理 〜系列ラベリングによる実世界テキス ト分析〜 • Sentencepiece : ニューラル言語処理向けトークナイザ • 日本語の単語分割 品詞推定 日本語の単語分割・品詞推定あるいは KyTea の話 • 日本語形態素解析システム JUMAN++