felpパッケージでRのヘルプをあいまいに検索しよう

by
カテゴリ:
タグ:

Rでヘルプを見ようにも記憶が曖昧だったり、つづりがあやふやで調べようがない経験があるかもしれません。

そこで、あいまいな(fuzzy)キーワードでヘルプを検索するfuzzyhelp関数をfelpパッケージに追加しました。

まだCRANにはアップロードしてませんが、よければ使ってみてください。

# 要remotesパッケージ
# install.packages("remotes")
remotes::install_github("atusy/felp")

fuzzyhelpのデモ

使い方は以下の通り。

  1. UIを起動
    • felp::fuzzyhelp()を実行するか、コマンドパレットをCtrl+Shift+Pで開き「Fuzzy Search on R Help」を指定する
  2. 検索キーワードを入力
    • あいまい一致するので、typoを気にする必要はありませ
    • スペースはキーワードの区切り扱いになります
  3. 検索結果一覧から必要なTopicを選ぶ
    • 一覧のサイズはマウス操作で変更可能
  4. 画面下部でヘルプを閲覧する
  5. UIを終了
    • Doneボタンを押すと、最後にプレビューしているページのヘルプを正式に展開します。RStudioであればHelpタブが表示され、コンソールであればhelp関数が実行されます。
    • Cancelボタンを押すと、何もせずに終了します。

通常のhelp関数を使う場合と異なり、パッケージ名やヘルプのタイトルにもあいまい一致する特徴があります。

トピック名、パッケージ名、タイトルの順に重みをつけていますが、使ってみてイマイチな挙動があれば教えてください。

アルゴリズム

ざっと以下の通りです

  1. 入力文字を半角スペースで分割しクエリとする
  2. パッケージ、トピック、タイトル、それぞれに対し各クエリとの距離行列を算出する
    • 行数: 検索対象の数
    • 列数: 検索クエリの数
    • 手法
      • パッケージ: レーベンシュタイン距離(stringdist::stringdist関数)
      • トピック: レーベンシュタイン距離(stringdist::stringdist関数)
      • タイトル: タイトルの文字列上で窓をずらしながらOptimal string aligment(OSA; 制限付きDamerau-Levenshtein距離)の最小値を算出(stringdist::afind関数)
  3. パッケージ、トピック、タイトルそれぞれの距離行列に対して行ごとの平均値を計算し、重み付きの和をとり、スコアとする
  4. 検索対象をスコアの昇順でソートする
  5. 検索クエリが複数ある場合、上位20点の順位を調整する
    • パッケージとトピックがどの検索クエリと最近傍にあったか調べる
    • 最近傍クエリが共通する場合、上位20位の範囲で最下位にする
    • ただし、最近傍クエリが2回以上入力されている場合をのぞく

一番のキモは最後の順位調整でしょう。

たとえば「ggplot geom_pint」で検索した場合、「geom_pint」は「geom_point」の誤りです。このため、「ggplot」クエリと距離の近い「ggplot2」パッケージの「ggplot」関数が最有力候補になりやすいです。しかし、ユーザーは意図を持って複数クエリを入力しているはずなので、パッケージ名とトピック名(この場合は関数名)が異なるクエリと最近傍になる組み合わせを優先しました。ただし、ユーザーが「ggplot ggplot」と入力している場合は、「ggplot」を2箇所以上にマッチさせたいのだと予想できるので、例外としています。

2番目の距離行列の算出方法は色々試してなんとなくよさそうな指標を採用しています。タイトルに関してはパッケージやトピックに比べて長文なので、部分的なあいまい一致を鑑みるべきだろうと考えました。

3番目の重み付けは多くのユーザーがトピック(基本的に関数名)、パッケージ、タイトルの順に気にするだろうという考えから実施しています。数値としてはトピックが1、パッケージが0.5、タイトルが0.1となっていますが、具体的根拠はありません。

Enjoy!!


  1. よくあるタイポとのことで、ジョークパッケージ化されてます https://github.com/coolbutuseless/geomlime↩︎