/
collect-nouns.rs
65 lines (52 loc) · 1.51 KB
/
collect-nouns.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
extern mod std;
extern mod mecab;
use std::arc;
use mecab::IMeCabNode;
use mecab::MeCabLattice;
use mecab::NOR_NODE;
use mecab::UNK_NODE;
fn collect_nouns(lattice: &MeCabLattice) -> ~[~str] {
let mut v = ~[];
let node = lattice.get_bos_node();
for node.each |n| {
let status = n.get_status();
if status == NOR_NODE || status == UNK_NODE {
let feature = n.get_feature();
for feature.each_split_char(',') |s| {
if s == "名詞" { v.push(n.get_surface()); }
break;
}
}
}
return v;
}
fn main() {
let sentences = [
"これはテストです",
"太郎は次郎が持っている本を花子に渡した",
"昨日の夕食はカレーでした",
];
let model = mecab::model_new2("");
let model = ~arc::ARC(model);
let (p, c) = comm::stream();
let c = comm::SharedChan(c);
for sentences.each |&sentence| {
let model = ~arc::clone(model);
let c = c.clone();
do task::spawn_supervised {
let model = arc::get(model);
let tagger = model.create_tagger();
let lattice = model.create_lattice();
lattice.set_sentence(sentence);
if tagger.parse_lattice(&lattice) {
c.send(collect_nouns(&lattice));
}
}
}
for sentences.len().times {
let nouns = p.recv();
for nouns.each |noun| {
io::println(fmt!("noun: %s", *noun));
}
}
}