IshidaMotohiro / RMeCab

Interface to MeCab
30 stars 10 forks source link

R4.0でのRMeCabの利用 #24

Closed StatsBeginner closed 1 year ago

StatsBeginner commented 1 year ago

AWSのEC2(Linux)上でRを使っているのですが、現時点では「R-4.0.2-5.amzn2.0.1.x86_64」が最新となっております。 RMeCabをインストールしようとすると、 "package 'RMeCab' requires R >= 4.2.0" となって、インストールできませんでした。 Rの旧バージョン向けのものは公開されていないでしょうか?

IshidaMotohiro commented 1 year ago

以下でインストールできないでしょうか?

install.packages("RMeCab", repos="https://rmecab.jp/R", type = "source")

StatsBeginner commented 1 year ago

最初、その方法を試して以下のようなエラーがでました。

install.packages("RMeCab", repos="https://rmecab.jp/R", type = "source")
Installing package into ‘/home/ec2-user/R/x86_64-koji-linux-gnu-library/4.0’
(as ‘lib’ is unspecified)
trying URL 'https://rmecab.jp/R/src/contrib/RMeCab_1.05.tar.gz'
Content type 'application/x-gzip' length 61195 bytes (59 KB)

downloaded 59 KB

* installing *source* package ‘RMeCab’ ...
** using staged installation
** libs
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c Ngram.cpp -o Ngram.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c NgramDF.cpp -o NgramDF.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c NgramDF2.cpp -o NgramDF2.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c RMeCab.cpp -o RMeCab.o
RMeCab.cpp:25:1: warning: multi-line comment [-Wcomment]
 //#define CHECK(eval) if (! eval) {    \
 ^
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c RMeCabC.cpp -o RMeCabC.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c RMeCabDoc.cpp -o RMeCabDoc.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c RMeCabFreq.cpp -o RMeCabFreq.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c RMeCabMx.cpp -o RMeCabMx.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c RMeCabText.cpp -o RMeCabText.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c collocate.cpp -o collocate.o
collocate.cpp: In function ‘SEXPREC* collocate(SEXP, SEXP, SEXP, SEXP)’:
collocate.cpp:220:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while( (z + y) <= vec1.size()){// node後の語の処理
            ~~~~~~~~^~~~~~~~~~~~~~
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c docDF.cpp -o docDF.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c docMatrix2.cpp -o docMatrix2.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c docMatrixDF.cpp -o docMatrixDF.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c docNgram2.cpp -o docNgram2.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c docNgramDF.cpp -o docNgramDF.o
g++ -m64 -std=gnu++11 -I"/usr/include/R" -DNDEBUG -I.  -I/usr/local/include   -fpic  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches    -m64 -mtune=generic  -c setMeCabMap.cpp -o setMeCabMap.o
g++ -m64 -std=gnu++11 -shared -L/usr/lib64/R/lib -Wl,-z,relro -o RMeCab.so Ngram.o NgramDF.o NgramDF2.o RMeCab.o RMeCabC.o RMeCabDoc.o RMeCabFreq.o RMeCabMx.o RMeCabText.o collocate.o docDF.o docMatrix2.o docMatrixDF.o docNgram2.o docNgramDF.o setMeCabMap.o -L/usr/local/lib -lmecab -L/usr/lib64/R/lib -lR
installing to /home/ec2-user/R/x86_64-koji-linux-gnu-library/4.0/00LOCK-RMeCab/00new/RMeCab/libs
** R
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
  converting help for package ‘RMeCab’
    finding HTML links ... done
    Ngram                                   html  
    NgramDF                                 html  
    NgramDF2                                html  
    RMeCabC                                 html  
    RMeCabDF                                html  
    RMeCabDoc                               html  
    RMeCabFreq                              html  
    RMeCabMx                                html  
    RMeCabText                              html  
    coOccurrence                            html  
    collScores                              html  
    collocate                               html  
    docDF                                   html  
    docMatrix                               html  
    docMatrix2                              html  
    docMatrixDF                             html  
    docNgram                                html  
    docNgram2                               html  
    docNgramDF                              html  
    print.docMatrix                         html  
    rmSign                                  html  
    weights                                 html  
** building package indices
** testing if installed package can be loaded from temporary location
Error: package or namespace load failed for ‘RMeCab’ in dyn.load(file, DLLpath = DLLpath, ...):
 unable to load shared object '/home/ec2-user/R/x86_64-koji-linux-gnu-library/4.0/00LOCK-RMeCab/00new/RMeCab/libs/RMeCab.so':
  libmecab.so.2: cannot open shared object file: No such file or directory
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/ec2-user/R/x86_64-koji-linux-gnu-library/4.0/RMeCab’
Warning in install.packages :
  installation of package ‘RMeCab’ had non-zero exit status

The downloaded source packages are in
    ‘/tmp/Rtmp0gLMtB/downloaded_packages’

そこで、 install.packages("remotes") remotes::install_github("IshidaMotohiro/RMeCab") を試したところ、 package 'RMeCab' requires R >= 4.2.0 というエラーがでたという経緯になります。

IshidaMotohiro commented 1 year ago

別途 MeCab をインストールする必要があるのですが、エラーを見ると、MeCabがはいっていないように見受けられます。

入っていない場合、AWS MeCab Amzon Linux で検索し、比較的新しいブログなどを参考して、インストールしてみてください。

例: https://qiita.com/hoto17296/items/7add794de677112566bc

SagerMaker の Juputer仮想環境上で MeCab を使う場合は、ちょっと調整が必要かもしれません。

StatsBeginner commented 1 year ago

何度も申し訳ありません、MeCab自体のインストールは終わっておりまして、EC2のシェルから実行可能な状態にはなっております。

[ec2-user@ip-xxx-xx-xx-xxx ~]$ mecab
すももももももものうち。
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
も   助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
の   助詞,連体化,*,*,*,*,の,ノ,ノ
うち  名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
。   記号,句点,*,*,*,*,。,。,。
EOS

ちなみにlibmecab.so.2というファイルは、 /usr/src/mecab/mecab/src/.libs/libmecab.so.2 という位置にありました。

StatsBeginner commented 1 year ago

もしかすsると、mecabをインストールする場所が悪かったのでしょうか。 mecabのインストールは、homebrewからだとCコンパイラーが動きませんというエラーがでて(gccはじめ必要と思われるツール類はインストールしてあるつもりなのですが)だめだったので、 https://libproc.com/install-mecab-on-linux/ このページを参考に、以下のような作業でインストールしました。

$ cd /usr/src
$ sudo git clone https://github.com/taku910/mecab.git
$ cd mecab/mecab
$ sudo ./configure --enable-utf8-only
$ sudo make & make check
$ sudo make install
IshidaMotohiro commented 1 year ago

Rが /usr/src/mecab/mecab/src/.libs/以下を、ライブラリパスとして認識していないようです。 (わたしもAmazon Linux を使っていますが、 特にトラブルが起こったことはないです)。

そのパスを認識させれば良いということになりますが、

sudo ldconfig

を実行してから、RMeCabのインストールを試してみます。失敗する場合ですが、(失敗しそうな気がしますが)

  1. とりあえずライブラリパスに /usr/src/mecab/mecab/src/.libs/ を加える。また辞書の場所を正確に指定する。(Amazon Linux でのライブラリ関連のパスをちょっといま確認できないので、いま、説明しかねます)

  2. MeCabと辞書をそれぞれ make uninstall で削除し、confiugre時に、それぞれ次のオプションを加えてインストールし直す。

本体 ./configure --prefix=/usr/local --with-charset=utf8 --enable-utf8-only

辞書 ./configure --with-mecab-config=/usr/local/bin/mecab-config --prefix=/usr/local --with-charset=utf8 --with-dicdir=/usr/local/mecab-dic/ipadic-utf8

2のほうが確実そうな気がしますが、そもそもオプション無しでインストールした場合に、/usr/src/mecab/mecab/src/.libs/ が生成されるようなので、うまく行かないかもしれません。

IshidaMotohiro commented 1 year ago

ちょっと気になったので、いまインスタンスを立ててやってみました。以下の手順で特にオプションを指定せずに実行すると、MeCabのデフォルトのライブラリパスにインストールされますが、Amazon Linux がそれを認識していないので、exportでライブラリパスを指定して実行すると、動きます。 ライブラリパスは .bashrc に書き込んでおくことで永続化されます。

[ec2-user@ip-172-31-33-10 ~]$ sudo yum install git gcc-c++
[ec2-user@ip-172-31-33-10 ~]$ git clone https://github.com/taku910/mecab.git
[ec2-user@ip-172-31-33-10 ~]$ cd mecab/mecab
[ec2-user@ip-172-31-33-10 ~]$ ./configure --with-charset=utf8
[ec2-user@ip-172-31-33-10 ~]$ sudo make install
[ec2-user@ip-172-31-33-10 ~]$ cd ../mecab-ipadic/
[ec2-user@ip-172-31-33-10 ~]$ ./configure --with-charset=utf8
[ec2-user@ip-172-31-33-10 ~]$ sudo make install
[ec2-user@ip-172-31-33-10 ~]$ sudo amazon-linux-extras install R4
[ec2-user@ip-172-31-33-10 ~]$ export LD_LIBRARY_PATH="/usr/local/lib"
[ec2-user@ip-172-31-33-10 ~]$ R
...
> install.packages("RMeCab", repos="https://rmecab.jp/R")
 パッケージを ‘/home/ec2-user/R/x86_64-koji-linux-gnu-library/4.0’ 中にインストールします 
.....

* DONE (RMeCab)

 ダウンロードされたパッケージは、以下にあります 
    ‘/tmp/RtmpGy5tzI/downloaded_packages’ 
> library(RMeCab)
> RMeCabC("すもももももももものうち")
[[1]]
    名詞 
"すもも" 

[[2]]
助詞 
"も" 
...

[ec2-user@ip-172-31-33-10 ~]$ cd
[ec2-user@ip-172-31-33-10 ~]$ echo 'LD_LIBRARY_PATH="/usr/local/lib"' >> .bashrc
StatsBeginner commented 1 year ago

ありがとうございます。 ちょうど、Rから /usr/src/mecab/mecab/src/.libs/ を.libPaths()に追加する方法で解決したところでした(.Rprofileを使用)。 シェルの環境変数に書き込んでもよい旨、別のインスタンスを立ち上げるときのために覚えておきます。 というかまぁ、最初からオプションつきでインストールすればいいんですね……。 ありがとうございました。

StatsBeginner commented 1 year ago

mecabとipadicを両方ともsudo make uninstallしてから、以下で再インストールしてみたのですが、

$ git clone https://github.com/taku910/mecab.git
$ cd mecab/mecab
$ ./configure --prefix=/usr/local --with-charset=utf8 --enable-utf8-only
$ sudo make install
$ cd ../mecab-ipadic/
$ ./configure --with-mecab-config=/usr/local/bin/mecab-config --prefix=/usr/local --with-charset=utf8 --with-dicdir=/usr/local/mecab-dic/ipadic-utf8
$ sudo make install

するとこんどは、インストールできたかのような感じになり、mecab -vと打てばバージョンが表示されるのですが、ターミナルでmecabと打つと param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc というエラーが表示されて、mecabを起動させることはできませんでした。

IshidaMotohiro commented 1 year ago

辞書を一旦アンインストールして以下を実行して試してみてください。

$ ./configure --with-mecab-config=/usr/local/bin/mecab-config --prefix=/usr/local --with-charset=utf8

StatsBeginner commented 1 year ago

ありがとうございます。 いったんMeCabとipadicをアンインストールして整理した結果、自分のEC2環境では、

$ git clone https://github.com/taku910/mecab.git
$ cd mecab/mecab
$ ./configure --prefix=/usr/local --with-charset=utf8 --enable-utf8-only
$ sudo make install
$ cd ../mecab-ipadic/
$ ./configure --with-mecab-config=/usr/local/bin/mecab-config --prefix=/usr/local --with-charset=utf8
$ sudo make install
$ echo 'LD_LIBRARY_PATH="/usr/local/lib/"' >> ~/.bashrc
$ sudo vi /etc/ld.so.conf  # このファイルに/usr/local/lib/を追記
$ sudo ldconfig  # ld.so.confを反映

というふうにすると、bashからMeCabを使うことができ、またRMeCabのインストールもうまく行きました。 パターンを変えて検証しましたが、最後の3行は全部実行しないと、RMeCabのインストール時に libmecab.so.2: cannot open shared object file: No such file or directory のエラーがでるという状況でした。

IshidaMotohiro commented 1 year ago

この件ですが --prefix 指定はいらないと思います。最初に 「ちなみにlibmecab.so.2というファイルは、/usr/src/mecab/mecab/src/.libs/libmecab.so.2 という位置にありました。」 と書かれていたのは、ライブラリの「インストール先」ではなく、「ビルドした場所」ということですね。 「$ cd /usr/src」 をソースファイルの取得直前に実行されていることに、今気がつきました。

StatsBeginner commented 1 year ago

なるほど、ありがとうございます。

IshidaMotohiro commented 1 year ago

それでは、本Issueはクローズします。

ちなみに以下ですが、前者は個人アカウントでのライブラリパス指定で、後者はシステム全体でのパス指定です。前者を反映させるには、ログインし直すか、一旦ログアウトするのを避けたければ export なり source なりのコマンドを実行する必要があります。

$ echo 'LD_LIBRARY_PATH="/usr/local/lib/"' >> ~/.bashrc
$ sudo vi /etc/ld.so.conf  && sudo ldconfig # このファイルに/usr/local/lib/を追記