LoginSignup
11
5

More than 3 years have passed since last update.

RustでMecabを使う2019版

Last updated at Posted at 2019-05-19

概要

mecab-rsを使って
rustからmecabを使います。

tsurai様へ感謝

過去記事@nacika_ins さんの「RustでMecabを使う」がありますが、
mecab-rsがアップデートしておりましたので、現行版の内容になります
@nacika_ins さんの「RustでMecabを使う」

環境

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

$ 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コーパスを作る.

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

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

 $ 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

[dependencies]
mecab = "*"

main.rs

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);
  }
}

結果

$ 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さん有難うございます。

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

実践Rust入門[言語仕様から開発手法まで] 単行本(ソフトカバー) – 2019/5/8

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5