Thrax-構建基於語法的語言模型工具

安裝 html

http://www.openfst.org/twiki/bin/view/GRM/ThraxQuickTour git

http://cslu.ogi.edu/~sproatr/Courses/TextNorm/tutorial.html 正則表達式

http://www.openfst.org/twiki/pub/GRM/ThraxDownload/thrax-1.2.7.tar.gz app

thrax-1.2.5以上要求openfst-1.6.6以上 dom

thrax-1.2.4要求openfst-1.6.0以上 函數

   

MAKE SURE YOU CONFIGURE OpenFst WITH THE --enable-far, --enable-pdt AND --enable-mpdt FLAGS. 工具

cd openfst 測試

make clean 優化

./configure -enable-far --enable-pdt --enable-mpdt ui

make -j24

sudo make install

   

使用--enable-pdt選項make時

pdtreplace.cc:(.text+0x245): undefined reference to `fst::script::FstClass::Read(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'

pdtreplace.cc:(.text+0x3f1): undefined reference to `fst::script::FstClass::Read(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'

pdtreplace.cc:(.text+0x4ac): undefined reference to `fst::script::VectorFstClass::VectorFstClass(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'

./.libs/libfstpdtscript.so: undefined reference to `fst::FstHeader::Write(std::ostream&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'

./.libs/libfstpdtscript.so: undefined reference to `fst::ConvertToLegalCSymbol(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'

./.libs/libfstpdtscript.so: undefined reference to `fst::AddAuxiliarySymbols(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, long, long, fst::SymbolTable*)'

須要make clean

   

cd thrax

./configure --enable-static=no

make -j 8 -Wall -Wno-sign-compare

   

make錯誤

./../include/thrax/evaluator.h:257:15: error: request for member 'InputSymbols' in 'far_reader->fst::FarReader<A>::GetFst<fst::ArcTpl<fst::TropicalWeightTpl<float> > >()', which is of pointer type 'const fst::Fst<fst::ArcTpl<fst::TropicalWeightTpl<float> > >*' (maybe you meant to use '->' ?)

*far_reader->GetFst().InputSymbols())) {

^

./../include/thrax/evaluator.h:277:56: error: no matching function for call to 'fst::VectorFst<fst::ArcTpl<fst::TropicalWeightTpl<float> > >::VectorFst(const fst::Fst<fst::ArcTpl<fst::TropicalWeightTpl<float> > >*)'

MutableTransducer tmpfst(far_reader->GetFst());

^

Makefile:582: recipe for target 'main/compiler-stdarc.lo' failed

make[3]: *** [main/compiler-stdarc.lo] Error 1

make[3]: Leaving directory '/media/jarvan/ST2000DM001/kaldi.git.new/tools/thrax-1.2.1/src/lib'

Makefile:344: recipe for target 'all-recursive' failed

make[2]: *** [all-recursive] Error 1

make[2]: Leaving directory '/media/jarvan/ST2000DM001/kaldi.git.new/tools/thrax-1.2.1/src'

Makefile:400: recipe for target 'all-recursive' failed

make[1]: *** [all-recursive] Error 1

make[1]: Leaving directory '/media/jarvan/ST2000DM001/kaldi.git.new/tools/thrax-1.2.1'

Makefile:323: recipe for target 'all' failed

make: *** [all] Error 2

   

使用thrax-1.2.4替換thrax-1.2.1:

wget http://www.openfst.org/twiki/pub/GRM/ThraxDownload/thrax-1.2.4.tar.gz

便可解決編譯錯誤

   

QuickTour

http://www.openfst.org/twiki/bin/view/GRM/ThraxQuickTour

   

若是安裝了GNU readline,則能夠在configure時加上(--enable-readline)選項以啓用readline功能。

這樣,使用thraxrewrite-tester時,支持內聯的輸入編輯以及保存歷史。可使用--history_file選項指定歷史文件(默認爲.rewrite-tester-history)。

   

工具集

   

thraxmakedep

thrax的語法依賴關係生成工具

該工具以top-level-grammar做爲主語法文件(至關於main.c);

根據語法文件的調用關係,以thraxcompiler爲編譯器,生成makefile

Usage: src/bin/thraxmakedep [-s/--save_symbols] [-a/--arc_type (default: standard)] top-level-grammar [makefile-target=Makefile]

   

--save_symbols--arc_type選項將被傳遞給thraxcompiler

   

[-s/--save_symbols]

表示是否保留輸入和輸出的原始符號;

若保留,則FSTs中使用原始符號做爲弧之上的權重;

不然,FSTs使用標識符代替原始符號;

若是設定了--save_symbols,編譯時,符號表將得以保留。

符號的選擇基於用於編譯FSTs的每條字符串的解析模式。

符號表能夠是一個byte符號表、utf8符號表 用戶自定義符號表。

當須要從fst檔案文件中提取FSTs並使用fstprintfstdraw顯示時,能夠指定此參數。可是可能會出現一些bugs

[-a/--arc_type (default: standard)]

--arc_type選項支持與OpenFST相同的弧類型:standard (tropical), log log64

一般,咱們須要弧的類型爲熱帶半環,所以通常狀況下不須要設定此參數。

注意,thraxrewrite-tester只支持--arc_type standard,不然,將不能進行測試。

   

   

thraxcompiler

用於將語法文件編譯爲FST

PROGRAM FLAGS:

--arc_type: type = string, default = "standard"

編譯FSTs的弧類型

--emit_ast_only: type = bool, default = false

解析輸入,將語法文件的AST打印到標準輸出,不生成FST檔案

--input_grammar: type = string, default = ""

輸入的語法文件

--output_far: type = string, default = ""

輸出的FST檔案目標位置

thraxrewrite-tester

thrax改寫/重寫測試工具

該工具根據規則文件在標準輸入上向用戶請求一個或多個輸入

而後將用戶的輸入以某種規則輸入到FSTs中;

獲取FSTs的輸出,並輸出到標準輸出。

Flags from: rewrite-tester-utils.cc

--far: type = string, default = ""

far, fsts archive, fst檔案文件

要測試的fst檔案文件,後綴名通常爲".far"

--history_file: type = string, default = ".rewrite-tester-history"

歷史文件的位置

--input_mode: type = string, default = "byte"

輸入的編碼,能夠是"byte"、"utf8"或是一個符號表。

--noutput: type = int64, default = 1

對於每一個輸入,最多輸出的字符串的個數

--output_mode: type = string, default = "byte"

輸出的編碼,能夠是"byte"、"utf8"或是一個符號表。

--rules: type = string, default = ""

重寫規則文件名

   

規則文件的內容爲 以逗號爲分隔符的規則列表

這些規則將與標準輸入(或隨機生成器)一塊兒構成FSTs的輸入

這相似於Bash的字符串替換:echo "Hello $you_name, my name is $my_name."

   

--show_details: type = bool, default = false

當指定了多個規則文件時(好比:--rules=FST1,FST2,FST3

將顯示每一個transducer的輸出結果,可用於調試。

thraxrandom-generator

thrax隨機生成器

該工具根據規則文件隨機生成最多noutput個輸入

而後將生成的輸入以某種規則輸入到FSTs中;

獲取FSTs的輸出,並輸出到標準輸出。

   

注:使用後進先出轉換器(pushdown transducer)規則時,該工具將會生成無心義的結果。

   

PROGRAM FLAGS:

--far: type = string, default = ""

要測試的fst檔案文件,後綴名通常爲".far"

--input_mode: type = string, default = "byte"

輸入的編碼,能夠是"byte"、"utf8"或是一個符號表。

--noutput: type = int64, default = 1

要生成的最大輸出映射(output mappings)數

--output_mode: type = string, default = "byte"

輸出的編碼,能夠是"byte"、"utf8"或是一個符號表。

--rule: type = string, default = ""

重寫規則文件名

   

   

Thrax使用示例

   

使用thraxmakedep工具分析主語法文件的依賴關係,生成Makefile

$ thraxmakedep example.grm

使用Automake中的makeMakefile解決依賴並生成fst檔案(.far);

$ make

使用thraxwrite-tester,根據"--rules"指定的規則文件,對fst檔案進行輸入輸出的測試;

$ thraxrewrite-tester --far=example.far --rules=TOKENIZER

Input string: Well, I can't eat muffins in an agitated manner.

Output string: Well , I ca n't eat muffins in an agitated manner .

Input string: Mr. Ernest Worthing, B. 4, The Albany.

Output string: Mr. Ernest Worthing , B. four , The Albany .

Input string: Lieutenant 1840,

Output string: Lieutenant eighteen forty ,

Input string: Uncle Jack!

Output string: Uncle Ernest !

   

far中抽取fst

farextract numbers.far

目錄中將生成NUMBERS

fstinfo ./NUMBERS

fstprint ./NUMBERS

   

   

http://openfst.org/twiki/bin/view/Forum/GrmThraxForum

   

LoadFst: load fst from a file or extracting from a FAR.

   

LoadFst['/path/to/fst']

LoadFstFromFar['/path/to/far', 'fst_name']

   

http://blog.csdn.net/visionfans/article/details/50408846

   

   

Thrax語法規則

   

   

   

   

Imports

導入語句由import聲明列表組成,導入聲明以下:

import 'path/to/file.grm' as alias;

編譯器將先搜索提供的文件並加載其中的全部函數以及全部導出的符號。

從編譯目標FST檔案(file.far)中加載的符號(FSTs)必須與導入的源文件在同一目錄下。

導入後,主文件中就可使用別名來引用函數和符號。

所以,若是file.grm提供了一個名爲foo的函數,那麼可使用語法alias.foo[...]來調用這一函數。

注意,要導入的文件自己也可能導入的其餘文件。要訪問這些文件和FSTs,可使用如下別名語法:

   

alias.utils.common.kUpperCaseLetters.

   

import語法示例:

import 'path/to/file.grm' as alias;

這至關於C語言中的'#include "path/to/file.grm"''typedef file.grm alias'grm是源文件。可是,在"file.h"同一目錄下須要提供file.far,一個Fst ARchive文件,該文件是編譯好的FST文件,至關於C語言中的lib庫。當import該源文件後,調用file.grm中定義的函數。好比:alias.foo[…]。當file.grm中也調用了其餘源文件,好比"import utils.common.kUpperCaseLetters",要在當前源文件中加入"alias.utils.common.kUpperCaseLetters."便可調用。

   

   

Functions

   

使用func關鍵字來定義函數,緊接一個函數描述符(函數名)以及一個由方括號包裹的、由逗號分隔的參列表,緊接是有花括號包裹的函數體。函數中,可使用return語句返回一個對象(一般是一個FST)。

示例:

func UnionWithTriple[fst] {

fst3 = fst fst fst;

result = fst | fst3;

return result;

}

要調用此函數,可使用函數名與參數列表以調用:

export a_or_a3 = UnionWithTriple["a"];

   

注意,函數不會引用局部環境的變量,如下語句是不合法的:

   

abc = "abc";

   

func AddAbc[fst] {

return fst abc;

}

   

能夠引用在其餘模塊中定義的變量。這一,若是模塊"foo"定義了"abc",則能夠:

func AddAbc[fst] {

return fst foo.abc;

}

   

示例:

func UnionWithTriple[fst] {

fst3 = fst fst fst;

result = fst | fst3;

return result;

}

函數用func關鍵字定義,後接函數名,參數表用方括號包裹,主函數體用花括號包裹,每個指令以分號結尾。

   

調用該函數:

export a_or_a3 = UnionWithTriple["a"];

   

   

Grm源文件中主體部分(主函數)中生成FST的語句

   

主體中其餘元素都是用於生成FSTs的語句,這些輸出的FSTs將被導入到FST檔案中做爲輸出。每個語句由一個以分號結尾的賦值操做構成:

foo = "abc";

export bar = foo | "xyz";

聲明語句能夠用export關鍵詞來修飾;該語法會把變量的內容寫入到最終輸出檔案中。無export關鍵詞修飾的變量聲明將不會被輸出。

   

標註庫函數、運算和常量

StringFile:從文件中加載字符串列表或者字符串二元組的列表,將其編譯成一個表示這些字符串的並集的FST。至關於 ("string1 | string2 | string3 | ...")

若是該文件每一行只有一個字符串,則編譯的FST是accpetor;若是每一行爲由製表符隔開的字符串二元組,則編譯的FST是transducer。解析模式由StringFile函數的第二個參數指定:

StringFile['strings_file', 'byte', my_symbols]

   

example.grm

# CDRewrite:給定一個轉換器和兩個上下文接受器(以及字母機),該指令將返回一個新的FST,用於在給定的上下文中執行字符串替換(rewrite,重寫)。

第二個(左上下文)和第三個(右上下文)參數是未加權的接受器

第四個參數(sigma_star)是用於執行"最小化"的機器。

第五個參數指定重寫的方向。咱們能夠"left-to-right,ltr"或"right-to-left,rtl"或"simultaneously,sim"重寫。

第六個參數選擇重寫是否可選。它能夠是強制性的(obligatory,obl)也能夠是可選的(optional,opt)。

指定的符號[BOS]和[EOS]能夠用來分別指定表示左右上下文的正則表達式中字符串的開始和結束。

請注意,[BOS]和[EOS]只能在CDRewrite函數中使用,並且,通常只想在左上下文中使用[BOS],一樣,只在正確的上下文中使用[EOS]。

# 語法

CDRewrite [tau,lambda,rho,sigma_star,'ltr'|'rtl'|'sim','obl'|'opt']

   

# 強制性規則在字符串末尾的"d"前改"s"爲"z"

CDRewrite ["s":"z","","d [EOS]"]

   

# 這一規則介紹字符串分隔符標籤"[EOS]"的使用。因爲英文縮寫和小數中都有英文句號,而咱們只想對每段話末尾的英文句號(後面可能有一個空格,緊接着其餘的標點符號)進行分割。那麼如下的規則的做用是:當某個英文句號後面是以一串空格或標點結尾時,咱們在這個英文句號處插入一個空格。對於左上下文(left context),能夠將字符串的起始表示爲"[BOS]",即"Beginning Of the String"。

separate_final_period = CDRewrite["" : " ",

"",

"."

(bytelib.kPunct | bytelib.kSpace)* "[EOS]",

sigma_star]

   

   

# 下面的規則對兩個transducer進行組合,而後對組合的結果進行優化。優化過程是在transducer上執行的,包含:去除空"epsilon"弧、對弧的權重加和、肯定化(determinizing)和最小化(minimizing)。生成的transducers將變

得更小巧且有效。特別是當語法較大時,對一些中間部分的transducer進行優化一般是一個不錯的作法,這樣能夠明顯地提升編譯的速度。

first_phase = Optimize[separate_punct @ separate_final_period];

   

咱們將"word"定義爲"anyword"或者是一個數字(如上所述),由number.grm中的數字語法或(愚蠢的)ernest規則處理。 下面這條規則說明了如何使用權重。 若是該規則與輸入相匹配,那就要把"123"映射爲"one hundred twenty three",而不是"123"。 咱們能夠經過使用權重來實現,不同意使用"anyword"分析。 對於任何非空格字符串序列,分析器將容許這兩個分析,但"anyword"分析將永遠不受歡迎。 因此當TOKENIZER規則(以下)由一個字符串組成時,最好的(最短路徑)分析將是帶有數字分析的分析(若是有的話)。 權重根據熱帶(+,min)半球來解釋(參見http://www.openfst.org下的"FST權重"),因此以下<1.0>的權重將不合意的"anyword",其具備隱含的 權重爲0,也可使用負權重,因此能夠這樣寫:

   

FST字符串輸入

   

以雙引號包裹的字符串可用於定義基本的字符串FSTs。

   

這些字符串能夠經過如下幾種方式之一來解析:

  1. "abc".utf8
  2. "abc".byte
  3. arctic_symbol_table = SymbolTable['/path/to/bears.symtab'];

    "abc".arctic_symbol_table;

       

    雙引號字符串中,容許以反斜線修飾的特殊字符:

    \n, newline

    \r, line feed

    \t, tab

       

       

關鍵詞和符號

   

保留關鍵字和符號列表以下:

= 用於將右側的對象賦值給左側的對象;

exprt 用於指定要輸出到FST檔案中的FST符號(規則);

() 用於修飾須要進行預計算的表達式,優先級較高;

; 表示一個語句的結尾

# 註釋

. 用於指定字符串FST的解析模式(默認爲byte

<> 用於指定FST的權重。放置在FST以後,將不帶方括號的權重防止在該方括號中;

foo = "aaa" <1>;

goo = "aaa" : "bbb" <-1>;

import 用於導入其餘grm文件中的函數和導出的FSTs

as 用於設定其餘grm文件的別名

func 聲明和定義函數;

[,,] 指定函數參數

return 將對象返回給調用者,文件主體中不可用。

   

標準庫函數、運算以及常數

   

如下是帶有特殊語法的內建函數,用於對FSTs進行運算。函數以優先度降序排列。

除非特別說明,全部的運算符都是左結合的,全部函數都將參數展開爲VectorFst

   

Closure

重複參數FST任意屢次:

fst* 接收fst 0到屢次

fst+ 接收fst 1到屢次

fst? 接收fst 01

fst{x,y} 接收fst最少x次,最多y

Concatenation

將第二個FST拼接到第一個FST的末尾。該運算符是右結合的。

該函數還有一個不展開參數的延遲版。

foo bar

Concat[foo, bar]

ConcatDelayed[foo, bar]

Composition

將左側的FST輸出做爲右側FST的輸入,兩個FST合二爲一。

使用顯式的函數名則能指定排序方式。

foo @ bar

對右側的FST的輸入弧進行排序,至關於Compose[foo, bar, 'right']

Compose[foo, bar]

不進行弧的排序

Compose[foo, bar, 'left'|'right'|'both']

left:對左側FST的輸出排序

right:對右側FST的輸入排序

both:同時對左側FST的輸出和右側FST的輸入排序

Union

接收二者任意之一的FST。延遲版不展開參數

foo | bar

Union[foo, bar]

UnionDelayed[foo, bar]

   

Rewrite

將與第一個FST相匹配的字符串重寫到第二個FST中(又稱:向量積)

foo : bar

Rewrite[foo, bar]

   

Weight

在指定FST中附加權重

fst <weight>

ArcSort

對一個FST的全部狀態的全部弧根據弧的輸入或輸出進行排序

ArcSort[fst, 'input'|'output']

Connect

使得FST變得全鏈接圖,移除不可達的狀態和路徑

CDRewrite

給定一個轉換器、2個上下文接收器(以及字母表機),會生成一個在給定上下文中任意位置進行重寫的新FST

第二個(左上文)、第三個(右下文)和第四個(sigma star)函數是不帶權接收器

第五個參數選擇重寫的方向。咱們既能夠左到右重寫(ltr)也能夠右到左重寫(rtl),或者同時重寫。

   

   

CDRewrite[tau, lambda, rho, sigma_star, 'ltr'|'rtl'|'sim', 'obl'|'opt']

## ltr obligatory rule changing "s" into "z" before a "d" at the end of a string

CDRewrite["s" : "z", "", "d[EOS]", sigma_star]

   

Determinize

使得一個FST變得肯定化

Determinize[fst]

RmEpsilon

將給定FST中的全部epsilonlabel 0)移除

RmEpsilon[fst]

   

Expand

顯式地將提供的FST展開爲VectorFst

Expand[fst]

Invert

將給定的FST倒置

Invert[fst]

Minimize

FST最小化

Minimize[fst]

Optimize

FST優化

Optimize[fst]

Project

FST投影到輸入維數或輸出維數

Project[fst, 'input'|'output']

Reverse

反轉FST

Reverse[fst]

   

RmWeight

移除FST的全部權重

RmWeight[myfst]

LoadFst

從文件中或FAR中加載FSTs

LoadFst['path/to/fst']

LoadFstFromFar['path/to/far', 'fst_name']

StringFile

加載由字符串列表或字符串二元組組成的文件,並將其編譯(以byte模式)編譯爲表示這些字符串的聯合的FST。這至關於"string1 | string2 | string3 | ...",但這樣更高效。

StringFile['strings_file']

   

rws@catarina:~/tmp$ cat foo.sym

<eps> 0

얼룩말 1

2

딩고 3

코끼리 4

rws@catarina:~/tmp$ cat foo.grm

foo_syms = SymbolTable['foo.sym'];

export foo = StringFile['foo.txt', 'byte', foo_syms];

rws@catarina:~/tmp$ cat foo.txt

dingo 딩고

dog

zebra 얼룩말

elephant 코끼리

   

   

高級功能

   

先進後出轉換器(Pushdown Transducer,PDT)

   

多棧先進後出轉換器(Multi-Pushdown Transducer,MPDT)

   

功能與範式

   

功能

   

範式

   

替換轉換器

   

小貼士

   

   

來自 <http://www.opengrm.org/twiki/bin/view/GRM/ThraxQuickTour>

相關文章
相關標籤/搜索