首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从FST存档(FAR)创建FSTs的联合?

如何从FST存档(FAR)创建FSTs的联合?
EN

Stack Overflow用户
提问于 2013-01-04 21:37:37
回答 1查看 1.2K关注 0票数 1

我目前有一个(自然语言)语料库,这些都是已经采取的步骤:

  1. 将语料库连接成一个大文件后生成符号表: $ ngramsymbols符号corpus.syms
  2. 给定此符号表,将语料库转换为二进制FST存档(FAR): $far编译程序字符串-symbols=corpus.syms -keep_symbols=1 corpus.txt > corpus.far

我想要得到所有FSTs在远端的联合,并计算出从开始状态到最终状态的最高权重路径。为了从shell中进行测试,我做了以下工作:

代码语言:javascript
复制
$ farextract corpus.far # generates fst files corpus-01, corpus-02, ...
$ fstarcsort --sort_type=olabel corpus.txt-01 1.fst
$ fstarcsort --sort_type=ilabel corpus.txt-02 2.fst
$ fstunion 1.fst 2.fst 12.fst

但我经常遇到以下错误:

警告: CompatSymbols:出现第一个符号表,但第二个符号表丢失 错误: Union:第一个参数的输入/输出符号表与第二个参数的输入/输出符号表不匹配

当然,如果我尝试运行二进制操作而不首先对FST排序,这个错误就会持续存在。

我觉得我对FSTs的排序不正确,或者.我完全误解了如何使用符号表。你知道为什么联盟(或者任何其他二进制操作)是这样失败的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-06 10:40:07

当您从远程存档中提取组件时,符号表将从存档中附加到第一个fst。当组合FST时,嵌入到各个FST中的符号表需要相互匹配。例如,联合操作需要跨组件的输入符号彼此相同,跨组件的输出符号彼此相同。组合需要左边机器的输出符号来匹配右侧机器的输入符号。

可以使用fst符号命令清除FST中的符号:

代码语言:javascript
复制
fstsymbols --clear_isymbols ---clear_osymbols with-syms.fst > no-syms.fst

从corpu.txt-01中移除符号应该可以解决这个问题。或者,您可以在不使用-- without _符号标志的情况下编译far文件。

对于union命令,在梳理它们之前,不需要从组件机器中对弧进行排序,但是通常需要在组合它们之前对它们进行排序。

如果您的文本语料库很大,您可能会发现直接使用C++接口或其他绑定(如皮弗斯特 )从文本文件直接构造联合的FST要快得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14165408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档