Slide 1

Slide 1 text

Python ライブラリ開発における失敗談 〜開発者に選ばれるライブラリを作るために必要なこと〜 PyCon JP 2022 池田 大志

Slide 2

Slide 2 text

自己紹介 ● 名前 ○ 池田 大志(Taishi Ikeda) ● 略歴 ○ 2015/04 - 2017/03: 奈良先端大 自然言語処理学研究室 ○ 2017/04 - 2022/05: 株式会社 NTTドコモ ● 個人開発者としての取り組み ○ 単語分割/品詞タグ付けライブラリ nagisa の開発 ○ 形態素解析器比較ライブラリ toiro の開発 ○ PyCon JP 2018, 2019, 2020 の発表 2

Slide 3

Slide 3 text

本発表について ● 概要 1. これまで取り組んだライブラリ開発における工夫点を説明 2. ライブラリ開発において改善すべきだったことを説明 3. 開発者に選ばれるライブラリの傾向を分析した結果を共有 ● 想定する聞き手 ○ 現在、Python ライブラリ開発に取り組んでいる人 ○ これから、Python ライブラリ開発に挑戦したい人 ○ 多くの開発者に利用されているライブラリについて知りたい人 3

Slide 4

Slide 4 text

本発表の目的 ● ライブラリ開発における失敗談を共有することで、 今後のライブラリ開発の参考となる情報を提供することが目的 4

Slide 5

Slide 5 text

本発表の目的 ● ライブラリ開発における失敗談を共有することで、 今後のライブラリ開発の参考となる情報を提供することが目的 5

Slide 6

Slide 6 text

本発表の目的 ● ライブラリ開発における失敗談を共有することで、 今後のライブラリ開発の参考となる情報を提供することが目的 6

Slide 7

Slide 7 text

本発表の目的 ● ライブラリ開発における失敗談を共有することで、 今後のライブラリ開発の参考となる情報を提供することが目的 7

Slide 8

Slide 8 text

本発表の目的 ● ライブラリ開発における失敗談を共有することで、 今後のライブラリ開発の参考となる情報を提供することが目的 8

Slide 9

Slide 9 text

目次(1/3) ● 言語処理ライブラリ nagisa の紹介 ○ nagisa とは? ○ nagisa の利点 ○ 類似ライブラリと比較したユーザー数の違い ● 開発者にライブラリを利用してもらうために工夫したこと ○ PyCon JP 2018 ポスター発表への参加 ○ ユーザーの声を参考に機能を追加 ○ PyCon JP 2019 のトーク発表に参加 ○ ライブラリの実利用性を向上するための工夫 ○ 工夫による効果のまとめ 9

Slide 10

Slide 10 text

目次(2/3) ● ライブラリ開発において改善すべきだったこと ○ 解析速度の改善 ○ 実利用を最優先にすべきだった ○ 大規模言語モデルへの対応遅れ ○ nagisa_bert の紹介 ○ 開発者ファーストの徹底不足 10

Slide 11

Slide 11 text

目次(3/3) ● 開発者に選ばれるライブラリの分析 ○ 他の言語処理ライブラリと nagisa の比較 ○ awesome-japanese-nlp-resources の紹介 ○ 比較対象の言語処理ライブラリ ○ 最も利用されている言語処理ライブラリ ○ 1ヶ月単位で最も利用されたライブラリ ○ その他のライブラリの利用状況 ○ 開発者に利用される言語処理ライブラリの傾向 ○ nagisa に必要だったこと ○ これからライブラリを作るのであれば ● まとめ ○ 開発者に選ばれるライブラリとは 11

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

nagisa とは? ● 特徴 ○ pip install naigsa のみで利用可能な言語処理ライブラリ ○ BLSTMs による単語分割と品詞タグ付けの機能を提供 ○ Unicode 正規化と後処理機能(品詞フィルター)を標準搭載 ● 開発方針 ○ シンプルで使いやすいツールを目指し、開発を行っている ● 想定ユーザー ○ これから自然言語処理を始めようと考えている Python ユーザー 13 https://github.com/taishi-i/nagisa

Slide 14

Slide 14 text

nagisa の利点 ● 二行のコードで単語分割と品詞タグ付け機能が利用可能 ● ユーザー辞書の追加が容易 ● Transformersでnagisa_bertモデルが利用可能 🤗 14 >>> import nagisa >>> tokens = nagisa.tagging('Pythonで使えます!') >>> print(tokens) Python/名詞 で/助詞 使え/動詞 ます/助動詞 !/補助記号 >>> new_tagger = nagisa.Tagger( single_word_list=['3月のライオン'] )

