1

私は現在(自然言語の)コーパスを持っています、そしてこれらはすでにとられたステップです:

  1. コーパスを1つの大きなファイルに連結した後、シンボルテーブルを生成しました。

    $ ngramsymbols <corpus.txt >corpus.syms
    
  2. このシンボルテーブルを前提として、コーパスをバイナリFSTアーカイブ(FAR)に変換します。

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

FAR内のすべてのFSTの和集合を取得し、開始状態から最終状態までの最大重みパスを計算したいと思います。シェルからテストするために、これは私がしたことです:

$ 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:最初のシンボルテーブルは存在しますが、2番目は欠落しています

エラー:ユニオン:1番目の引数の入力/出力シンボルテーブルが2番目の引数の入力/出力シンボルテーブルと一致しません

もちろん、このエラーは、最初にFSTをソートせずに2項演算を実行しようとすると発生します。

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 に答える