🎉

RMeCabみたいなRパッケージをCRANに投稿した話

2023/04/23に公開

gibasaパッケージについて

RMeCabみたいなことができる、gibasaというRパッケージを個人で開発しています。先日CRANに投稿できたので、2023年4月20日現在では、install.packages("gibasa")とするだけでもインストールできるようになっています。

https://github.com/paithiov909/gibasa

モチベーションとしては、tidytext::unnest_tokensと同じような処理をMeCabを利用しつつできるようにしたいということで開発しています。また、とくに最近は、より簡単に利用をはじめられるようにしようと、すこしずつ改善を続けています。

開発の背景

RからMeCabを利用できるRパッケージとしては、すでにRMeCabがあります。徳島大学の石田基広先生が開発されているもので、わりと昔からあるパッケージです。

RMeCabは便利なパッケージですが、残念ながら、CRANには登録されていません。

技術的な話をすると、RMeCabはMeCabのダイナミックライブラリを用いて形態素解析をおこないます。そのため、ビルドするにはlibmecab.dllなどのバイナリファイルが必要です。一方で、CRANポリシーは基本的にそうしたバイナリファイルをソースパッケージに含めることを禁止しています。おそらくですが、そういった事情から、RMeCabはCRANに登録することが困難だったのだろうと思われます。

同様にMeCabのダイナミックライブラリを利用するRパッケージとして、RcppMeCabというパッケージがCRANにあります。しかし、RcppMeCabは、2023年4月現在ではすでにアクティブにメンテナンスされていないように見えます。MeCabを利用するパッケージをCRANに登録し、複数のプラットフォーム上で動作するようにメンテンナンスするのはなかなか難しかったようで、実際、そのようなRパッケージはこれまでCRANにはありませんでした。

その点、gibasaはCRANからインストールできるものとしてはおそらくはじめてともいえる、外部のバイナリファイルなしで形態素解析が可能なRパッケージです。gibasaはv0.5.0からMeCabのソースコードをソースパッケージ内に含んでいるため、ビルドするのにMeCabのバイナリファイルを必要としません。

インストールの仕方

gibasaを実際に利用するには、MeCabの辞書とその場所が書かれた設定ファイル(mecabrc)が必要です。逆に、それらがあればMeCabのバイナリはなくても動かせます。よくわからないという人は、とりあえずふつうにMeCabもインストールしておくと動かせると思います。

たとえば、WindowsでMeCabをインストール済みであれば、以下のようにするだけで利用できるようになるはずです。

install.packages("gibasa")

インストール後にgibasa::dictionary_info()して、辞書のパスが含まれているデータフレームが返ってくれば上手くいっています。

使い方

形態素解析をするには、次のようにtokenizeという関数を使います。

gibasa::tokenize(c("頭が赤い魚を食べた猫", "望遠鏡で泳ぐ彼女を見た"))
#> # A tibble: 15 × 5
#>    doc_id sentence_id token_id token  feature
#>    <fct>        <int>    <int> <chr>  <chr>
#>  1 1                1        1 頭     名詞,一般,*,*,*,*,頭,アタマ,アタマ
#>  2 1                1        2 が     助詞,格助詞,一般,*,*,*,が,ガ,ガ
#>  3 1                1        3 赤い   形容詞,自立,*,*,形容詞・アウオ段,基本形,…
#>  4 1                1        4 魚     名詞,一般,*,*,*,*,魚,サカナ,サカナ
#>  5 1                1        5 を     助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
#>  6 1                1        6 食べ   動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
#>  7 1                1        7 た     助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
#>  8 1                1        8 猫     名詞,一般,*,*,*,*,猫,ネコ,ネコ
#>  9 2                2        1 望遠鏡 名詞,一般,*,*,*,*,望遠鏡,ボウエンキョウ,…
#> 10 2                2        2 で     助詞,格助詞,一般,*,*,*,で,デ,デ
#> 11 2                2        3 泳ぐ   動詞,自立,*,*,五段・ガ行,基本形,泳ぐ,オヨ…
#> 12 2                2        4 彼女   名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノ…
#> 13 2                2        5 を     助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
#> 14 2                2        6 見     動詞,自立,*,*,一段,連用形,見る,ミ,ミ
#> 15 2                2        7 た     助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

この関数には、次のようにデータフレームを渡すこともできます。

data.frame(
  doc_id = c("a", "b"),
  text = c("頭が赤い魚を食べた猫", "望遠鏡で泳ぐ彼女を見た")
) |>
  gibasa::tokenize()
#> # A tibble: 15 × 5
#>    doc_id sentence_id token_id token  feature
#>    <fct>        <int>    <int> <chr>  <chr>
#>  1 a                1        1 頭     名詞,一般,*,*,*,*,頭,アタマ,アタマ
#>  2 a                1        2 が     助詞,格助詞,一般,*,*,*,が,ガ,ガ
#>  3 a                1        3 赤い   形容詞,自立,*,*,形容詞・アウオ段,基本形,…
#>  4 a                1        4 魚     名詞,一般,*,*,*,*,魚,サカナ,サカナ
#>  5 a                1        5 を     助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
#>  6 a                1        6 食べ   動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
#>  7 a                1        7 た     助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
#>  8 a                1        8 猫     名詞,一般,*,*,*,*,猫,ネコ,ネコ
#>  9 b                2        1 望遠鏡 名詞,一般,*,*,*,*,望遠鏡,ボウエンキョウ,…
#> 10 b                2        2 で     助詞,格助詞,一般,*,*,*,で,デ,デ
#> 11 b                2        3 泳ぐ   動詞,自立,*,*,五段・ガ行,基本形,泳ぐ,オヨ…
#> 12 b                2        4 彼女   名詞,代名詞,一般,*,*,*,彼女,カノジョ,カノ…
#> 13 b                2        5 を     助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
#> 14 b                2        6 見     動詞,自立,*,*,一段,連用形,見る,ミ,ミ
#> 15 b                2        7 た     助動詞,*,*,*,特殊・タ,基本形,た,タ,タ

詳しい使い方は、以下の資料を見てください。

GitHubで編集を提案

Discussion