Slide 15

Slide 15 text

nagisa の利点 ● 二行のコードで単語分割と品詞タグ付け機能が利用可能 ● ユーザー辞書の追加が容易 ● Transformersでnagisa_bertモデルが利用可能 🤗 15 >>> import nagisa >>> tokens = nagisa.tagging('Pythonで使えます!') >>> print(tokens) Python/名詞 で/助詞 使え/動詞 ます/助動詞 !/補助記号 >>> new_tagger = nagisa.Tagger( single_word_list=['3月のライオン'] )

Slide 16

Slide 16 text

nagisa の利点 ● 二行のコードで単語分割と品詞タグ付け機能が利用可能 ● ユーザー辞書の追加が容易 ● Transformersでnagisa_bertモデルが利用可能 🤗 16 >>> import nagisa >>> tokens = nagisa.tagging('Pythonで使えます!') >>> print(tokens) Python/名詞 で/助詞 使え/動詞 ます/助動詞 !/補助記号 >>> new_tagger = nagisa.Tagger( single_word_list=['3月のライオン'] )

Slide 17

Slide 17 text

nagisa の利点 ● 二行のコードで単語分割と品詞タグ付け機能が利用可能 ● ユーザー辞書の追加が容易 ● Transformersでnagisa_bertモデルが利用可能 🤗 17 >>> import nagisa >>> tokens = nagisa.tagging('Pythonで使えます!') >>> print(tokens) Python/名詞 で/助詞 使え/動詞 ます/助動詞 !/補助記号 >>> new_tagger = nagisa.Tagger( single_word_list=['3月のライオン'] )

Slide 18

Slide 18 text

18 類似ライブラリと比較したユーザー数の違い ● naigsa はひと桁、ユーザー数が少ない(2022/10/2 時点) ○ PePy の PyPI package のダウンロード数 (Download) ○ GitHub の Used by リポジトリ数 (GitHub Used by) ○ リポジトリ作成からの経過日 (Number of days) Libray name Download (month) Download (total) GitHub Used by Number of days sudachi.rs 545k 6M 354 1040 mecab-python3 285k 7M 2.1k 3037 Janome 175k 3M 1.6k 2770 fugashi 79k 1M 427 1064 nagisa 28k 0.3M 95 1678

Slide 19

Slide 19 text

19 類似ライブラリと比較したユーザー数の違い ● naigsa はひと桁、ユーザー数が少ない(2022/10/2 時点) ○ PePy の PyPI package のダウンロード数 (Download) ○ GitHub の Used by リポジトリ数 (GitHub Used by) ○ リポジトリ作成からの経過日 (Number of days) Libray name Download (month) Download (total) GitHub Used by Number of days sudachi.rs 545k 6M 354 1040 mecab-python3 285k 7M 2.1k 3037 Janome 175k 3M 1.6k 2770 fugashi 79k 1M 427 1064 nagisa 28k 0.3M 95 1678 ユーザー数の差が生じた原因を考え、 本発表ではその内容を失敗談として共有

Slide 20

Slide 20 text

開発者にライブラリを 利用してもらうために工夫したこと

Slide 21

Slide 21 text

21 PyCon JP 2018 ポスター発表への参加 ● Python 利用者をターゲットに言語処理のライブラリを紹介 ● 普段、言語処理を行わない開発者と対面で議論 ● PyCon JP をきっかけに徐々にユーザーが増え始める

Slide 22

Slide 22 text

ユーザーの声を参考に機能を追加 ● PyCon JP のポスター発表をきっかけに想定ユーザーを絞る ○ 当時(2017~2018年)、形態素解析といえば MeCab の時代 ■ Python で利用するためには、MeCab 本体のインストールも必要だった ■ pip install だけで利用できるライブラリの重要性 を感じた ○ シンプルで簡単に利用できるライブラリを目指し、開発を行う ● 既存ライブラリの足りない部分を考え、新しい機能を追加 ○ ユーザー辞書の登録が難しいとの声(単語のパラメータ設定など) ○ 辞書の追加が容易できる機能を追加 ● 開発者ができる限り前処理を行わないにする ○ 単語列の出力結果をリストで取得できるよう実装 ○ 品詞フィルター機能を標準で搭載 ○ Unicode 正規化を標準で搭載 22

Slide 23

Slide 23 text

23 PyCon JP 2019 のトーク発表に参加 ● 固有表現抽出モデルを実装する方法について発表 ● 言語処理に取り組むきっかけとなるチュートリアルを作成 ○ 系列ラベリングの学習機能を nagisa に追加 ○ まずは、nagisa をインストールしてもらうきっかけを作る

