1

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

  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,或者......我完全误解了如何使用符号表。知道为什么联合(或任何其他二进制操作,就此而言)会这样失败吗?

4

1 回答 1

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 会更快。

于 2013-01-06T10:40:07.330 回答