概要
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さん有難うございます。
※あと自転車本がすごい良書なので、宣伝もかねアフェっときます