【问题标题】:How to create a union of FSTs from an FST archive (FAR)?如何从 FST 存档 (FAR) 创建 FST 联合?
【发布时间】:2013-01-04 21:37:37
【问题描述】:

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

  1. 将语料拼接成一个大文件后生成符号表:

    $ ngramsymbols <corpus.txt >corpus.syms
    
  2. 给定这个符号表,将语料库转换为二进制 FST 存档 (FAR):

    $ farcompilestrings -symbols=corpus.syms -keep_symbols=1 corpus.txt > corpus.far
    

我想取 FAR 中所有 FST 的并集,并计算从起始状态到最终状态的最高权重路径。要从 shell 进行测试,这就是我所做的:

$ 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:第一个符号表存在但第二个缺失

错误:联合:第一个参数的输入/输出符号表与第二个参数的输入/输出符号表不匹配

当然,如果我尝试运行二进制操作而不首先对 FST 进行排序,则此错误仍然存​​在。

我认为我没有正确排序 FST,或者......我完全误解了如何使用符号表。知道为什么联合(或任何其他二进制操作)会这样失败吗?

【问题讨论】:

    标签: nlp finite-automata automata state-machine


    【解决方案1】:

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

    您可以使用 fstsymbols 命令从 FST 中清除符号:

    fstsymbols --clear_isymbols ---clear_osymbols with-syms.fst > no-syms.fst
    

    从 corpus.txt-01 中删除符号应该可以解决这个问题。或者,您可以编译没有 --keep_symbol 标志的 far 文件。

    对于 union 命令,您不需要在组合之前对来自组件机器的弧进行排序,但是您通常需要在组合它们之前对其进行排序。

    如果您的文本语料库很大,您可能会发现直接构建会更快 使用 C++ 接口或其他一些绑定(例如 pyfst)直接从文本文件中联合 FST。

    【讨论】:

    • 谢谢你,保罗。我现在明白联合不需要排序。但是,您能否也告诉我如何指定符号表应附加到 far 中的每个 fst,而不仅仅是第一个?我的理解是清除符号会起作用,但输出在理论上可能不正确。
    • 您可以使用 fstsymbols --isymbols= 命令添加符号。清除符号应该是正确的,因为联合不会更改任何标签,并且所有机器都使用通用符号表(使用 farcompilestrings)构建。在合并所有内容后,将符号表添加到最终的 FST 可能更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多