Julius 4.2
関数
libjulius/src/search_bestfirst_main.c

第2パス:スタックデコーディング [詳細]

#include <julius/julius.h>

ソースコードを見る。

関数

static NODEget_best_from_stack (NODE **start, int *stacknum)
 スタックトップの最尤仮説を取り出す.
static int put_to_stack (NODE *new, NODE **start, NODE **bottom, int *stacknum, int stacksize)
 スタックに新たな仮説を格納する.
static void put_all_in_stack (NODE **start, int *stacknum, WORD_INFO *winfo)
 スタックの中身を全て出力する.
static void free_all_nodes (NODE *start)
 スタック内の全仮説を解放する.
static void put_hypo_woutput (NODE *hypo, WORD_INFO *winfo)
 デバッグ用に仮説の単語列を表示する.
static void put_hypo_wname (NODE *hypo, WORD_INFO *winfo)
 デバッグ用に仮説の単語N-gramエントリ名(Julianではカテゴリ番号)を出力する.
static NEXTWORD ** nw_malloc (int *maxlen, NEXTWORD **root, int max)
 次単語の格納領域の割り当て.
static void nw_free (NEXTWORD **nw, NEXTWORD *root)
 次単語の格納領域の解放.
static NEXTWORD ** nw_expand (NEXTWORD **nwold, int *maxlen, NEXTWORD **root, int num)
 次単語候補格納用の NEXTWORD 配列のメモリ領域を伸張する.
static int can_put_to_stack (NODE *new, NODE **bottom, int *stacknum, int stacksize)
 ある仮説がスタック内に格納されるかどうかチェックする.
static void wb_init (StackDecode *s)
 Word envelope 用にカウンタを初期化する.
static boolean wb_ok (StackDecode *s, NODE *now, int width)
 Word envelope を参照して,与えられた仮説を展開してよいかどうかを返す.
void segment_set_last_nword (NODE *hypo, RecogProcess *r)
 認識結果から,次の入力区間の認識を開始する際の初期単語履歴をセットする.
static void store_result_pass2 (NODE *hypo, RecogProcess *r)
 第2パスの結果として仮説を保存する.
static void result_reorder_and_output (NODE **r_start, NODE **r_bottom, int *r_stacknum, int ncan, RecogProcess *r, HTK_Param *param)
 スタックから上位の仮説を取り出し,認識結果として出力する.
void pass2_finalize_on_no_result (RecogProcess *r, boolean use_1pass_as_final)
 第2パスの解が得られない場合の終了処理
void wchmm_fbs (HTK_Param *param, RecogProcess *r, int cate_bgn, int cate_num)
 第2探索パスであるスタックデコーディングを行うメイン関数
void wchmm_fbs_prepare (RecogProcess *r)
 第2パス用のワークエリアを確保・初期化する.
void wchmm_fbs_free (RecogProcess *r)
 第2パス用のワークエリアを解放する.

説明

第2パス:スタックデコーディング

Julius の第2パスであるスタックデコーディングアルゴリズムが記述され ています. 第1パスの結果の単語トレリス情報を元に,第1パスとは逆向き の right-to-left に探索を行います. 仮説のスコアは、第1パスのトレリ スとそのスコアを未探索部のヒューリスティックとして接続することで, 文全体の仮説スコアを考慮しながら探索を行います.

次単語集合の取得のために,単語N-gramでは ngram_decode.c 内の関数が, 文法では dfa_decode.c の関数が用いられます.

作者:
Akinobu Lee
日付:
Thu Sep 08 11:51:12 2005
Revision:
1.11

search_bestfirst_main.c で定義されています。


関数

static NODE * get_best_from_stack ( NODE **  start,
int *  stacknum 
) [static]

スタックトップの最尤仮説を取り出す.

引数:
start[i/o] スタックの先頭ノードへのポインタ(書換えられる場合あり)
stacknum[i/o] 現在のスタックサイズへのポインタ(書き換えあり)
戻り値:
取り出した最尤仮説のポインタを返す.

search_bestfirst_main.c209 行で定義されています。

参照元 put_all_in_stack(), result_reorder_and_output(), と wchmm_fbs().

static int put_to_stack ( NODE new,
NODE **  start,
NODE **  bottom,
int *  stacknum,
int  stacksize 
) [static]

スタックに新たな仮説を格納する.

スタック内のスコア順を考慮した位置に挿入される. 格納できなかった場合,与えられた仮説は free_node() される.

