Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python ライブラリ開発における失敗談 〜開発者に選ばれるライブラリを作るために必要なこと〜 / pycon-jp-2022

taishi-i
October 14, 2022

Python ライブラリ開発における失敗談 〜開発者に選ばれるライブラリを作るために必要なこと〜 / pycon-jp-2022

PyCon JP 2022 での発表スライドです。
GitHub: https://github.com/taishi-i/awesome-japanese-nlp-resources

taishi-i

October 14, 2022
Tweet

More Decks by taishi-i

Other Decks in Programming

Transcript

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

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

    2015/04 - 2017/03: 奈良先端大 自然言語処理学研究室 ◦ 2017/04 - 2022/05: 株式会社 NTTドコモ • 個人開発者としての取り組み ◦ 単語分割/品詞タグ付けライブラリ nagisa の開発 ◦ 形態素解析器比較ライブラリ toiro の開発 ◦ PyCon JP 2018, 2019, 2020 の発表 2
  3. 本発表について • 概要 1. これまで取り組んだライブラリ開発における工夫点を説明 2. ライブラリ開発において改善すべきだったことを説明 3. 開発者に選ばれるライブラリの傾向を分析した結果を共有 •

    想定する聞き手 ◦ 現在、Python ライブラリ開発に取り組んでいる人 ◦ これから、Python ライブラリ開発に挑戦したい人 ◦ 多くの開発者に利用されているライブラリについて知りたい人 3
  4. 本発表の目的 • ライブラリ開発における失敗談を共有することで、 今後のライブラリ開発の参考となる情報を提供することが目的 4

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

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

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

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

  9. 目次(1/3) • 言語処理ライブラリ nagisa の紹介 ◦ nagisa とは? ◦ nagisa

    の利点 ◦ 類似ライブラリと比較したユーザー数の違い • 開発者にライブラリを利用してもらうために工夫したこと ◦ PyCon JP 2018 ポスター発表への参加 ◦ ユーザーの声を参考に機能を追加 ◦ PyCon JP 2019 のトーク発表に参加 ◦ ライブラリの実利用性を向上するための工夫 ◦ 工夫による効果のまとめ 9
  10. 目次(2/3) • ライブラリ開発において改善すべきだったこと ◦ 解析速度の改善 ◦ 実利用を最優先にすべきだった ◦ 大規模言語モデルへの対応遅れ ◦

    nagisa_bert の紹介 ◦ 開発者ファーストの徹底不足 10
  11. 目次(3/3) • 開発者に選ばれるライブラリの分析 ◦ 他の言語処理ライブラリと nagisa の比較 ◦ awesome-japanese-nlp-resources の紹介

    ◦ 比較対象の言語処理ライブラリ ◦ 最も利用されている言語処理ライブラリ ◦ 1ヶ月単位で最も利用されたライブラリ ◦ その他のライブラリの利用状況 ◦ 開発者に利用される言語処理ライブラリの傾向 ◦ nagisa に必要だったこと ◦ これからライブラリを作るのであれば • まとめ ◦ 開発者に選ばれるライブラリとは 11
  12. None
  13. nagisa とは? • 特徴 ◦ pip install naigsa のみで利用可能な言語処理ライブラリ ◦

    BLSTMs による単語分割と品詞タグ付けの機能を提供 ◦ Unicode 正規化と後処理機能(品詞フィルター)を標準搭載 • 開発方針 ◦ シンプルで使いやすいツールを目指し、開発を行っている • 想定ユーザー ◦ これから自然言語処理を始めようと考えている Python ユーザー 13 https://github.com/taishi-i/nagisa
  14. nagisa の利点 • 二行のコードで単語分割と品詞タグ付け機能が利用可能 • ユーザー辞書の追加が容易 • Transformersでnagisa_bertモデルが利用可能 🤗 14

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

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

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

    >>> import nagisa >>> tokens = nagisa.tagging('Pythonで使えます!') >>> print(tokens) Python/名詞 で/助詞 使え/動詞 ます/助動詞 !/補助記号 >>> new_tagger = nagisa.Tagger( single_word_list=['3月のライオン'] )
  18. 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
  19. 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 ユーザー数の差が生じた原因を考え、 本発表ではその内容を失敗談として共有
  20. 開発者にライブラリを 利用してもらうために工夫したこと

  21. 21 PyCon JP 2018 ポスター発表への参加 • Python 利用者をターゲットに言語処理のライブラリを紹介 • 普段、言語処理を行わない開発者と対面で議論

    • PyCon JP をきっかけに徐々にユーザーが増え始める
  22. ユーザーの声を参考に機能を追加 • PyCon JP のポスター発表をきっかけに想定ユーザーを絞る ◦ 当時(2017~2018年)、形態素解析といえば MeCab の時代 ▪

    Python で利用するためには、MeCab 本体のインストールも必要だった ▪ pip install だけで利用できるライブラリの重要性 を感じた ◦ シンプルで簡単に利用できるライブラリを目指し、開発を行う • 既存ライブラリの足りない部分を考え、新しい機能を追加 ◦ ユーザー辞書の登録が難しいとの声(単語のパラメータ設定など) ◦ 辞書の追加が容易できる機能を追加 • 開発者ができる限り前処理を行わないにする ◦ 単語列の出力結果をリストで取得できるよう実装 ◦ 品詞フィルター機能を標準で搭載 ◦ Unicode 正規化を標準で搭載 22
  23. 23 PyCon JP 2019 のトーク発表に参加 • 固有表現抽出モデルを実装する方法について発表 • 言語処理に取り組むきっかけとなるチュートリアルを作成 ◦

    系列ラベリングの学習機能を nagisa に追加 ◦ まずは、nagisa をインストールしてもらうきっかけを作る
  24. ライブラリの実利用性を向上するための工夫 • ライブラリインポート時に、クラスを初期化するように設計 ◦ ユーザーが書くコードを一行でも減らすため • できる限りモデルサイズを最小限にする ◦ ライブラリインポート時の速度を少しでも高速化するため ◦

    もちろん、精度とのトレードオフを考えながら • モデルを含め、オリジナルの解析器であることを強調 ◦ MeCab の派生系ではない ◦ 学習機能もあるため、研究用ベースラインとして利用できる 24
  25. 工夫による効果のまとめ • PyCon JP への参加による効果 ◦ 普段、言語処理を行わない開発者にライブラリを周知 ◦ フィードバックを参考に新しい機能を追加 ◦

    ライブラリの認知度が上がり、GitHub などの検索の上位になる • 開発モチベーションの向上 ◦ ひとりでもユーザーがいると、開発のモチベーションとなる ◦ コードも慎重に書くようになる 25
  26. ライブラリ開発において 改善すべきだったこと

  27. 27 解析速度の改善 • 実利用を想定した場合、現状の解析速度では不十分だった ◦ 大規模テキストを分析する場合、待ち時間はストレスとなる ◦ 大規模言語モデルを利用する、時代のニーズに合っていなかった • 検討した改善策

    ◦ C++ でライブラリを実装し、解析速度を検証 ▪ しかし、大幅な改善もなく、MeCab, SudachiPy には到底敵わず ▪ 文字数分の処理を行う BLSTMs では、根本的に計算時間がかかる
  28. 実利用を最優先にすべきだった • 大学時代の研究の延長上でライブラリ開発 ◦ 当時の最先端モデル(BLSTMs)を使うことが目的となっていた ▪ 形態素解析器として実利用に耐える条件(解析速度、品詞タグの種類、 読み情報)を満たしつつ、オリジナリティを追加すべきだった • 新規性と実用性のトレードオフの問題

    ◦ 新規性を取り入れつつ(または精度向上を実現しつつ)、 MeCab 並の実用性を実現するのは難しい ◦ 実用性が不十分であれば、それ以上のライブラリを利用する メリット(=付加価値)が必要であった ▪ nagisa はこの部分が弱かった 28
  29. 大規模言語モデルへの対応遅れ • 現在の自然言語処理の分野では、大規模言語モデル (BERT, T5, GPT2 など)を利用することが前提 ◦ 大規模言語モデルの選択 =

    トークナイザーの選択 ◦ 最先端の流れに乗り遅れてしまった • 大規模言語モデルは、形態素解析器のユースケースのひとつに ◦ cl-tohoku/bert-base-japanese-whole-word-masking ▪ 東北大学が提供する日本語用の BERT モデル ▪ 月間で126万ダウンロード ▪ 利用されているトークナイザー: fugashi 29
  30. 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
  31. 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 ライブラリのインポート
  32. 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 入力テキストの定義
  33. 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 トークナイザーの定義
  34. 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 テキスト穴埋め関数の定義
  35. 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 関数の実行
  36. 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
  37. 37 nagisa_bert at Hugging Face Space • テキスト穴埋め問題を体験しよう ◦ nagisa_bert

    をインストールなしに試すことができます https://huggingface.co/spaces/taishi-i/nagisa_bert-fill_mask
  38. 開発者ファーストの徹底不足 • Wheel の管理不足により、ライブラリを利用できない、 バージョンや OS が存在する時期があった ◦ あらゆる開発者が問題なくライブラリを利用できるように、 Linux,

    macOS, Windows の Wheel を全て提供すべきだった ▪ 原因:依存ライブラリ dynet の開発停止、手動 Wheel アップロード • 取り組んだ解決策 ◦ dynet をフォークし、フォーク版 Wheel を自ら提供 ◦ GitHub Actionsとcibuildwheelを利用し、Wheelの作成を半自動化 38
  39. 開発者に選ばれる ライブラリの分析

  40. 40 他の言語処理ライブラリと nagisa の比較 • ライブラリを比較することで、開発者に選ばれる特徴を分析 ◦ 日本語言語処理に特化した Python ライブラリを収集

    ◦ nagisa よりもユーザー数の多いライブラリの特徴や傾向を分析 nagisa (325,904)
  41. 41 awesome-japanese-nlp-resources の紹介 • 日本語言語処理に特化したプロジェクトを GitHub より収集 ◦ 全 308

    リポジトリを掲載(コーパス、事前学習モデルを含めて) ◦ 自動でリポジトリ情報を収集し、手動でカテゴリー別に掲載 https://github.com/taishi-i/awesome-japanese-nlp-resources
  42. 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
  43. 43 最も利用されている言語処理ライブラリ • ライブラリの総ダウンロード数(pip install の回数)を比較 ◦ 上位10件をグラフにて掲載 ▪ 最も利用されているライブラリは

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

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

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

    jaconv、915万ダウンロード ▪ 文字列正規化ライブラリ、形態素解析器が上位を占める
  47. 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
  48. 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
  49. 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
  50. jaconv が開発者に選ばれる理由 • 文字列相互変換は、日本語の言語処理で必要な場面が 多いにも関わらず、標準ライブラリには機能がない ◦ 多くの人が前処理として必要とする機能をライブラリ化している • シンプルで使いやすい ◦

    Pure-Python による実装のため、インストールエラーも少ない ◦ README.md を見るだけで、実装したい処理が書ける 50
  51. 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
  52. 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
  53. 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
  54. mecab-python3 が開発者に選ばれる理由 • 長年、研究や実応用問わず、幅広く使われている ◦ MeCabは、現在の日本語言語処理のデファクトスタンダード ◦ 参考資料やサンプルコードが豊富 • 非常に高速な解析が可能

    ◦ MeCab 本体は C++ により実装されている • 辞書の種類が豊富 ◦ UniDic, IPADic, JumanDic, Neologd 54
  55. 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) <MorphemeList[ <Morpheme(形態素, 0:3, (0, 1204150))>, <Morpheme(解析, 3:5, (0, 672159))>, <Morpheme(の, 5:6, (0, 119135))>, <Morpheme(例, 6:7, (0, 294030))>, ]> https://github.com/WorksApplications/sudachi.rs
  56. 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) <MorphemeList[ <Morpheme(形態素, 0:3, (0, 1204150))>, <Morpheme(解析, 3:5, (0, 672159))>, <Morpheme(の, 5:6, (0, 119135))>, <Morpheme(例, 6:7, (0, 294030))>, ]> https://github.com/WorksApplications/sudachi.rs
  57. 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) <MorphemeList[ <Morpheme(形態素, 0:3, (0, 1204150))>, <Morpheme(解析, 3:5, (0, 672159))>, <Morpheme(の, 5:6, (0, 119135))>, <Morpheme(例, 6:7, (0, 294030))>, ]> https://github.com/WorksApplications/sudachi.rs
  58. SudachiPy が開発者に選ばれる理由 • 複数の分割単位の併用、企業による辞書更新 ◦ 必要に応じて単語の分割基準を切り替えることができる • Rust による高速化 ◦

    Python 実装(バージョン 0.5.*)の解析速度問題を Rust で解決 • chiTra(Sudachi Transformers)の存在 ◦ Transformers を利用できる環境を提供していることは強い • spaCy に搭載されている安心感 ◦ 巨大なエコシステムに一部であることは強い 58
  59. 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
  60. 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
  61. 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
  62. pykakashi が開発者に選ばれる理由 • 日本語テキストをローマ字に変換する Python ライブラリは、 pykakashi の一強状態 ◦ 日本語

    ⇒ ローマ字の変換は、地味だが非常に重宝される機能 • シンプルで使いやすい ◦ README.md を見るだけで、実装したい処理が書ける 62
  63. 63 1ヶ月単位で最も利用されたライブラリ • ライブラリの月間ダウンロード数を比較(9月1日〜10月1日) ◦ 上位10件をグラフにて掲載 ▪ 最も利用されているライブラリは SudachiPy、54万ダウンロード ▪

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

    順位に変動はあるが、総ダウンロード数と上位はほぼ変わらず
  65. 65 その他のライブラリの利用状況 • 文字列正規化、形態素解析器以外のライブラリを調査 ◦ 係り受け解析器(GiNZA, UniDic2UD, camphr)の利用が多く、 その後に、極性判定器(oseti)、文分割器(sengiri)が続く

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

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

  68. 開発者に選ばれる言語処理ライブラリの傾向 • テキストの前処理に必要となる機能を持つライブラリ ◦ 形態素解析、文字列正規化、文字列変換 • README.md を見るだけで、簡単にインストールできて、 すぐに利用できるライブラリ •

    処理に待ち時間がなく、ストレスなく利用できるライブラリ • 多くの人が面倒だと感じる処理を解決するライブラリ ◦ 複数の形態素解析器を簡単に切り替える ⇒ konoha ◦ MeCab のインストールエラーを解決 ⇒ Janome 68
  69. 69 nagisa に必要だったこと • 解析速度の改善 ◦ 処理に待ち時間が発生し、ユーザーにストレスを与えていた ▪ 多くの人に選ばれるライブラリは、ストレスを感じにくい •

    開発者ファーストの徹底不足(インストール環境の改善) ◦ Python3.9以上を利用するWindowsユーザーも対応すべきだった ▪ 多くの人に選ばれるライブラリは、インストールエラーがない • 類似ライブラリが提供する機能は標準搭載すべきだった ◦ 品詞タグの種類、読み情報がないと形態素解析器としては不十分 ▪ 多くの人に選ばれるライブラリは、足りない機能がない
  70. 70 これからライブラリを作るのであれば • 形態素解析器の自作は、かなりハードルが高い現状 ◦ 企業の参入(ワークス徳島人工知能NLP研究所、LegalForce) ◦ 学習用データセットが必要(BCCWJなど) • 個人開発者であれば、まずは便利ツール系(面倒だと感じる

    処理を解決するライブラリ)の開発がおすすめ ◦ 例えば、import するだけで matplotlib を日本語表示対応する japanize-matplotlib が良い例(100万ダウンロード) • Hugging Face 学習済みモデルの作成にはチャンスがある🤗 ◦ BERT による極性判定モデル daigo/bert-base-japanese-sentiment が良い例(84.6万ダウンロード/月)
  71. まとめ

  72. 開発者に選ばれるライブラリを作るために必要なこと • 改めて考えると、必要なことは基本的なことばかりだった ◦ 開発者が面倒だと感じることを解決する機能 ▪ 誰かの役に立ち、多くの人が困っていることを解決しよう ◦ 実利用に耐える条件(処理速度など)を十分に満たすこと ▪

    ユーザーにストレスを与えないようにしよう ▪ 必要な機能を実装した後に、オリジナリティを追加しよう ◦ 開発者ファーストの徹底、ユーザーを大切にしよう ▪ インストールエラーをなくし、誰もがライブラリを利用できるように、 README.md を丁寧に準備しよう 72
  73. 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