2 ポイント 投稿者 GN⁺ 2023-08-31 | 1件のコメント | WhatsAppで共有
  • 自分の文章コーパスから自動でタイピング用ショートカットを作成し、メールやSlackで使う入力短縮を生成するツール
  • テキストコーパスを解析し、タイピング時に最も多くの文字数を節約できるショートカットを提案し、Linuxのキーボード短縮プログラムであるAutokeyの設定ファイルを生成する
  • コーパス内で頻出するn-gramを見つけて、より短い表現に置き換える候補を作成し、提案順位は[節約した文字数] * [フレーズ頻度]で計算する
  • ショートカットの選定は覚えやすい省略を目標とし、単語として入力したい略語はブラックリストで除外し、より頻繁に使うフレーズにより覚えやすい省略を優先的に割り当てる
  • Slackメッセージをコーパスとして使うためのSlack Data Export解析ツールも提供する
    • Slackワークスペース管理者のみexport可能
    • public channelのみexportされる
    • USERNAME_TO_EXPORTをSlackユーザー名に置き換えた後、parse_slack.pyを実行する必要がある
    • Slack exportはsrmで削除する手順を含む
  • 基本的な使用フローは、data/corpus/*.txtにコーパスを入れ、find_suggested_phrases.pyで上位200件の候補をoutput/suggested_shortcuts.yamlに作成した後、必要な項目をshortcuts.yamlへ移し、generate_autokeys.pyでAutokey設定ファイルを生成する方式
  • install.shで依存関係をインストールし、現在はPython 3.10.12でテストされている
  • Autokeyは現在LinuxのX11のみをサポートしており、Waylandはサポートしていない
  • 生成されるAutokey設定はChromeにフォーカスがある場合にのみ適用されるよう構成されており、terminalやvscodeでは短いLinuxコマンドや変数名と省略が衝突して問題が多かったという使用経験も含まれている

1件のコメント

 
GN⁺ 2023-08-31
Hacker Newsのコメント
  • プロジェクトについての動画を含むブログ記事も書いた: https://erikschluntz.com/software/2023/08/26/compressing-my-...
    珍しく、投入した時間以上に実際の時間を節約してくれたサイドプロジェクトだった :)

  • アイデアはとても賢いが、時間とともに変わる方式なら使いたくない気がする
    たとえば6か月ごとに実行して、去年は dbdebug だったのに今年は database になると、筋肉記憶や習慣を壊しかねない
    なので、さまざまな背景や文脈の何千人もの人が書いた本、メール、メッセージに対して実行したとき、誰にとっても安定して役立つ汎用版のほうに興味がある
    tthe に、stsomething に展開するのは当然に見えるが、200〜500個程度の最小セットを作り、誰もが習得できる「標準キーボード」にできるのか気になる

    • Evans Basic English Codeを見てみる価値がある。電信用のPhillips Codeをベースにした速記体系で、少し古いものの、最も一般的な単語は文章作成やタイピングにかなり役立つ
      https://archive.org/details/evansbasicenglis00evan
      PDFを使うのがよく、TXTファイルはOCR品質が悪くほとんど使えない
      これも有用: https://en.m.wikipedia.org/wiki/Most_common_words_in_English
    • まさにその理由で、自動的には実行されない。suggested_shortcuts.yaml を出力し、そこから shortcuts.yaml にコピーする方式なので、実際に有効化するショートカットは手動で制御できる :)
    • こうした汎用版は結局、速記キーボードに近いものなのではないかと思う
    • 以前Yublinを見つけたのだが、英語で最も一般的な600語について1〜3文字の略語を作る、まさにそういう試みだった
      そしてやはり the -> t がリストの一番上にある: https://jonaquino.blogspot.com/2007/06/yublin-shorthand-for-...
    • 一般解は、多くの人にとって中途半端にしか合わない可能性が高い
      化学者は dropper をよく打つので dp を望むかもしれないが、役人は department のほうを好むかもしれない
  • 中国語ネイティブでなければ知らないかもしれないが、中国語にはこうした機能が内蔵されている
    公式には双拼(Shuangpin)と呼ばれ、単語ごとに英字2文字を入力して単語全体を入力する方式: https://zh.wikipedia.org/zh-sg/%E5%8F%8C%E6%8B%BC
    Shuangpinを正式に使わなくても、ほとんどの中国語入力システムは人気のフレーズに対して似た
    简拼
    機能をサポートしており、各単語の最初の英字だけを入力して複数語のフレーズを入力できる
    たとえば中国語で「thank you」を表す xiexie を入力するには、通常 xx と打つだけで、ほとんどの中国語入力システムが自動的に該当する漢字を提案する

    • 優れたピンインキーボードでは、よくある文を素早く入力しやすい
      たとえば “what do you want to eat” にあたる「你想吃什麼」は n x c s m で入力する
    • 標準キーボードで中国語を入力する方法についての興味深いポッドキャストを最近聞いた: https://radiolab.org/podcast/wubi-effect
    • XLBXiao long bao と書くのもこの例なのか気になる。もっと広い体系だとは知らなかったが、いいね
    • これは今議論しているテーマとはまったく関係がないように見える
  • こういうプロジェクトを見るのは本当に楽しい
    週末に似た問題に取り組んだが、自作辞書の略語ではなく単語全体を対象にし、一般的な場合には与えられたテキストコーパスに合わせて調整する方式だった
    気になっていたのは「与えられたテキストコーパスに合わせて調整された自動修正器を作れるだろうか?」ということだった。たとえば文書内で data augmentation のような長い表現をよく使う場合、それを自動化できるか見てみたかった
    アプローチは、一般データセットであるNYTコーパスで単一語と2-gramのサプライザルを計算し、調整対象のインデックスにある単語に重みを加えたうえで、サプライザルで重み付けしたトライデータ構造を作り、高度なオートコンプリートとして使うというものだった
    動作する解法はこちら: https://github.com/capjamesg/autowrite/blob/main/autocomplet...
    まだドキュメントはなく、数日以内に追加する予定で、話したければGitHub Issueを残せばよい

    • これは https://github.com/wolfgarbe/SymSpell とかなり似ているように聞こえる
      あるいは、同じ表現をもっと創造的に言う方法を探しているのかと、私が混同しているだけかもしれない
  • 拡張アイデアとして、入力を監視するキーロガーを組み込むこともできる。もちろん、それ自体が欠点ではある
    ユーザーがよく使うフレーズを学習し、ありふれたフレーズを見つけて短縮語を提案し、その後ユーザーがフレーズ全体を入力するたびに短縮語をさりげなく知らせる、という方式
    そうすれば誰でもインストールでき、導入のハードルも低く、時間が経つにつれて徐々に生産性を上げられる

    • 特殊キーを押すとオートコンプリートしてくれる内蔵キーロガー付きキーボードを作りたかった
      データはデバイス内の安全なストレージに保管し、セキュリティリスクにならないようにする構想だった
    • 一部は**入力メソッド(IME)**として実装できる。入力メソッドは実質的に、入力を編集できる承認済みのキーロガーであり、主に中国語/日本語入力に必要なもの
      デスクトップでスマートフォンのような英語のオートコンプリートを提供したり、fcitx5 のような入力メソッドフレームワークで短縮語を提供したりする入力メソッドは、面白いコンセプトになりそう
    • どう動くのか気になる
      毎週 Slack の履歴を自動エクスポートして単語頻度を求め、見えた結果をもとに手動で展開語をいくつも設定する、という感じだろうか?
    • 似たようなものをプロトタイプとして作ろうとして、かなり深掘りしたことがある
      Bluetooth Keyboard -> ESP32 をキーボードホストとして使い、キー入力を USB とファイルに送る構成だった
      お金があれば、データをディスクに保存する USB/PS2 キーボードロガーもある
    • 標準化された略語があるほうがよいのではないかと思う
      そちらに収束させれば、複数のコンピュータ間での一貫性にも役立つし、複数台のコンピュータを使う場合にもよい
  • 自分の場合、いくつかのチャット状況を除けば、タイピングがボトルネックになったことはほとんどない気がする
    むしろ、映像や音声の追加帯域が役に立ったであろうやり取りがあるだけだ。こうした短縮語が実際の作業時間の節約につながるのか気になる

    • 主な動機は、非常に速いSlack での会話と、かなり定型化されたメール返信だった
      たとえば「スクリーンショットを上げてもらえますか?」のような会話や、Calendly リンクを送るような応答
      長い文章を書くときも、思考のほうがタイピングより速い点に苛立つことが多いので、その部分にも役立つ
    • 時間の節約も一面ではあるが、反復使用による緊張性損傷や手根管症候群を抱える人にも有用かもしれない
    • より速いタイピングは、全体の時間を減らす問題というより、思考の合間の遅延を減らす問題
      タイピングは思考を妨げる手作業なので、タイピングに入って戻ってくる時間を減らすほど、より早く思考に戻れる
    • タッチタイピング能力も影響するのか気になる
  • 自分で使うテキスト展開を作ろうとして、かなり多くの時間を費やした
    思ったよりずっと難しく、あまり頻繁に誤作動せず、かつ十分な価値があるエイリアスを見つけるのは難しい
    複数の言語で毎日やり取りしているのでさらに複雑になり、今はアプリケーションごとにエイリアスを分けている
    それでも誤作動は残っていて、概ね区切り文字が必要だという結論に近づいている

    • Ikclaks は magic sturdy キーボード配列の上で興味深い取り組みをしている: https://github.com/Ikcelaks/keyboard_layouts/blob/main/magic...
    • エイリアスの前に kkzzqq のように、単語や変数名の最初の文字としては出にくい文字の組み合わせを付けている
      たとえば qqme は自分のメール署名
      元記事のツールが README で見たものより長いフレーズに対するエイリアスも提案してくれるとよい。macOS 用の TextExpander はそうしてくれると聞いたが、自分は Mac ユーザーではない
    • 適切な妥協点は、最も一般的な単語にだけ略語を使い、残りは簡単な GUI ポップアップでファジー検索して貼り付ける方式かもしれない
    • 複数の言語を使うと、使える短縮語はかなり少なくなりそう
      TODO の一つは、分析した実際のテキストコーパスを使って、避けるべきエイリアスのブロックリストも生成すること
  • 個人的に告白すると、iPhone 以前の携帯電話で使っていたSMS式の略語が好きだったことはない
    どうしても必要なとき以外、SMS やテキストメッセージをほとんど使わなかった理由の一つだった
    iOS と macOS で動作する TextExpander の初期からテキスト展開を使ってきたし、iPhone のキーボードがどれだけ良くても、自宅住所、自宅/職場の地図、仕事・個人情報のような内容を繰り返し入力するのは不便だった。TextExpander は大いに役立った
    その後 TextExpander がサブスクリプションモデルに移行し、代替を探し始めたが、個人的にはこうしたツールにサブスクリプションモデルは合わないと思った。Alfred の Powerpack に含まれる Snippets のほうがよい代替だった
    macOS/iOS にも内蔵の「Text Replacements」があるが、Apple アプリ以外ではよく失敗する。ここにあるものは Apple の Text Replacement に似ており、自分はその機能は残しつつ、残りは Alfred で管理している。正直、Alfred から完全に離れられるようになれば、こちらへ移るかもしれない
    ただし、通常のタイピングを邪魔しないよう、展開には区切り文字を使いたい。今は , を区切り文字として使っている。英語ではカンマの後には常に空白が来るし、自分の展開は空白なしでカンマと短いテキストを打った後にだけ起こるからだ。タッチタイピング時のカンマキーの位置も使いやすい
    OS の Text Replacement に残るとしても、意図しない場面で単語が自動展開されるのを防ぐために区切り文字を導入すると思う
    https://textexpander.com
    https://www.alfredapp.com

    • 生成する Autokey 設定で区切り文字の処理を合わせるのにかなり時間をかけた
      最も細かい例外処理は .py。通常 . は区切り文字だが、py の前では例外にして、Python ファイル名を入力するときに邪魔しないようにした
  • 長年のオートコンプリートのせいで、第二言語である英語力はすでに悪くなっている
    単語は知っているのに綴りを思い出せず、発音を忘れることが増えたし、こういうツールは残っている力まで完全になくしてしまいそう

  • キーワードを覚える代わりに、頭文字を書けばいいのではと思う
    数週間前にChatGPTで実験してみたが、こうした機能を持つ既存ソフトウェアはなさそうだった
    プログラミングは得意ではないが、誰かが作ってくれるといいと思う: https://imgur.com/a/0o4zLwT

    • これに似たコンセプトのプロトタイプを作った。好きなように省略して書くと、ChatGPTが各文の後ろで修正してくれる方式
      精度はかなり良いが、外したときは非常にイライラする
      完璧に動作しても、実際に使ってみると普段どおりにタイピングするより認知負荷がずっと大きかった
      かなり集中すれば、省略形を使いながら普段の楽なタイピング速度くらいには合わせられたが、それを超えることはできず、結局自然と通常のタイピングに戻ってしまった
      ただし私はタイピングが速く、文章をたくさん書くほうなので、このプロトタイプは30年ほど強く最適化されてきた脳内プロセスに勝とうとしているようなものだ。もともと高速タイピストではない人には、もっと合うかもしれない