引数:
new[in] チェックする仮説
start[i/o] スタックのトップノードへのポインタ
bottom[i/o] スタックの底ノードへのポインタ
stacknum[i/o] スタックに現在格納されているノード数へのポインタ
stacksize[in] スタックのノード数の上限
戻り値:
格納できれば 0 を,できなかった場合は -1 を返す.

search_bestfirst_main.c292 行で定義されています。

参照元 wchmm_fbs().

static void put_all_in_stack ( NODE **  start,
int *  stacknum,
WORD_INFO winfo 
) [static]

スタックの中身を全て出力する.

スタックの中身は失われる. (デバッグ用)

引数:
start[i/o] スタックのトップノードへのポインタ
stacknum[i/o] スタックに現在格納されているノード数へのポインタ
winfo[in] 単語辞書

search_bestfirst_main.c380 行で定義されています。

参照元 wchmm_fbs().

static void free_all_nodes ( NODE start) [static]

スタック内の全仮説を解放する.

引数:
start[i/o] スタックのトップノード

search_bestfirst_main.c405 行で定義されています。

参照元 result_reorder_and_output(), と wchmm_fbs().

static void put_hypo_woutput ( NODE hypo,
WORD_INFO winfo 
) [static]

デバッグ用に仮説の単語列を表示する.

引数:
hypo[in] 仮説
winfo[in] 単語辞書

search_bestfirst_main.c952 行で定義されています。

参照元 put_all_in_stack(), と wchmm_fbs().

static void put_hypo_wname ( NODE hypo,
WORD_INFO winfo 
) [static]

デバッグ用に仮説の単語N-gramエントリ名(Julianではカテゴリ番号)を出力する.

引数:
hypo[in] 仮説
winfo[in] 単語辞書

search_bestfirst_main.c980 行で定義されています。

参照元 wchmm_fbs().

static NEXTWORD** nw_malloc ( int *  maxlen,
NEXTWORD **  root,
int  max 
) [static]

次単語の格納領域の割り当て.

次単語候補を格納するための NEXTWORD 配列にメモリを割り付ける.

引数:
maxlen[out] 格納可能な単語数
root[out] 割り付け領域の先頭へのポインタ
max[in] 割り付ける領域のサイズ
戻り値:
割り付けられた次単語配列へのポインタを返す.

search_bestfirst_main.c86 行で定義されています。

参照元 wchmm_fbs().

static void nw_free ( NEXTWORD **  nw,
NEXTWORD root 
) [static]

次単語の格納領域の解放.

引数:
nw[in] NEXTWORD配列
root[in] nw_malloc() で与えられた領域先頭へのポインタ

search_bestfirst_main.c118 行で定義されています。

参照元 wchmm_fbs().

static NEXTWORD** nw_expand ( NEXTWORD **  nwold,
int *  maxlen,
NEXTWORD **  root,
int  num 
) [static]

次単語候補格納用の NEXTWORD 配列のメモリ領域を伸張する.

この関数は探索中に次単語候補集合が溢れた際に呼ばれ,配列により多くの 次単語候補を格納できるよう NEXTWORD の中身を realloc() する. 実際には最初に nw_malloc() で辞書の単語数分だけ領域を確保しており, 単語N-gram使用時は呼ばれることはない. 文法認識では,ショートポーズの スキップ処理により状態の異なる候補を同時に展開するので, 次単語数が語彙数よりも大きいことが起こりうる.

引数:
nwold[i/o] NEXTWORD配列
maxlen[i/o] 最大格納数を格納するポインタ. 現在の最大格納数を 入れて呼び,関数内で新たに確保された数に変更される.
root[i/o] 領域先頭へのポインタを格納するアドレス. 関数内で 書き換えられる.
num[in] 伸長する長さ
戻り値:
伸張された新たな次単語配列へのポインタを返す.

search_bestfirst_main.c163 行で定義されています。

参照元 wchmm_fbs().

static int can_put_to_stack ( NODE new,
NODE **  bottom,
int *  stacknum,
int  stacksize 
) [static]

ある仮説がスタック内に格納されるかどうかチェックする.

引数:
new[in] チェックする仮説
bottom[in] スタックの底ノードへのポインタ
stacknum[in] スタックに現在格納されているノード数へのポインタ
stacksize[in] スタックのノード数の上限
戻り値:
スタックのサイズが上限に達していないか,スコアが底ノードよりも よければ格納されるとして 0 を,それ以外であれば格納できないとして -1 を 返す.

search_bestfirst_main.c253 行で定義されています。

参照元 wchmm_fbs().

static void wb_init ( StackDecode s) [static]

Word envelope 用にカウンタを初期化する.

引数:
s[i/o] 第2パス用ワークエリア

search_bestfirst_main.c753 行で定義されています。

