1 // -*- coding: viscii -*-
10 #include <boost/format.hpp>
11 #include "propername.h"
15 void dag_to_dot(ostream
&os
,Lattice
&w2
,DAG
&dag
,bool edge_value
);
16 void dag2_to_dot(ostream
&os
,Lattice
&w2
,WordDAG2
&dag
,bool edge_value
);
17 void print_all_words(const Lattice
&words
);
19 int main(int argc
,char **argv
)
25 bool edge_value
= false;
27 for (int i
= 1;i
< argc
;i
++) {
28 if (!strcmp(argv
[i
],"nofuzzy")) fuzzy
= false;
29 else if (!strcmp(argv
[i
],"bellman")) bellman
= true;
30 else if (!strcmp(argv
[i
],"trigram")) trigram
= true;
31 else if (!strcmp(argv
[i
],"dot")) dot
= true;
32 else if (!strcmp(argv
[i
],"edge")) edge_value
= true;
37 cerr
<< "Loading... ";
38 warch
.load("wordlist");
39 File
f("ngram","rt",0);
42 cerr
<< "done" << endl
;
44 get_sarch().set_blocked(true);
50 get_root()->save("wordlist2.wl");
51 cerr << "done" << endl;
54 //wfst.set_wordlist(get_root());
55 vector
<Sentence
> sentences
;
58 while (getline(cin
,s
)) {
61 sentences_split(s
,ss
);
62 //sentences.push_back(Sentence(s));
63 //Sentence &st = sentences.back();
64 for (int i
= 0;i
< ss
.size();i
++) {
65 //cout << ss[i] << endl;
69 if (!st
.get_syllable_count())
73 WordStateFactories factories
;
74 ExactWordStateFactory exact
;
75 LowerWordStateFactory lower
;
76 UpperWordStateFactory upper
;
77 FuzzyWordStateFactory ffuzzy
;
78 factories
.push_back(&exact
);
79 factories
.push_back(&lower
);
81 factories
.push_back(&upper
);
82 factories
.push_back(&ffuzzy
);
84 words
.pre_construct(st
,wes
,factories
);
85 mark_proper_name(st
,wes
);
86 words
.post_construct(wes
);
87 Segmentation
seg(words
.we
);
90 wfst.segment_best_no_fuzzy(words,seg);
92 wfst.segment_best(words,seg);
99 dagw2
= new WordDAG2(&dagw
);
104 dag2_to_dot(cout
,words
,*dagw2
,edge_value
);
106 dag_to_dot(cout
,words
,*dag
,edge_value
);
110 wfst
.search(*dag
,path
);
113 wfst
.search(*dag
,path
);
116 ((WordDAG2
*)dag
)->demangle(path
);
117 delete (WordDAG2
*)dag
;
119 seg
.resize(path
.size()-2);
120 copy(path
.begin()+1,path
.end()-1,seg
.begin());
121 seg
.pretty_print(cout
,st
) << endl
;
123 // sarch.clear_rest();
131 void dag_to_dot(ostream
&os
,Lattice
&w2
,DAG
&dag
,bool edge_value
)
134 const Sentence
&st
= *w2
.st
;
135 WordEntries
&wes
= *w2
.we
;
136 n
= dag
.node_count();
137 os
<< "digraph wordlattice {" << endl
;
138 os
<< "\trankdir=LR;" << endl
;
139 os
<< "\tstyle=invis;" << endl
;
141 for (i
= 0;i
< n
;i
++) {
143 label
= get_sarch()[dag
.node_id(i
)];
145 wes[i].node.node->get_syllables(syll);
146 for (std::vector<strid>::size_type ii = 0;ii < syll.size();ii ++) {
150 if (sy.parse(get_sarch()[syll[ii]]))
153 os << get_sarch()[syll[ii]];
156 os
<< "\tn" << i
<< "[label=\"" << label
<< ";" << i
<< "\"];" << endl
;
164 done
.resize(dag
.node_count());
166 nexts
.push_back(dag
.node_begin());
167 while (i
< (l
= nexts
.size())) {
173 dag
.get_next(v
,nexts
);
175 for (ii
= l
;ii
< nn
;ii
++) {
177 os
<< "\tn" << v
<< " -> n" << nexts
[ii
] << "[label=\"" << dag
.edge_value(v
,nexts
[ii
]) << "\"];" << endl
;
179 os
<< "\tn" << v
<< " -> n" << nexts
[ii
] << ";" << endl
;
187 void dag2_to_dot(ostream
&os
,Lattice
&w2
,WordDAG2
&dag
,bool edge_value
)
190 const Sentence
&st
= *w2
.st
;
191 WordEntries
&wes
= *w2
.we
;
192 n
= dag
.node_count();
193 WordDAG
*wdag
= dag
.get_dag();
194 os
<< "digraph wordlattice {" << endl
;
195 os
<< "\trankdir=LR;" << endl
;
196 os
<< "\tstyle=invis;" << endl
;
198 for (i
= 0;i
< n
;i
++) {
201 if (i
== dag
.node_begin() || i
== dag
.node_end())
202 label
= get_sarch()[dag
.node_id(i
)];
204 dag
.node_dag_edge(i
,n1
,n2
);
205 label
= get_sarch()[wdag
->node_id(n1
)];
206 label
+= string(" ");
207 label
+= get_sarch()[wdag
->node_id(n2
)];
209 os
<< "\tn" << i
<< "[label=\"" << label
<< ";" << i
<< "\"];" << endl
;
216 done
.resize(dag
.node_count());
218 nexts
.push_back(dag
.node_begin());
219 while (i
< (l
= nexts
.size())) {
225 dag
.get_next(v
,nexts
);
227 for (ii
= l
;ii
< nn
;ii
++) {
229 os
<< "\tn" << v
<< " -> n" << nexts
[ii
] << "[label=\"" << dag
.edge_value(v
,nexts
[ii
]) << "\"];" << endl
;
231 os
<< "\tn" << v
<< " -> n" << nexts
[ii
] << ";" << endl
;