FST基本操作
来源:互联网 发布:道路照度计算软件 编辑:程序博客网 时间:2024/05/16 08:08
与上一篇一样,FST操作也可以通过C++代码和shell命令行两种方式进行操作。继续分别介绍
1、在C++代码中调用FST的方法进行操作
FST中的几个基本的抽象类模板
- Fst 支持基本的fst的操作
- ExpandedFst 额外增加了NumStates()方法
- MutableFst 增加了几种操作的变种比如AddStates()和SetStart()
Fst中的几种非抽象类模板
- VectorFst
- ConstFst
- ComposeFst
FST的C++操作一般有三种形式:
(1) Destructive:例如 Connect操作, 会改变其输入
void Connect(MutableFst<Arc> *fst);
(2)Constructive:例如Reverse操作, 创建一个新的expanedFst
void Reverse(const Fst<Arc> &infst, MutableFst<Arc> *outfst);
(3)Delayed: 例如ComposeFst,创建一个unexpectedFst
ComposeFst<Arc>(const Fst<Arc> &fst1, const Fst<Arc> &fst2);
2、shell操作fst, 使用C++编写好的命令进行操作,参数包括输入和输出的fst,如果没有则为标准输入输出
- Unary Operations fstunaryop in.fst out.fst fstunaryop <in.fst >out.fst - Binary Operation fstbinaryop in1.fst in2.fst out.fst fstbinaryop - in2.fst <in1.fst >out.fst
3、WFST中最重要的Composition操作举例:
C++代码中:
#include <fst/fstlib.h>namespace fst { // 读取input.fst StdVectorFst *input = StdVectorFst::Read("input.fst"); // 读取另一个model.fst StdVectorFst *model = StdVectorFst::Read("model.fst"); // The FSTs must be sorted along the dimensions they will be joined. // In fact, only one needs to be so sorted. // This could have instead been done for "model.fst" when it was created. // 只需要给model.fst排序即可 ArcSort(input, StdOLabelCompare()); ArcSort(model, StdILabelCompare()); // Container for composition result. //定义合成的composition的fst StdVectorFst result; // Creates the composed FST. // 进行compose操作 输入input, model, 输出result Compose(*input, *model, &result); // Just keeps the output labels. Project(&result, PROJECT_OUTPUT); // Writes the result FST to a file. // 保存result.fst result.Write("result.fst");}
shell中进行compose操作,过程与C++中的一致:
$ fstarcsort --sort_type=olabel input.fst input_sorted.fst$ fstarcsort --sort_type=ilabel model.fst model_sorted.fst$ fstcompose input_sorted.fst model_sorted.fst comp.fst$ fstproject --project_output comp.fst result.fst# 直接通过一个管道操作$ fstarcsort --sort_type=ilabel model.fst | fstcompose input.fst - | fstproject --project_output result.fst
4、常用的FST操作
参考官网 http://www.openfst.org/twiki/bin/view/FST/FstQuickTour
5、FST的一些定义:
权重的计算都定义在一个Weight类型中,包括半环的加操作Plus(x, y)和乘操作Times(x, y),静态成员函数Zero(), One()代表加操作和乘操作的幺元。加操作用来计算两条可选的路劲。比如Tropical半环的加操作为min(x, y),表示选择路径权重小的作为新的权重。乘操作是在于一条路径上上计算匹配的路径,包括composition操作。当且仅当一个状态的权重不为加操作的幺元时才能作为终止状态。同理,一条路径的权重也不能使加操作的幺元。不然这条路劲就没有任何意义。与幺元进行加操作等于其本身。
到这基本了解了FST的一些基本的用法。现在总结一下。一个WFST包含的东西应该有状态集合,转移结合,输入label,输出label,权重。
定义一个stdvectorFst 要对其添加状态addstate(), 添加转移addarc(), 而输出label和输入label以及权重都是保存在一个类中。这个类就是我们之前一直看到的Arc。这个类保存了输入label,输出label和权重信息。是FST中最关键的一个类。我们再来复习一下这个类的声明:
StdFst *fst = StdFst::Read("binary.fst")//Here is the standard representation of an arc:struct StdArc { typedef int Label; typedef TropicalWeight Weight; // see "FST Weights" below typedef int StateId; Label ilabel; //输入label,其实就是一个int类型,因为label已经转化为对应的数值了 Label olabel; //输出label Weight weight; //从上面的定义中看出是一个满足Tropical半环计算的Weight类型的权重 StateId nextstate; //到达的状态id,也是int类型};
所以在之后看到Label类型和StateId类型都不需要慌张,它们都是int类型,都是转化的数字。
- FST基本操作
- fst
- Fst指数
- FST树
- lucene与fst
- 群体遗传学--Fst指数
- 群体遗传学--Fst指数
- 求fst的模板程序
- 基本操作
- 基本操作
- 基本操作
- 基本操作
- 基本操作
- 基本操作
- sparkSQL操作基本操作
- gitlab基本一些基本操作
- Matlab 基本命令、基本操作
- java快速序列化库FST
- 2014-01-01-codeblock无法运行
- C++对象和类概念
- 快递鸟电子面单接口-电子面单解析方法
- 【Codevs1225】 八数码难题 BFS (1/1000)
- 使用Speedment实现事务处理
- FST基本操作
- 2014-03-06-codeblock中文乱码
- Java并发学习(四)-sun.misc.Unsafe
- 深度 | 苹果博客解读iPhone上的人脸识别深度神经网络
- C++基础知识
- Java Swing ~01
- elasticsearch mysql增量同步时区问题解决
- Android左右滑动标签页
- hdu-1686-Oulipo(KMP)