Execise Data files
样例中需要的数据来源:
http://www.openfst.org/twiki/bin/view/FST/FstExamples
如果无法访问,可以在这里下载
Execise 1 Tokenization
第一个示例将ASCII字符序列转换为带有标点符号和去除空格的单词标记序列。 为此,我们将需要一个词典换能器,该词典换能器将从字母映射到其对应的单词标记。 一种简单的生成方式是使用OpenFst文本格式。 例如,“Mars”一词的格式为:
fstcompile --isymbols=ascii.syms --osymbols=wotw.syms >Mars.fst <<EOF
0 1 M Mars
1 2 a <epsilon>
2 3 r <epsilon>
3 4 s <epsilon>
4
EOF
如果出现错误提示
file = ascii.syms, line = 1Bad non-negative integer "0
,可能的原因是ascii.syms文件和wotw.syms文件的格式是dos格式的。需要执行
set ff=unix
Mars.fst是二进制文件,是不可以直接阅读的。一般可以通过工具转成图像来看。
fstdraw --isymbols=ascii.syms --osymbols=wotw.syms -portrait Mars.fst | dot -Tjpg >Mars.jpg
dot: command not found…
如果出现该命令不存在,需要去下载一下graphviz
转成的fst图片如下,
再来两个例子
“Martian”和“Man”按照上面的方法构建fst文件
Martian.fst
fstcompile --isymbols=ascii.syms --osymbols=wotw.syms >Martian.fst <<EOF
0 1 M Martian
1 2 a <epsilon>
2 3 r <epsilon>
3 4 t <epsilon>
4 5 i <epsilon>
5 6 a <epsilon>
6 7 n <epsilon>
7
EOF
Man.fst
fstcompile --isymbols=ascii.syms --osymbols=wotw.syms >Man.fst <<EOF
0 1 M Man
1 2 a <epsilon>
2 3 n <epsilon>
3
EOF
合并这三个fst,并生成lexicon.fst
fstunion Man.fst Mars.fst | fstunion - Martian.fst | fstclosure >lexicon.fst
fstdraw --isymbols=ascii.syms --osymbols=wotw.syms -portrait lexicon.fst | dot -Tps >lexicon.ps
生成的图像如下,
去除epsilon的Arc
fstrmepsilon lexicon.fst | fstdeterminize | fstminimize >lexicon_opt.fst
fstdraw --isymbols=ascii.syms --osymbols=wotw.syms -portrait lexicon_opt.fst | dot -Tps >lexicon_opt.ps
生成等效的,确定的和最小的状态转换图
增加对符号的处理,
full_pinct.fst
0 1 <space> <epsilon>
0 1 ! <epsilon>
0 1 " <epsilon>
0 1 # <epsilon>
0 1 $ <epsilon>
0 1 % <epsilon>
0 1 & <epsilon>
0 1 ' <epsilon>
0 1 ( <epsilon>
0 1 ) <epsilon>
0 1 * <epsilon>
0 1 + <epsilon>
0 1 , <epsilon>
0 1 - <epsilon>
0 1 . <epsilon>
0 1 / <epsilon>
0 1 0 <epsilon>
0 1 1 <epsilon>
0 1 2 <epsilon>
0 1 3 <epsilon>
0 1 4 <epsilon>
0 1 5 <epsilon>
0 1 6 <epsilon>
0 1 7 <epsilon>
0 1 8 <epsilon>
0 1 9 <epsilon>
0 1 : <epsilon>
0 1 ; <epsilon>
0 1 < <epsilon>
0 1 = <epsilon>
0 1 > <epsilon>
0 1 ? <epsilon>
0 1 @ <epsilon>
0 1 [ <epsilon>
0 1 \ <epsilon>
0 1 ] <epsilon>
0 1 ^ <epsilon>
0 1 _ <epsilon>
0 1 ` <epsilon>
0 1 { <epsilon>
0 1 | <epsilon>
0 1 } <epsilon>
0 1 ~ <epsilon>
1
加入符号处理
fstunion Man.fst Mars.fst | fstunion - Martian.fst | fstconcat - full_punct.fst | fstclosure >lexicon.fst
Tokenization
好,现在开始Tokenization,词语切分。
假设我们有“Mars man!”这个词,
来先写出它的fst
fstcompile --isymbols=ascii.syms --osymbols=ascii.syms > Mars_man_.fst <<EOF
0 1 M M
1 2 a a
2 3 r r
3 4 s s
4 5 <space> <space>
5 6 m m
6 7 a a
7 8 n n
8 9 ! !
9
EOF
画出图形
fstdraw --isymbols=ascii.syms --osymbols=ascii.syms -portrait Mars_man_.fst | dot -Tps > Mars_man_.ps
提取词
fstcompose Mars_man_.fst lexicon_opt.fst | fstproject --project_output | fstrmepsilon >tokens.fst