RustでMecabを使う2019版



## 概要


[mecab-rs](https://github.com/tsurai/mecab-rs)を使って
__rust__から__mecab__を使います。

※[tsurai](https://github.com/tsurai)様へ感謝

過去記事@nacika_ins さんの[「RustでMecabを使う」](https://qiita.com/nacika_ins/items/112621bcb2c751e1c0ac)がありますが、
*mecab-rs*がアップデートしておりましたので、現行版の内容になります
@nacika_ins さんの[「RustでMecabを使う」](https://qiita.com/nacika_ins/items/112621bcb2c751e1c0ac)


## 環境

AWS Cloud9環境を利用しています

```bash
$ cat /proc/version
Linux version 4.15.0-1039-aws (buildd@lgw01-amd64-034) 
(gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) 
#41-Ubuntu SMP Wed May 8 10:43:54 UTC 2019

$ uname -a
Linux ip-10-0-0-183 4.15.0-1039-aws 
#41-Ubuntu SMP Wed May 8 10:43:54 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ rustc -V
rustc 1.31.0

$ cargo -V
cargo 1.31.0
```


## mecabをインストールします

私の過去記事で__mecab__

[AWS Cloud9上にMecabでwikipediaコーパスを作る.](https://qiita.com/peace098beat/items/73329c4f3cc4b3780245)

https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md

```bash
$ sudo apt-get install -y mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file
```

linuxにmecabを入れていないと以下のエラーがでていました。

```bash
 $ cargo test
   Compiling rhymer v0.1.0 (/home/ubuntu/environment/mecab-rust/rhymer)                                                                                                                                              
error: linking with `cc` failed: exit code: 1                                                                                                                                                                        
  |                                                                                                                                                                                                                  
  = note: "cc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-m64" "-L" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/rhymer-def49fe1f493c6eb.1ckh1upghcr7dlx3.rcgu.o" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/rhymer-def49fe1f493c6eb.1nkz9y8v4z5zdvlu.rcgu.o" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/rhymer-def49fe1f493c6eb.33c5z1l5iahwt2ss.rcgu.o" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/rhymer-def49fe1f493c6eb.36mrly56r9re528c.rcgu.o" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/rhymer-def49fe1f493c6eb.3fne5ye42aq7wbu2.rcgu.o" "-o" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/rhymer-def49fe1f493c6eb" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/rhymer-def49fe1f493c6eb.9ur1w24r671d1b7.rcgu.o" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-nodefaultlibs" "-L" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps" "-L" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libtest-7b7de44f2059856e.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libterm-d52c1292e26095b2.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgetopts-c841b0c87957fc96.rlib" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/libmecab-2cc58dc190cd00e8.rlib" "/home/ubuntu/environment/mecab-rust/rhymer/target/debug/deps/liblibc-d3b902f693b2e7e2.rlib" "-Wl,--start-group" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-b86dd14ec2a0d983.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-1b18d2264cdcfb63.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-1b5c2dfdb82695d0.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc_system-26bd5d3525ea0442.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-c9c2dcd46cb83871.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-a6f391ba72d3983c.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-c3c7fd873a618632.rlib" "-Wl,--end-group" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-7b34a893930d7f9b.rlib" "-Wl,-Bdynamic" "-lmecab" "-lutil" "-lutil" "-ldl" "-lrt" "-lpthread" "-lgcc_s" "-lc" "-lm" "-lrt" "-lpthread" "-lutil" "-lutil"
  = note: /usr/bin/ld: cannot find -lmecab                                                                                                                                                                           
          collect2: error: ld returned 1 exit status                                                                                                                                                                 
  ↑ ※ どうもlmecabが見つからないためコンパイルエラーになっている                                                                                                                                                                                                                   
                                                                                                                                                                                                                     
error: aborting due to previous error                                                                                                                                                                                
                                                                                                                                                                                                                     
error: Could not compile `rhymer`.                                                                                                                                                                                   

To learn more, run the command again with --verbose.
```



## 実行テスト

あとは*mecab-rs*のサンプルをうごかします

Cargo.toml

```toml
[dependencies]
mecab = "*"
```

main.rs

```rust
extern crate mecab;

use mecab::Tagger;

fn main() {
  let input = "太郎は次郎が持っている本を花子に渡した。";
  println!("INPUT: {}", input);

  let mut tagger = Tagger::new("");

  // gets tagged result as String
  let mut result = tagger.parse_str(input);
  println!("RESULT: {}", result);

  // gets N best results as String
  result = tagger.parse_nbest(3, input);
  println!("NBEST:\n{}", result);

  // gets N best in sequence
  tagger.parse_nbest_init(input);
  for i in 0..3 {
    if let Some(res) = tagger.next() {
      println!("{}:\n{}", i, res);
    }
  }

  // gets Node object
  for node in tagger.parse_to_node(input).iter_next() {
    match node.stat as i32 {
      mecab::MECAB_BOS_NODE => {
        print!("{} BOS ", node.id);
      },
      mecab::MECAB_EOS_NODE => {
        print!("{} EOS ", node.id);
      },
      _ => {
        print!("{} {} ", node.id, &(node.surface)[..(node.length as usize)]);
      }
    }

    println!("{} {} {} {} {} {} {} {} {} {} {} {} {}",
      node.feature,
      input.len() as isize - node.surface.len() as isize,
      input.len() as isize - node.surface.len() as isize  + node.length as isize,
      node.rcattr,
      node.lcattr,
      node.posid,
      node.char_type,
      node.stat,
      node.isbest,
      node.alpha,
      node.beta,
      node.prob,
      node.cost);
  }

  // dictionary info
  for dict in tagger.dictionary_info().iter() {
    println!("\nfilename: {}", dict.filename);
    println!("charset: {}", dict.charset);
    println!("size: {}", dict.size);
    println!("type: {}", dict.dict_type);
    println!("lsize: {}", dict.lsize);
    println!("rsize: {}", dict.rsize);
    println!("version: {}", dict.version);
  }
}
```

結果

```bash
$ cargo run
   Compiling rhymer v0.1.0 (/home/ubuntu/environment/mecab-rust/rhymer)                                                                                                                                              
    Finished dev [unoptimized + debuginfo] target(s) in 0.34s                                                                                                                                                        
     Running `target/debug/rhymer`
INPUT: 太郎は次郎が持っている本を花子に渡した。
RESULT: EOS

NBEST:
EOS

0:
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
次郎    名詞,固有名詞,人名,名,*,*,次郎,ジロウ,ジロー
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
持っ    動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
いる    動詞,非自立,*,*,一段,基本形,いる,イル,イル
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
花      名詞,一般,*,*,*,*,花,ハナ,ハナ
子      名詞,接尾,一般,*,*,*,子,コ,コ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

1:
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
次郎    名詞,固有名詞,人名,名,*,*,次郎,ジロウ,ジロー
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
持っ    動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
いる    動詞,非自立,*,*,一段,基本形,いる,イル,イル
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
花子    名詞,固有名詞,人名,名,*,*,花子,ハナコ,ハナコ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

2:
太郎    名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
次      接頭詞,名詞接続,*,*,*,*,次,ジ,ジ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ
持っ    動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ
て      助詞,接続助詞,*,*,*,*,て,テ,テ
いる    動詞,非自立,*,*,一段,基本形,いる,イル,イル
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
花      名詞,一般,*,*,*,*,花,ハナ,ハナ
子      名詞,接尾,一般,*,*,*,子,コ,コ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

0 BOS BOS/EOS,*,*,*,*,*,*,*,* 0 0 0 0 0 0 2 true 0 0 0 0
6 太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー 0 6 1291 1291 44 2 0 true 0 0 0 8614
8 は 助詞,係助詞,*,*,*,*,は,ハ,ワ 6 9 261 261 16 6 0 true 0 0 0 9699
15 次郎 名詞,固有名詞,人名,名,*,*,次郎,ジロウ,ジロー 9 15 1291 1291 44 2 0 true 0 0 0 20566
18 が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 15 18 148 148 13 6 0 true 0 0 0 21070
22 持っ 動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ 18 24 742 742 31 2 0 true 0 0 0 25702
28 て 助詞,接続助詞,*,*,*,*,て,テ,テ 24 27 307 307 18 6 0 true 0 0 0 24174
40 いる 動詞,非自立,*,*,一段,基本形,いる,イル,イル 27 33 919 919 33 6 0 true 0 0 0 24723
50 本 名詞,一般,*,*,*,*,本,ホン,ホン 33 36 1285 1285 38 2 0 true 0 0 0 29905
53 を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 36 39 156 156 13 6 0 true 0 0 0 29095
55 花 名詞,一般,*,*,*,*,花,ハナ,ハナ 39 42 1285 1285 38 2 0 true 0 0 0 33000
59 子 名詞,接尾,一般,*,*,*,子,コ,コ 42 45 1298 1298 51 2 0 true 0 0 0 39627
65 に 助詞,格助詞,一般,*,*,*,に,ニ,ニ 45 48 151 151 13 6 0 true 0 0 0 39654
77 渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ 48 54 735 735 31 2 0 true 0 0 0 42751
86 た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 54 57 435 435 25 6 0 true 0 0 0 41874
89 。 記号,句点,*,*,*,*,。,。,。 57 60 8 8 7 3 0 true 0 0 0 38440
91 EOS BOS/EOS,*,*,*,*,*,*,*,* 60 60 0 0 0 0 3 true 0 0 0 36904

filename: /var/lib/mecab/dic/debian/sys.dic
charset: UTF-8
size: 392126
type: 0
lsize: 1316
rsize: 1316
version: 102
```

__mecab__が動いてるよ！

[@tsurai](https://github.com/tsurai)さん有難うございます。






<a href="https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Rust%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E9%96%8B%E7%99%BA%E6%89%8B%E6%B3%95%E3%81%BE%E3%81%A7-%CE%BAeen/dp/4297105594/ref=as_li_ss_il?_encoding=UTF8&psc=1&refRID=KADG0R1CJZD9Y07B3P7E&linkCode=li2&tag=peace098beat-22&linkId=52fef8a307968a1010a3375899274077&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4297105594&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=peace098beat-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=peace098beat-22&language=ja_JP&l=li2&o=9&a=4297105594" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

※あと自転車本がすごい良書なので、宣伝もかねアフェっときます



[実践Rust入門[言語仕様から開発手法まで] 単行本（ソフトカバー） – 2019/5/8](https://amzn.to/2VdAQ6y)