参照元 wchmm_fbs().

static boolean wb_ok ( StackDecode s,
NODE now,
int  width 
) [static]

Word envelope を参照して,与えられた仮説を展開してよいかどうかを返す.

また,Word envelope のカウンタを更新する.

引数:
s[i/o] 第2パス用ワークエリア
now[in] 今から展開しようとしている仮説
width[in] 展開カウントの上限値
戻り値:
展開可能(展開カウントが上限に達していない)なら TRUE, 展開不可能(カウントが上限に達している)なら FALSE を返す.

search_bestfirst_main.c787 行で定義されています。

参照元 wchmm_fbs().

void segment_set_last_nword ( NODE hypo,
RecogProcess r 
)

認識結果から,次の入力区間の認識を開始する際の初期単語履歴をセットする.

透過語および仮説の重複を考慮して初期単語履歴が決定される.

引数:
hypo[in] 現在の入力区間の認識結果としての文候補
r[in] 認識処理インスタンス

search_bestfirst_main.c908 行で定義されています。

参照元 pass2_finalize_on_no_result(), と result_reorder_and_output().

関数の呼び出しグラフ:

呼出しグラフ:

static void store_result_pass2 ( NODE hypo,
RecogProcess r 
) [static]

第2パスの結果として仮説を保存する.

引数:
hypo[in] hypothesis to save
r[in] recognition process instance

search_bestfirst_main.c1006 行で定義されています。

参照元 pass2_finalize_on_no_result(), と result_reorder_and_output().

static void result_reorder_and_output ( NODE **  r_start,
NODE **  r_bottom,
int *  r_stacknum,
int  ncan,
RecogProcess r,
HTK_Param param 
) [static]

スタックから上位の仮説を取り出し,認識結果として出力する.

さらに, スタックに格納されている全ての仮説を解放する.

得られた文候補は,いったん結果格納用のスタックに格納される. 探索終 了("-n" の数だけ文候補が見つかるか,探索が中断される)の後,結果的 に得られた文候補の中から上位N個("-output" で指定された数)の仮説を 出力する.

指定があればアラインメントもここで実行する.

引数:
r_start[i/o] 結果格納用スタックの先頭ノードへのポインタ
r_bottom[i/o] 結果格納用スタックの底ノードへのポインタ
r_stacknum[i/o] スタックに格納されているノード数へのポインタ
ncan[in] 出力する上位仮説数
r[in] 認識処理インスタンス
param[in] 入力パラメータ

search_bestfirst_main.c1088 行で定義されています。

参照元 wchmm_fbs().

void pass2_finalize_on_no_result ( RecogProcess r,
boolean  use_1pass_as_final 
)

第2パスの解が得られない場合の終了処理

第2パスが失敗した場合や第2パスが実行されない設定の場合の 認識終了処理を行う.use_1pass_as_final が TRUE のとき, 第1パスの結果を第2パスの結果としてコピーして格納し,認識成功とする. FALSE時は認識失敗とする. また,sp-segment 時は,次の認識区間用の初期仮説設定も第1パスの 結果から行う.

引数:
r[in] 認識処理インスタンス
use_1pass_as_final[in] TRUE 時第1パスの結果を第2パス結果に格納する

search_bestfirst_main.c1150 行で定義されています。

参照元 j_recognize_stream_core(), と wchmm_fbs().

void wchmm_fbs ( HTK_Param param,
RecogProcess r,
int  cate_bgn,
int  cate_num 
)

第2探索パスであるスタックデコーディングを行うメイン関数

引数のうち cate_bgn, cate_num は単語N-gramでは無視される.

引数:
param[in] 入力パラメータベクトル列
r[i/o] 認識処理インスタンス
cate_bgn[in] 展開対象とすべきカテゴリの開始番号
cate_num[in] 展開対象とすべきカテゴリの数

search_bestfirst_main.c1229 行で定義されています。

参照元 j_recognize_stream_core().

呼出しグラフ:

void wchmm_fbs_prepare ( RecogProcess r)

第2パス用のワークエリアを確保・初期化する.

ここで確保されるのは認識・パラメータに依らない値のみ.

引数:
r[i/o] 認識処理インスタンス

search_bestfirst_main.c2288 行で定義されています。

参照元 j_launch_recognition_instance().

void wchmm_fbs_free ( RecogProcess r)

第2パス用のワークエリアを解放する.

ここで解放されるのは認識・パラメータに依らない値のみ.

引数:
r[i/o] 認識処理インスタンス

search_bestfirst_main.c2330 行で定義されています。

参照元 j_recogprocess_free().