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

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

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. 自己紹介 • 名前 ◦ 池田 大志(Taishi Ikeda) • 略歴 ◦

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

    想定する聞き手 ◦ 現在、Python ライブラリ開発に取り組んでいる人 ◦ これから、Python ライブラリ開発に挑戦したい人 ◦ 多くの開発者に利用されているライブラリについて知りたい人 3
  3. 目次(1/3) • 言語処理ライブラリ nagisa の紹介 ◦ nagisa とは? ◦ nagisa

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

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

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

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

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

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

    >>> import nagisa >>> tokens = nagisa.tagging('Pythonで使えます!') >>> print(tokens) Python/名詞 で/助詞 使え/動詞 ます/助動詞 !/補助記号 >>> new_tagger = nagisa.Tagger( single_word_list=['3月のライオン'] )
  10. 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
  11. 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 ユーザー数の差が生じた原因を考え、 本発表ではその内容を失敗談として共有
  12. ユーザーの声を参考に機能を追加 • PyCon JP のポスター発表をきっかけに想定ユーザーを絞る ◦ 当時(2017~2018年)、形態素解析といえば MeCab の時代 ▪

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

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

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

    ライブラリの認知度が上がり、GitHub などの検索の上位になる • 開発モチベーションの向上 ◦ ひとりでもユーザーがいると、開発のモチベーションとなる ◦ コードも慎重に書くようになる 25
  16. 27 解析速度の改善 • 実利用を想定した場合、現状の解析速度では不十分だった ◦ 大規模テキストを分析する場合、待ち時間はストレスとなる ◦ 大規模言語モデルを利用する、時代のニーズに合っていなかった • 検討した改善策

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

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

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

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

    macOS, Windows の Wheel を全て提供すべきだった ▪ 原因:依存ライブラリ dynet の開発停止、手動 Wheel アップロード • 取り組んだ解決策 ◦ dynet をフォークし、フォーク版 Wheel を自ら提供 ◦ GitHub Actionsとcibuildwheelを利用し、Wheelの作成を半自動化 38
  28. 41 awesome-japanese-nlp-resources の紹介 • 日本語言語処理に特化したプロジェクトを GitHub より収集 ◦ 全 308

    リポジトリを掲載(コーパス、事前学習モデルを含めて) ◦ 自動でリポジトリ情報を収集し、手動でカテゴリー別に掲載 https://github.com/taishi-i/awesome-japanese-nlp-resources
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. SudachiPy が開発者に選ばれる理由 • 複数の分割単位の併用、企業による辞書更新 ◦ 必要に応じて単語の分割基準を切り替えることができる • Rust による高速化 ◦

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

    ⇒ ローマ字の変換は、地味だが非常に重宝される機能 • シンプルで使いやすい ◦ README.md を見るだけで、実装したい処理が書ける 62
  44. 開発者に選ばれる言語処理ライブラリの傾向 • テキストの前処理に必要となる機能を持つライブラリ ◦ 形態素解析、文字列正規化、文字列変換 • README.md を見るだけで、簡単にインストールできて、 すぐに利用できるライブラリ •

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

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

    処理を解決するライブラリ)の開発がおすすめ ◦ 例えば、import するだけで matplotlib を日本語表示対応する japanize-matplotlib が良い例(100万ダウンロード) • Hugging Face 学習済みモデルの作成にはチャンスがある🤗 ◦ BERT による極性判定モデル daigo/bert-base-japanese-sentiment が良い例(84.6万ダウンロード/月)
  47. 開発者に選ばれるライブラリを作るために必要なこと • 改めて考えると、必要なことは基本的なことばかりだった ◦ 開発者が面倒だと感じることを解決する機能 ▪ 誰かの役に立ち、多くの人が困っていることを解決しよう ◦ 実利用に耐える条件(処理速度など)を十分に満たすこと ▪

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