Slide 24

Slide 24 text

ライブラリの実利用性を向上するための工夫 ● ライブラリインポート時に、クラスを初期化するように設計 ○ ユーザーが書くコードを一行でも減らすため ● できる限りモデルサイズを最小限にする ○ ライブラリインポート時の速度を少しでも高速化するため ○ もちろん、精度とのトレードオフを考えながら ● モデルを含め、オリジナルの解析器であることを強調 ○ MeCab の派生系ではない ○ 学習機能もあるため、研究用ベースラインとして利用できる 24

Slide 25

Slide 25 text

工夫による効果のまとめ ● PyCon JP への参加による効果 ○ 普段、言語処理を行わない開発者にライブラリを周知 ○ フィードバックを参考に新しい機能を追加 ○ ライブラリの認知度が上がり、GitHub などの検索の上位になる ● 開発モチベーションの向上 ○ ひとりでもユーザーがいると、開発のモチベーションとなる ○ コードも慎重に書くようになる 25

Slide 26

Slide 26 text

ライブラリ開発において 改善すべきだったこと

Slide 27

Slide 27 text

27 解析速度の改善 ● 実利用を想定した場合、現状の解析速度では不十分だった ○ 大規模テキストを分析する場合、待ち時間はストレスとなる ○ 大規模言語モデルを利用する、時代のニーズに合っていなかった ● 検討した改善策 ○ C++ でライブラリを実装し、解析速度を検証 ■ しかし、大幅な改善もなく、MeCab, SudachiPy には到底敵わず ■ 文字数分の処理を行う BLSTMs では、根本的に計算時間がかかる

Slide 28

Slide 28 text

実利用を最優先にすべきだった ● 大学時代の研究の延長上でライブラリ開発 ○ 当時の最先端モデル(BLSTMs)を使うことが目的となっていた ■ 形態素解析器として実利用に耐える条件(解析速度、品詞タグの種類、 読み情報)を満たしつつ、オリジナリティを追加すべきだった ● 新規性と実用性のトレードオフの問題 ○ 新規性を取り入れつつ(または精度向上を実現しつつ)、 MeCab 並の実用性を実現するのは難しい ○ 実用性が不十分であれば、それ以上のライブラリを利用する メリット(=付加価値)が必要であった ■ nagisa はこの部分が弱かった 28

Slide 29

Slide 29 text

大規模言語モデルへの対応遅れ ● 現在の自然言語処理の分野では、大規模言語モデル (BERT, T5, GPT2 など)を利用することが前提 ○ 大規模言語モデルの選択 = トークナイザーの選択 ○ 最先端の流れに乗り遅れてしまった ● 大規模言語モデルは、形態素解析器のユースケースのひとつに ○ cl-tohoku/bert-base-japanese-whole-word-masking ■ 東北大学が提供する日本語用の BERT モデル ■ 月間で126万ダウンロード ■ 利用されているトークナイザー: fugashi 29

Slide 30

Slide 30 text

30 nagisa_bert の紹介 ● nagisa 対応の BERT モデルを公開 ○ Hugging Face Transformers 🤗 で利用可能 ○ モデルおよびコードは、MIT ライセンスで公開 ○ モデル作成(文書分類など)のチュートリアルを提供 ■ bert-base-japanese-whole-word-masking 利用したモデルも作成可能 >>> from transformers import pipeline >>> from nagisa_bert import NagisaBertTokenizer >>> text = "nagisaで[MASK]できるモデルです" >>> tokenizer = NagisaBertTokenizer.from_pretrained("taishi-i/nagisa_bert") >>> fill_mask = pipeline("fill-mask", model="taishi-i/nagisa_bert", tokenizer=tokenizer) >>> print(fill_mask(text)) https://github.com/taishi-i/nagisa_bert

Slide 31

Slide 31 text

31 nagisa_bert の紹介 ● nagisa 対応の BERT モデルを公開 ○ Hugging Face Transformers 🤗 で利用可能 ○ モデルおよびコードは、MIT ライセンスで公開 ○ モデル作成(文書分類など)のチュートリアルを提供 ■ bert-base-japanese-whole-word-masking 利用したモデルも作成可能 >>> from transformers import pipeline >>> from nagisa_bert import NagisaBertTokenizer >>> text = "nagisaで[MASK]できるモデルです" >>> tokenizer = NagisaBertTokenizer.from_pretrained("taishi-i/nagisa_bert") >>> fill_mask = pipeline("fill-mask", model="taishi-i/nagisa_bert", tokenizer=tokenizer) >>> print(fill_mask(text)) https://github.com/taishi-i/nagisa_bert ライブラリのインポート

