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

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
    池田 大志

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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
    ユーザー数の差が生じた原因を考え、
    本発表ではその内容を失敗談として共有

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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
    入力テキストの定義

    View Slide

  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
    トークナイザーの定義

    View Slide

  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
    テキスト穴埋め関数の定義

    View Slide

  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
    関数の実行

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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)
    , 672159))>, , 294030))>,
    ]>
    https://github.com/WorksApplications/sudachi.rs

    View Slide

  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)
    , 672159))>, , 294030))>,
    ]>
    https://github.com/WorksApplications/sudachi.rs

    View Slide

  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)
    , 672159))>, , 294030))>,
    ]>
    https://github.com/WorksApplications/sudachi.rs

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  71. まとめ

    View Slide

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

    View Slide

  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

    View Slide