LexTreeLinguist API

来源:互联网 发布:港澳台直播软件apk 编辑:程序博客网 时间:2024/05/16 06:47
<span style="font-size:24px;">public class LexTreeLinguist implements Linguist本类为能够有效的表示大词汇量的语言专家。此类实现了语言专家接口即Linguist接口。任何语言专家的主要作用是用来为解码器表示搜索空间的。在搜索空间中的初始状态能够通过搜索管理的getInitialSearchState方法来获得。此方法返回一个搜索状态。搜索状态的子接口用来表示在搜索空间中不同类型的搜索状态。字搜索状态表示了再搜索空间中的一个字。单元搜索状态表示了在搜索空间中的一个单元即音素。Hmm搜索状态表示了在搜索空间中的一个hmm状态。一个语言专家有许多关于返回哪个状态的阶的范围信息。例如在'flat'语言专家中会在字的开始处返回一个字状态,然而在'树'语言专家中在字的结尾处即结束处返回一个字状态。同样的,一个语言专家也许会省略某些特定类型的状态如一个单元状态。一些搜索管理想知道由特定语言专家产生的状态的阶的前续(前验),即前向节点。方法getSearchStateOrder能够被用来获得由语言专家返回的状态的阶即order。依靠于vocabulary词汇表的长度尺寸和拓扑类型结构,由语言专家所表示的搜索空间也许会包括数目巨大的搜索状态数。一些语言专家将会动态的产生搜索空间,也就是说,表示在搜索空间中的一个特定搜索状态的对象直到它被需要的时候才由搜索管理SearchManager产生(创建)。搜索管理需要通过比较状态来决定一个特定的搜索状态已经进入了搜索(空间)。因为搜索状态也许是被代替的创建的,所以SearchState.equals()方法的调用(与引用等号'=='是截然相反的)来决定状态是否相同相等。由语言专家返回的状态一般将会提供对equals和hashcode的非常有效的实现。这允许一个搜索管理以hashcode的形式有效的维持一个状态集,此集合是有状态组成的即collections of states。LexTeeLinguist语言专家的特点:1,动态性即Dynamic,语言专家是在运行时产生搜索状态的,这将会在很大程度上减少对内容的需要。2,树的拓扑结构即tree topology,语言专家所表示的搜索空间为一个可反转(反向)的树。在根处的字的单元被不同的字所共享。这将会减少在搜索中的需要被考虑的状态的数目。3,hmm 的共享,因为在声学模型中的状态的绑定,有不同的右场景的的三音素单元实际上被同一个hmm所表示。语言专家对此的识别使用了一个单独的状态来表示hmm。这将在很大程度上减少由语言专家所产生的状态的数目。4,small-footprint 低内容,此语言专家使用了一些其他技术来减少搜索空间内容的占有。其中的一种特别有用的技术是共享结束字单元(在这有大量的扇出状态发生)被使用的字。对于一个60000字的词汇表,这会使树的节点从2百万减到3000左右。5,quick loading 快速的载入,此语言专家能够快速的编辑搜索空间。A 60K word vocabulary can be made ready in less than 10 seconds. 一个6万个字的词汇表不需10秒就可以被载入。此语言专家不是一般目的的语言专家,此语言专家有以下限制需遵守:1,单元尺寸size,此语言专家的单元是不能够单元三音素单元的。即最大为三音素。2,n-gram 语法,此语言专家将会直接从n-gram 语言模型来产生搜索空间。所支持的词汇表vocabulary 为在语言模型中的字和存在于字典中的字的交集。它假定在词汇表vocabulary中的所有字序列都是合法的,此语言专家并不支持随机语法 arbitrary grammars。设计时需要的注意点:以下是描述此语音专家设计的以下说明。它们也许会有助于帮助那些需要理解此语言专家怎么工作的人。1,搜索空间的表示:已经被证明把搜索空间一棵树的形式来表示是能够在很大程度上减少在一次搜索中的活动的状态数的,因为在字开始处的单元能够被不同的字所共享。例如:对于一个60k字的 vocabulary,在一个字的结尾处,用一个flat 表示,我们必须提供到每个可能字的初始状态的转移。这是60k转移。在基于树的系统相同,我们仅需要提供到每个初始音素(在它自己的场景)的转移。此大概1600个转移。这减少了大量的转移树。在概念上,此树由到每个可能的初始单元的节点组成。每一个节点可以有随机个子孩子(此孩子节点可以是单元节点也可以是字节点类型)。此语言专家使用hmmtree 类来构造和表示树。Hmmtree被字典和语言模型所给定,来创建lextree。代替在传统做法中的在树中的节点表示音素或字。Hmmtree以hmm和字来表示树。Hmm是有必要是它场景中的一个单元。此典型的是三音素,尽管对于有些单元如sil 它是一个简单的音素。把节点表示为hmm代替节点产生一个非常大的树,但是它也有以下优点:由于在声学模型中的状态的绑定,许多不同的三音素实际上共享了一个hmm。节点表示的是hmm,允许那些共享的hmm在树中仅被呈现一次,代替了我们以音素和三音素来表示状态的多次出现。此使在考虑搜索时,使的实际的状态树大量的减少。实验表示:此能够减少需要的beam通过一个2或3的因子。通过把一个节点表示hmm,我们可以避免为搜索中的特定的三音素来查找hmm。这里存在着一些不利点用hmm来表示树:There are some disadvantages in representing the tree with HMMs:1,长度size,因为hmm表示在场景中的单元,我们对每一个节点有多个拷贝。例如:代替在字'dog'中对于初始节点用一个单独的单元所表示,我们将会有大约40个hmm。每一个为一个可能的左场景。2,速度speed,建造一个大的hmm树需要发费更多的时间,因为更多的节点被需要来表示树。3,复杂性complexity,用hmm来表示树会更加的复杂,对每一个字或单元都有多个进入指针需要处理。幸运的是,size和speed问题都能够被解决通过添加一个更加复杂的处理过程。在hmm树中的大多数节点都是字结束节点。对于每一个可能存在的右场景都会有一个字结束节点。为了减少空间,所有的字结束节点都被一个单独的endnode节点代替。在搜索中,对于一个特定endnode节点的实际hmm节点是按需产生的。那些hmm节点集会被不同的字结束所共享,因此被缓存。通过使用endnode节点可使树所需的空间减少了大约300mb,创建树所需的时间从60秒减少到了大约6秒。Word Histories  历史字。我们使用了显示的回退为历史字。此技术被证明是很有用,节省了大量的状态。原因如下:对于一个词汇表的大小为N,你有N^2个独特的二元语法历史。所有token栈即标记栈将会有N^2*K个独特的标记即token,其中k是每个标记的状态数。对于一个100k大小的词汇表,每个hmm有三个状态,我们将会有3*10^10token(最多)。当然它们中的大部分会被剪枝掉,但是实际上,它仍然太多了。如果你继续使用实际的k-gram(i.e. accounting explicitly for backoff),它会被大量的减少。大部分bigrams没有相关的trigrams。并不是所有的10^10 bigrams都有trigrams的。我们仅需存储那些有trigrams的bigrams的个数的token。本类的属性: @S4Component(type = Grammar.class)public final static String PROP_GRAMMAR = "grammar";此属性定义在在构造搜索图时所使用的语法。@S4Component(type = AcousticModel.class) public final static String PROP_ACOUSTIC_MODEL = "acousticModel";此属性确定了在构造搜索图时所使用的声学模型。@S4Component(type = UnitManager.class, defaultClass = UnitManager.class) public final static String PROP_UNIT_MANAGER = "unitManager";此属性确定了在构造搜索图时所使用的单元管理。@S4Component(type = LogMath.class) public final static String PROP_LOG_MATH = "logMath";属性定义了搜索管理使用的logmath。@S4Boolean(defaultValue = true)public final static String PROP_FULL_WORD_HISTORIES = "fullWordHistories";此属性决定了全字历史是否被使用来决定何时两个状态相同。 @S4Component(type = BackoffLanguageModel.class) public final static String PROP_LANGUAGE_MODEL = "languageModel";此属性确定了被语法使用的语言模型。@S4Component(type = Dictionary.class) public final static String PROP_DICTIONARY = "dictionary";此属性确定了语法使用的字典。 @S4Integer(defaultValue = 0)public final static String PROP_CACHE_SIZE = "cacheSize";此属性定义了弧缓存的长度(0或者不能缓存)。@S4Boolean(defaultValue = false) public final static String PROP_ADD_FILLER_WORDS = "addFillerWords";此属性控制填充字是否被自动的添加到词汇表。@S4Boolean(defaultValue = false)public final static String PROP_GENERATE_UNIT_STATES = "generateUnitStates";此属性控制语言专家是否将会产生单元状态。当此属性为false,语言专家也许会省略单元搜索状态。对于一些搜索算法,此将会允许用更紧凑的结果为更快的搜索。@S4Boolean(defaultValue = true)public final static String PROP_WANT_UNIGRAM_SMEAR = "wantUnigramSmear";此属性用来决定unigram概率是否被smeared在lex树中。在树的扩展中,语言概率仅在当我们达到字结束节点时才被计算。直到此点,我们需要记录活动的路径并给以它一些语言概率。详细请见:Improvements on the pronunciation  prefix tree search organization 论文。 @S4Double(defaultValue = 1.0)public final static String PROP_UNIGRAM_SMEAR_WEIGHT = "unigramSmearWeight";此属性决定了smear的权重。  private final static SearchStateArc[] EMPTY_ARC = new SearchStateArc[0];此仅用于调试。//以下属性通过property sheet 所配置的子组件。 private BackoffLanguageModel languageModel;    private AcousticModel acousticModel;    private LogMath logMath;    private Dictionary dictionary;    private UnitManager unitManager;//以下属性通过property sheet 所配置的数据。private Logger logger;    private boolean fullWordHistories = true;    protected boolean addFillerWords;    private boolean generateUnitStates;    private boolean wantUnigramSmear = true;    private float unigramSmearWeight = 1.0f;    private boolean cacheEnabled;    private int maxArcCacheSize;    protected float languageWeight;    private float logWordInsertionProbability;    private float logUnitInsertionProbability;    private float logFillerInsertionProbability;    private float logSilenceInsertionProbability;private float logOne;//是用来建造和维持搜索空间的属性 private Word sentenceEndWord;    private Word[] sentenceStartWordArray;    private SearchGraph searchGraph;    private HMMPool hmmPool;    private LRUCache<LexTreeState, SearchStateArc[]> arcCache;    private int maxDepth;    protected HMMTree hmmTree;    private int cacheTrys;private int cacheHits;本类的构造方法: public LexTreeLinguist(AcousticModel acousticModel, LogMath logMath, UnitManager unitManager,BackoffLanguageModel languageModel, Dictionary dictionary,boolean fullWordHistories, boolean wantUnigramSmear, double wordInsertionProbability,double silenceInsertionProbability,double fillerInsertionProbability,double unitInsertionProbability,float languageWeight, boolean addFillerWords, boolean generateUnitStates,float unigramSmearWeight, int maxArcCacheSize );给定属性参数创建对象。public LexTreeLinguist();空的构造方法。本类的方法: public void newProperties(PropertySheet ps);对属性进行设置。  public void allocate();为此语言专家分配资源。 private void compileGrammar();把n-gram编辑入一棵lex树,此lex树是在搜索中所使用的。  protected void generateHmmTree() ;在此方法中创建了一个存储hmm的hmm池,即创建了一个hmmtree对象。 public void deallocate();对资源进行释放处理。  public SearchGraph getSearchGraph();获得搜索图。即searchGraph属性。 public void startRecognition();在识别之前调用。此方法调用的语言模型的start方法。  public void stopRecognition();识别后调用。调用的 languageModel.stop()方法。 public LanguageModel getLanguageModel();返回的是此语言专家的语言模型。  public Dictionary getDictionary();获得此语言专家使用的字典。private SearchState getInitialSearchState();获得的是初始语言状态。即调用hmmTree.getInitialNode()。</span>

0 0
原创粉丝点击