Slide 32

Slide 32 text

32 nagisa_bert の紹介 ● nagisa 対応の BERT モデルを公開 ○ Hugging Face Transformers 🤗 で利用可能 ○ モデルおよびコードは、MIT ライセンスで公開 ○ モデル作成(文書分類など)のチュートリアルを提供 ■ bert-base-japanese-whole-word-masking 利用したモデルも作成可能 >>> from transformers import pipeline >>> from nagisa_bert import NagisaBertTokenizer >>> text = "nagisaで[MASK]できるモデルです" >>> tokenizer = NagisaBertTokenizer.from_pretrained("taishi-i/nagisa_bert") >>> fill_mask = pipeline("fill-mask", model="taishi-i/nagisa_bert", tokenizer=tokenizer) >>> print(fill_mask(text)) https://github.com/taishi-i/nagisa_bert 入力テキストの定義

Slide 33

Slide 33 text

33 nagisa_bert の紹介 ● nagisa 対応の BERT モデルを公開 ○ Hugging Face Transformers 🤗 で利用可能 ○ モデルおよびコードは、MIT ライセンスで公開 ○ モデル作成(文書分類など)のチュートリアルを提供 ■ bert-base-japanese-whole-word-masking 利用したモデルも作成可能 >>> from transformers import pipeline >>> from nagisa_bert import NagisaBertTokenizer >>> text = "nagisaで[MASK]できるモデルです" >>> tokenizer = NagisaBertTokenizer.from_pretrained("taishi-i/nagisa_bert") >>> fill_mask = pipeline("fill-mask", model="taishi-i/nagisa_bert", tokenizer=tokenizer) >>> print(fill_mask(text)) https://github.com/taishi-i/nagisa_bert トークナイザーの定義

Slide 34

Slide 34 text

34 nagisa_bert の紹介 ● nagisa 対応の BERT モデルを公開 ○ Hugging Face Transformers 🤗 で利用可能 ○ モデルおよびコードは、MIT ライセンスで公開 ○ モデル作成(文書分類など)のチュートリアルを提供 ■ bert-base-japanese-whole-word-masking 利用したモデルも作成可能 >>> from transformers import pipeline >>> from nagisa_bert import NagisaBertTokenizer >>> text = "nagisaで[MASK]できるモデルです" >>> tokenizer = NagisaBertTokenizer.from_pretrained("taishi-i/nagisa_bert") >>> fill_mask = pipeline("fill-mask", model="taishi-i/nagisa_bert", tokenizer=tokenizer) >>> print(fill_mask(text)) https://github.com/taishi-i/nagisa_bert テキスト穴埋め関数の定義

Slide 35

Slide 35 text

35 nagisa_bert の紹介 ● nagisa 対応の BERT モデルを公開 ○ Hugging Face Transformers 🤗 で利用可能 ○ モデルおよびコードは、MIT ライセンスで公開 ○ モデル作成(文書分類など)のチュートリアルを提供 ■ bert-base-japanese-whole-word-masking 利用したモデルも作成可能 >>> from transformers import pipeline >>> from nagisa_bert import NagisaBertTokenizer >>> text = "nagisaで[MASK]できるモデルです" >>> tokenizer = NagisaBertTokenizer.from_pretrained("taishi-i/nagisa_bert") >>> fill_mask = pipeline("fill-mask", model="taishi-i/nagisa_bert", tokenizer=tokenizer) >>> print(fill_mask(text)) https://github.com/taishi-i/nagisa_bert 関数の実行

Slide 36

Slide 36 text

