読者です 読者をやめる 読者になる 読者になる

/var/log/study

つまり雑記

OSX上のHaskell stackでMecabを扱う方法

本文章は以下に書いてあることを抽出して纏めた記事である.

qiita.com

haru2036.hatenablog.com

github.com

問題点

自分のOSX環境では、なぜかHaskellからMecabを利用することができなかった

解決できたサンプルリポジトリ

github.com

git clone https://github.com/shouhei/mecab-sample-hs.git
cd mecab-sample-hs
stack build
stack exec mecab-sample-hs-exe

以上を叩くと

隣      名詞,一般,*,*,*,*,隣,トナリ,トナリ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
客      名詞,一般,*,*,*,*,客,キャク,キャク
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
よく    副詞,一般,*,*,*,*,よく,ヨク,ヨク
柿      名詞,一般,*,*,*,*,柿,カキ,カキ
食う    動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
客      名詞,一般,*,*,*,*,客,キャク,キャク
だ      助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS

上記の様な出力になるはず

解決方法

stack.ymlを以下を追記する

packages:
- '.'
- location:
    git: git@github.com:morishin/hsmecab.git
    commit: 2da6677fbd42bb77d3b6e61c02edfeebe248e184
extra-include-dirs:
- /usr/local/Cellar/mecab/0.996/include/
extra-lib-dirs:
- /usr/local/Cellar/mecab/0.996/lib/

次にproject.cabalに以下を追記

library
  hs-source-dirs:      src
  exposed-modules:     Lib
  build-depends:       base >= 4.7 && < 5
                     , mecab
  default-language:    Haskell2010

でもって、 stack build すると問題なく使えるようになるはず

問題を時系列に追う

  1. stack でmecabがインストールできない
Could not parse '/path/to/mecab-sample/stack.yaml':
AesonException "failed to parse field 'packages': failed to parse field 'location': when expecting a PackageLocation, encountered Null instead"
See https://github.com/commercialhaskell/stack/wiki/stack.yaml.

tanakhさんの作ったmecabバインディングではダメらしい

qiita.com

  1. githubのforkを利用する

インストールは出来るんだけど、OSX的にダメらしい

haru2036.hatenablog.com

Enter passphrase for key '/Users/shouhei/.ssh/id_rsa':
Warning: File listed in mecab-sample.cabal file does not exist: README.md
mecab-0.4.0: configure
mecab-0.4.0: build
mecab-0.4.0: install
mecab-sample-0.1.0.0: configure
mecab-sample-0.1.0.0: build
Completed all
--  While building package mecab-sample-0.1.0.0 using:
      /path/to/.stack/programs/x86_64-osx/ghc-7.10.2/bin/runhaskell -package=Cabal-1.22.4.0 -clear-package-db -global-package-db -package-db=/path/to/.stack/snapshots/x86_64-osx/lts-3.13/7.10.2/pkgdb/ /var/folders/lk/jk8fbl3s4
qgc7fzz7r3wxn300000gn/T/stack28485/Setup.hs --builddir=.stack-work/dist/x86_64-osx/Cabal-1.22.4.0/ build exe:mecab-sample-exe --ghc-options -hpcdir .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/hpc/.hpc/ -ddump-hi -ddump-to-file
    Process exited with code: ExitFailure 1
    Logs have been written to: /path/to/mecab-sample/.stack-work/logs/mecab-sample-0.1.0.0.log

    Configuring mecab-sample-0.1.0.0...
    Preprocessing library mecab-sample-0.1.0.0...
    [1 of 1] Compiling Lib              ( src/Lib.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/Lib.o )
    In-place registering mecab-sample-0.1.0.0...
    Preprocessing executable 'mecab-sample-exe' for mecab-sample-0.1.0.0...
    [1 of 1] Compiling Main             ( app/Main.hs, .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/mecab-sample-exe/mecab-sample-exe-tmp/Main.o )
    Linking .stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/mecab-sample-exe/mecab-sample-exe ...
    Undefined symbols for architecture x86_64:
      "_mecab_get_all_morphs", referenced from:
          _cdn2_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_get_partial", referenced from:
          _cdly_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_get_theta", referenced from:
          _cdpg_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_set_all_morphs", referenced from:
          _cdSu_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_set_partial", referenced from:
          _cdWY_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
      "_mecab_set_theta", referenced from:
          _cdVy_info in libHSmecab-0.4.0-0HRiBJmaGDO9FQQzxhViZD.a(MeCab.o)
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
 2 action
  1. ググったらcabal install のときにパラメータを指定する必要があるとのこと 

  2. cabalのパラメータをstackで実現するには?

github.com

  1. ドキュメントをみて解決