36 nagisa_bert の紹介 ● テキスト穴埋め問題の出力結果 ○ “nagisaで[MASK]できるモデルです” の[MASK]に入る単語を予測 ■ 使用、利用 … が予測の上位に ● pip install naigsa_bert でインストール可能 ○ BERTモデルを使用するためには、 利用環境に適した PyTorch をインストールが別途必要 [{'score': 0.1385931372642517, 'sequence': 'nagisa で 使用 できる モデル です', 'token': 8092, 'token_str': '使 用'}, {'score': 0.11947669088840485, 'sequence': 'nagisa で 利用 できる モデル です', 'token': 8252, 'token_str': '利 用'}, https://github.com/taishi-i/nagisa_bert

Slide 37

Slide 37 text

37 nagisa_bert at Hugging Face Space ● テキスト穴埋め問題を体験しよう ○ nagisa_bert をインストールなしに試すことができます https://huggingface.co/spaces/taishi-i/nagisa_bert-fill_mask

Slide 38

Slide 38 text

開発者ファーストの徹底不足 ● Wheel の管理不足により、ライブラリを利用できない、 バージョンや OS が存在する時期があった ○ あらゆる開発者が問題なくライブラリを利用できるように、 Linux, macOS, Windows の Wheel を全て提供すべきだった ■ 原因:依存ライブラリ dynet の開発停止、手動 Wheel アップロード ● 取り組んだ解決策 ○ dynet をフォークし、フォーク版 Wheel を自ら提供 ○ GitHub Actionsとcibuildwheelを利用し、Wheelの作成を半自動化 38

Slide 39

Slide 39 text

開発者に選ばれる ライブラリの分析

Slide 40

Slide 40 text

40 他の言語処理ライブラリと nagisa の比較 ● ライブラリを比較することで、開発者に選ばれる特徴を分析 ○ 日本語言語処理に特化した Python ライブラリを収集 ○ nagisa よりもユーザー数の多いライブラリの特徴や傾向を分析 nagisa (325,904)

Slide 41

Slide 41 text

41 awesome-japanese-nlp-resources の紹介 ● 日本語言語処理に特化したプロジェクトを GitHub より収集 ○ 全 308 リポジトリを掲載(コーパス、事前学習モデルを含めて) ○ 自動でリポジトリ情報を収集し、手動でカテゴリー別に掲載 https://github.com/taishi-i/awesome-japanese-nlp-resources

Slide 42

Slide 42 text

42 比較対象の言語処理ライブラリ ● 2022年10月2日 時点の情報を収集 ○ 日本語言語処理に特化した Python ライブラリを収集(81件) ■ PePy の PyPI package のダウンロード数(= pip install の回数) ■ GitHub のスター数 ● 形態素解析器、係り受け解析器、文字列正規化、文分割器など ○ jaconv, mecab-python3, SudachiPy, tinysegmenter, pykakasi, janome, mojimoji, natto-py, konoha, pyknp, fugashi, unidic-lite, unidic-py, ipadic-py, darts-clone-python, neologdn, nagisa, ginza, Mykytea-python, UniDic2UD, mecab, camphr, shiba, oseti, sengiri, chirptext, accel-brain-code, showcase, SuParUniDic, cutlet, pymlask, japanese-numbers-python, nlplot, SudachiTra, pyknp-eventgraph, cabocha, esupar, donut, depccg, aovec, ginza-transformers, bunkai, jamdict, rakutenma-python, ja-timex, kyoto-reader, asa-python, asari, ja_sentence_segmenter, jageocoder, budoux, alphabet2kana, manga-ocr, toiro, python-vaporetto, dango, negima, jawiki-cleaner, AugLy-jp, namedivider-python, allennlp-shiba-model, daaja, kuzukiri, mokuro, PyKatsuyou, hirakanadic, jinf, furigana4epub, pygeonlp, zunda-python, noyaki, desuwa, rhoknp, ishi, jel, hasami, japanese-sentence-breaker, yubin, japanese2phoneme, kwja, mozcpy (81件) https://github.com/taishi-i/awesome-japanese -nlp-resources/wiki/PyCon-JP-2022

Slide 43

Slide 43 text

43 最も利用されている言語処理ライブラリ ● ライブラリの総ダウンロード数(pip install の回数)を比較 ○ 上位10件をグラフにて掲載 ■ 最も利用されているライブラリは jaconv、915万ダウンロード ■ 文字列正規化ライブラリ、形態素解析器が上位を占める

Slide 44

Slide 44 text

44 最も利用されている言語処理ライブラリ ● ライブラリの総ダウンロード数(pip install の回数)を比較 ○ 上位10件をグラフにて掲載 ■ 最も利用されているライブラリは jaconv、915万ダウンロード ■ 文字列正規化ライブラリ、形態素解析器が上位を占める

Slide 45

Slide 45 text

45 最も利用されている言語処理ライブラリ ● ライブラリの総ダウンロード数(pip install の回数)を比較 ○ 上位10件をグラフにて掲載 ■ 最も利用されているライブラリは jaconv、915万ダウンロード ■ 文字列正規化ライブラリ、形態素解析器が上位を占める

Slide 46

Slide 46 text

46 最も利用されている言語処理ライブラリ ● ライブラリの総ダウンロード数(pip install の回数)を比較 ○ 上位10件をグラフにて掲載 ■ 最も利用されているライブラリは jaconv、915万ダウンロード ■ 文字列正規化ライブラリ、形態素解析器が上位を占める

Slide 47

Slide 47 text

47 jaconv ● ひらがな、カタカナ、半角、全角の相互変換を行うライブラリ ○ インストール方法 ○ 使用方法 $ pip install jaconv >>> import jaconv >>> text = "かたかな" >>> kata = jaconv.hira2kata(text) >>> print(kata) カタカナ >>> text = "ヒラガナ" >>> hira = jaconv.kata2hira(text) >>> print(hira) ひらがな https://github.com/ikegami-yukino/jaconv

Slide 48

Slide 48 text

48 jaconv ● ひらがな、カタカナ、半角、全角の相互変換を行うライブラリ ○ インストール方法 ○ 使用方法 $ pip install jaconv >>> import jaconv >>> text = "かたかな" >>> kata = jaconv.hira2kata(text) >>> print(kata) カタカナ >>> text = "ヒラガナ" >>> hira = jaconv.kata2hira(text) >>> print(hira) ひらがな https://github.com/ikegami-yukino/jaconv

Slide 49

Slide 49 text

49 jaconv ● ひらがな、カタカナ、半角、全角の相互変換を行うライブラリ ○ インストール方法 ○ 使用方法 $ pip install jaconv >>> import jaconv >>> text = "かたかな" >>> kata = jaconv.hira2kata(text) >>> print(kata) カタカナ >>> text = "ヒラガナ" >>> hira = jaconv.kata2hira(text) >>> print(hira) ひらがな https://github.com/ikegami-yukino/jaconv

Slide 50

Slide 50 text

jaconv が開発者に選ばれる理由 ● 文字列相互変換は、日本語の言語処理で必要な場面が 多いにも関わらず、標準ライブラリには機能がない ○ 多くの人が前処理として必要とする機能をライブラリ化している ● シンプルで使いやすい ○ Pure-Python による実装のため、インストールエラーも少ない ○ README.md を見るだけで、実装したい処理が書ける 50

Slide 51

Slide 51 text

51 mecab-python3 ● 汎用テキスト処理システム MeCab の Python ラッパー ○ インストール方法 ○ 使用方法 $ pip install mecab-python3 unidic-lite >>> import MeCab >>> text = '形態素解析の例' >>> tagger = MeCab.Tagger() >>> result = tagger.parse(text) >>> print(result) 形態 ケータイ ケイタイ 形態 名詞-普通名詞-一般 0 素 ソ ソ 素 接尾辞-名詞的-一般 解析 カイセキ カイセキ 解析 名詞-普通名詞-サ変可能 0 の ノ ノ の 助詞-格助詞 例 レー レイ 例 名詞-普通名詞-一般 1 EOS https://github.com/SamuraiT/mecab-python3

Slide 52

Slide 52 text

52 mecab-python3 ● 汎用テキスト処理システム MeCab の Python ラッパー ○ インストール方法 ○ 使用方法 $ pip install mecab-python3 unidic-lite >>> import MeCab >>> text = '形態素解析の例' >>> tagger = MeCab.Tagger() >>> result = tagger.parse(text) >>> print(result) 形態 ケータイ ケイタイ 形態 名詞-普通名詞-一般 0 素 ソ ソ 素 接尾辞-名詞的-一般 解析 カイセキ カイセキ 解析 名詞-普通名詞-サ変可能 0 の ノ ノ の 助詞-格助詞 例 レー レイ 例 名詞-普通名詞-一般 1 EOS https://github.com/SamuraiT/mecab-python3

Slide 53

Slide 53 text

53 mecab-python3 ● 汎用テキスト処理システム MeCab の Python ラッパー ○ インストール方法 ○ 使用方法 $ pip install mecab-python3 unidic-lite >>> import MeCab >>> text = '形態素解析の例' >>> tagger = MeCab.Tagger() >>> result = tagger.parse(text) >>> print(result) 形態 ケータイ ケイタイ 形態 名詞-普通名詞-一般 0 素 ソ ソ 素 接尾辞-名詞的-一般 解析 カイセキ カイセキ 解析 名詞-普通名詞-サ変可能 0 の ノ ノ の 助詞-格助詞 例 レー レイ 例 名詞-普通名詞-一般 1 EOS https://github.com/SamuraiT/mecab-python3

Slide 54

Slide 54 text

mecab-python3 が開発者に選ばれる理由 ● 長年、研究や実応用問わず、幅広く使われている ○ MeCabは、現在の日本語言語処理のデファクトスタンダード ○ 参考資料やサンプルコードが豊富 ● 非常に高速な解析が可能 ○ MeCab 本体は C++ により実装されている ● 辞書の種類が豊富 ○ UniDic, IPADic, JumanDic, Neologd 54

Slide 55

Slide 55 text

55 SudachiPy ● ワークス徳島人工知能NLP研究所が開発している 形態素解析器 Sudachi の Python 版 ○ インストール方法 ○ 使用方法 $ pip install sudachipy sudachidict_core >>> import sudachipy >>> text = '形態素解析の例' >>> dict = sudachipy.Dictionary() >>> tokenizer = dict.create() >>> result = tokenizer.tokenize(text) >>> print(result) , , , , ]> https://github.com/WorksApplications/sudachi.rs

Slide 56

Slide 56 text

56 SudachiPy ● ワークス徳島人工知能NLP研究所が開発している 形態素解析器 Sudachi の Python 版 ○ インストール方法 ○ 使用方法 $ pip install sudachipy sudachidict_core >>> import sudachipy >>> text = '形態素解析の例' >>> dict = sudachipy.Dictionary() >>> tokenizer = dict.create() >>> result = tokenizer.tokenize(text) >>> print(result) , , , , ]> https://github.com/WorksApplications/sudachi.rs

Slide 57

Slide 57 text

57 SudachiPy ● ワークス徳島人工知能NLP研究所が開発している 形態素解析器 Sudachi の Python 版 ○ インストール方法 ○ 使用方法 $ pip install sudachipy sudachidict_core >>> import sudachipy >>> text = '形態素解析の例' >>> dict = sudachipy.Dictionary() >>> tokenizer = dict.create() >>> result = tokenizer.tokenize(text) >>> print(result) , , , , ]> https://github.com/WorksApplications/sudachi.rs

Slide 58

Slide 58 text

SudachiPy が開発者に選ばれる理由 ● 複数の分割単位の併用、企業による辞書更新 ○ 必要に応じて単語の分割基準を切り替えることができる ● Rust による高速化 ○ Python 実装(バージョン 0.5.*)の解析速度問題を Rust で解決 ● chiTra(Sudachi Transformers)の存在 ○ Transformers を利用できる環境を提供していることは強い ● spaCy に搭載されている安心感 ○ 巨大なエコシステムに一部であることは強い 58

Slide 59

Slide 59 text

59 pykakashi ● ひらがな、カタカナ、漢字をローマ字に変換するライブラリ ○ インストール方法 ○ 使用方法 $ pip install pykakasi >>> import pykakasi >>> text = "形態素解析の例" >>> kks = pykakasi.kakasi() >>> result = kks.convert(text) >>> for token in result: >>> print(f"{token['orig']}: {token['hepburn']}") 形態素解析: keitaisokaiseki の: no 例: rei https://codeberg.org/miurahr/pykakasi

Slide 60

Slide 60 text

60 pykakashi ● ひらがな、カタカナ、漢字をローマ字に変換するライブラリ ○ インストール方法 ○ 使用方法 $ pip install pykakasi >>> import pykakasi >>> text = "形態素解析の例" >>> kks = pykakasi.kakasi() >>> result = kks.convert(text) >>> for token in result: >>> print(f"{token['orig']}: {token['hepburn']}") 形態素解析: keitaisokaiseki の: no 例: rei https://codeberg.org/miurahr/pykakasi

Slide 61

Slide 61 text

61 pykakashi ● ひらがな、カタカナ、漢字をローマ字に変換するライブラリ ○ インストール方法 ○ 使用方法 $ pip install pykakasi >>> import pykakasi >>> text = "形態素解析の例" >>> kks = pykakasi.kakasi() >>> result = kks.convert(text) >>> for token in result: >>> print(f"{token['orig']}: {token['hepburn']}") 形態素解析: keitaisokaiseki の: no 例: rei https://codeberg.org/miurahr/pykakasi

Slide 62

Slide 62 text

pykakashi が開発者に選ばれる理由 ● 日本語テキストをローマ字に変換する Python ライブラリは、 pykakashi の一強状態 ○ 日本語 ⇒ ローマ字の変換は、地味だが非常に重宝される機能 ● シンプルで使いやすい ○ README.md を見るだけで、実装したい処理が書ける 62

Slide 63

Slide 63 text

63 1ヶ月単位で最も利用されたライブラリ ● ライブラリの月間ダウンロード数を比較(9月1日〜10月1日) ○ 上位10件をグラフにて掲載 ■ 最も利用されているライブラリは SudachiPy、54万ダウンロード ■ 順位に変動はあるが、総ダウンロード数と上位はほぼ変わらず

Slide 64

Slide 64 text

64 1ヶ月単位で最も利用されたライブラリ ● ライブラリの月間ダウンロード数を比較(9月1日〜10月1日) ○ 上位10件をグラフにて掲載 ■ 最も利用されているライブラリは SudachiPy、54万ダウンロード ■ 順位に変動はあるが、総ダウンロード数と上位はほぼ変わらず

Slide 65

Slide 65 text

65 その他のライブラリの利用状況 ● 文字列正規化、形態素解析器以外のライブラリを調査 ○ 係り受け解析器(GiNZA, UniDic2UD, camphr)の利用が多く、 その後に、極性判定器(oseti)、文分割器(sengiri)が続く

Slide 66

Slide 66 text

66 その他のライブラリの利用状況 ● 文字列正規化、形態素解析器以外のライブラリを調査 ○ 係り受け解析器(GiNZA, UniDic2UD, camphr)の利用が多く、 その後に、極性判定器(oseti)、文分割器(sengiri)が続く

Slide 67

Slide 67 text

67 その他のライブラリの利用状況 ● 文字列正規化、形態素解析器以外のライブラリを調査 ○ 係り受け解析器(GiNZA, UniDic2UD, camphr)の利用が多く、 その後に、極性判定器(oseti)、文分割器(sengiri)が続く

Slide 68

Slide 68 text

開発者に選ばれる言語処理ライブラリの傾向 ● テキストの前処理に必要となる機能を持つライブラリ ○ 形態素解析、文字列正規化、文字列変換 ● README.md を見るだけで、簡単にインストールできて、 すぐに利用できるライブラリ ● 処理に待ち時間がなく、ストレスなく利用できるライブラリ ● 多くの人が面倒だと感じる処理を解決するライブラリ ○ 複数の形態素解析器を簡単に切り替える ⇒ konoha ○ MeCab のインストールエラーを解決 ⇒ Janome 68

Slide 69

Slide 69 text

69 nagisa に必要だったこと ● 解析速度の改善 ○ 処理に待ち時間が発生し、ユーザーにストレスを与えていた ■ 多くの人に選ばれるライブラリは、ストレスを感じにくい ● 開発者ファーストの徹底不足(インストール環境の改善) ○ Python3.9以上を利用するWindowsユーザーも対応すべきだった ■ 多くの人に選ばれるライブラリは、インストールエラーがない ● 類似ライブラリが提供する機能は標準搭載すべきだった ○ 品詞タグの種類、読み情報がないと形態素解析器としては不十分 ■ 多くの人に選ばれるライブラリは、足りない機能がない

Slide 70

Slide 70 text

70 これからライブラリを作るのであれば ● 形態素解析器の自作は、かなりハードルが高い現状 ○ 企業の参入(ワークス徳島人工知能NLP研究所、LegalForce) ○ 学習用データセットが必要(BCCWJなど) ● 個人開発者であれば、まずは便利ツール系(面倒だと感じる 処理を解決するライブラリ)の開発がおすすめ ○ 例えば、import するだけで matplotlib を日本語表示対応する japanize-matplotlib が良い例(100万ダウンロード) ● Hugging Face 学習済みモデルの作成にはチャンスがある🤗 ○ BERT による極性判定モデル daigo/bert-base-japanese-sentiment が良い例(84.6万ダウンロード/月)

Slide 71

Slide 71 text

まとめ

Slide 72

Slide 72 text

開発者に選ばれるライブラリを作るために必要なこと ● 改めて考えると、必要なことは基本的なことばかりだった ○ 開発者が面倒だと感じることを解決する機能 ■ 誰かの役に立ち、多くの人が困っていることを解決しよう ○ 実利用に耐える条件(処理速度など)を十分に満たすこと ■ ユーザーにストレスを与えないようにしよう ■ 必要な機能を実装した後に、オリジナリティを追加しよう ○ 開発者ファーストの徹底、ユーザーを大切にしよう ■ インストールエラーをなくし、誰もがライブラリを利用できるように、 README.md を丁寧に準備しよう 72

Slide 73

Slide 73 text

73 参考リンク集 ● PePy ○ https://pepy.tech/ ● cibuildwheel ○ https://github.com/pypa/cibuildwheel ● jaconv ○ https://github.com/ikegami-yukino/jaconv ● mecab-python3 ○ https://github.com/SamuraiT/mecab-python3 ● SudachiPy ○ https://github.com/WorksApplications/sudachi.rs ● pykakashi ○ https://codeberg.org/miurahr/pykakasi ● japanize-matplotlib ○ https://github.com/uehara1414/japanize-matplotlib ● cl-tohoku/bert-base-japanese-whole-word-masking ○ https://huggingface.co/cl-tohoku/bert-base-japanese-whole-word-masking ● daigo/bert-base-japanese-sentiment ○ https://huggingface.co/daigo/bert-base-japanese-sentiment