<span style="font-size:24px;">public class BinaryLoader
读取由cmu SphinxBase sphinx_lm_convert 产生的一个二进制 NGram 语言模型文件(”DMP 文件”)。注意所有在语法中的概率都是以log域的形式存储的,在语言模型文件中的语言概率是以log 10为底的形式存储的。它们被转换为logmath的底。
本类的属性:
private static final String DARPA_TG_HEADER = "Darpa Trigram LM"; 3元语法语言模型模型文件头字符串表示。
private static final String DARPA_QG_HEADER = "Darpa Quadrigram LM";4元语法语言模型模型文件头字符串表示。
private static final String DARPA_NG_HEADER = "Darpa \\d-gram LM";为了方便起见,NG(ngram)的头是正则表示的,索引在其中存在2个二外的字符。因此header.length()必须通过减1来调整,并且我们使用了pattern.matches()为头中的相同部分。
private static final int LOG2_NGRAM_SEGMENT_SIZE = 9; 为segment的长度。
private static final float MIN_PROBABILITY = -99.0f;
private static final int MAX_PROB_TABLE_SIZE = java.lang.Integer.MAX_VALUE;
private LogMath logMath;
private int maxNGram; 最大为几元语言模型。低于此元的概率都是存在,如maxNGram为4,则文件可存在1,2,3,和4元的概率。为条件概率。即存在p(w|x,y,z),p(x|y,z),p(y|x),p(x).这4中概率。
private float unigramWeight;单元语法权重
private float languageWeight;语言权重
private double wip; 字插入概率
private boolean bigEndian = true;
private boolean applyLanguageWeightAndWip;是否使用语音权重和字插入概率(penalty)
private long bytesRead;为已经读取的字节数。
private UnigramProbability[] unigrams;一元gram。概率即p(x)相关的内容。
private String[] words;存储字的拼写的字符串数组
private long[] NGramOffset; 长度为maxNGram。存储的是一元,二元,…的概率的偏移。即开始位置。即从哪开始是p(x)概率。从哪开始是二元概率 等。
private int[] numberNGrams; 长度为maxNGram。存储的是每一个ngram的概率的个数即一元,二元,…的概率的个数。
private int logNGramSegmentSize;segment长度
private int startWordID;句开始字id
private int endWordID;句结束字id
private int[][] NGramSegmentTable;segmenttable,其中的第一维的长度为maxNGram。
private float[][] NGramProbTable;为所有文件中存在的所有概率表,其中的第一维的长度为maxNGram。
private float[][] NGramBackoffTable;回退权重表,其中的第一维的长度为maxNGram。
private RandomAccessFile file;为模型文件的文件流。支持对文件进行随机的读取写操作。是通过位置路径来建立的。
private int bytesPerField;为LM语言模型的字节乘法器(2=16个位,4=32位)。
本类的构造方法:
public BinaryLoader(File location, String format,boolean applyLanguageWeightAndWip, LogMath logMath,float languageWeight, double wip, float unigramWeight);给定属性来创建对象。
本类的方法:
protected void loadModelLayout(InputStream inputStream);从给定的文件装载语言模型。输入参数:inputStream为语言模型文件,用来来读取语言模型数据。
private void readHeader(DataInputStream stream);读取语言模型文件头。输入参数:stream为文件流。
private int readInt(DataInputStream stream, boolean bigEndian);根据给定数据输入流和字节的存储顺序来从输入流中读取一个整数即int数。输入参数:stream为数据流。bigEndian如果输入流是大端字节存储的,则此值为true,否则为false。返回的是读取的整数。
private String readString(DataInputStream stream, int length);从给定的输入流中读取一个给定长度的字符串。假定在输入流中的每个字符为8位。输入参数:length为返回的字符串中的字符的数目即个数。
private void skipStreamBytes(DataInputStream stream, long bytes);跳过指定个数的字节数。并丢弃跳过的字节。可靠的跳跃。试图在输入流中跳过数据的 n 个字节,并丢弃跳过的字节。
private UnigramProbability[] readUnigrams(DataInputStream stream,
int numberUnigrams, boolean bigEndian);读取在给定数据输入流中的unigrams。输入参数:numberUnigrams为要读取的unigram的数目即个数。输入流是否为大端字节存储的。返回的是一个UnigramProbability对象,此对象通过unigram id来索引。读取unigram id,unigram 概率,unigram 回退权重。Unigram的firstBigramEntry。如果我们没有在末尾读取the sentinel unigram。确保unigram id是连贯的。
private void skipNGrams(DataInputStream stream);跳过在语言模型的Ngrams。
public int getBytesPerField();返回一个Ngram长度的乘法器。(1为16位,2为32位)。返回的是bytesPerField;属性。
public boolean getBigEndian();返回返回被装载的文件是否是以大端字节存储的。是为true。其它为false。
public int getMaxDepth();返回语言模型的最大深度。即maxNGram属性。
public long getNGramOffset(int n);返回的是bigrams的位置。n为所期待的阶(order)。NGrams在特定的N阶开始,返回位置或偏移在文件中的。返回的是NGramOffset[n - 1];
public long getTrigramOffset();返回trigrams的位置。返回的是trigrams开始的在文件中的位置。返回的是getNGramOffset(3)。
public long getBigramOffset();返回的是bigrams开始的位置。在文件中的Bigrams开始的位置或者偏移。
public String[] getWords();返回所有的字,都是字拼写的表示。即words属性。
public int getLogNGramSegmentSize();返回的是NGram 段长度,此为log域的。the log of the NGram segment size。
public int[] getNGramSegments(int n);n为所期待的阶。返回的是NGram段表中的特定段。即NGramSegmentTable[n - 1]。在指定阶(位置|长度)的NGram 段表。
public float[] getNGramBackoffWeights(int n);n为所期待的阶(长度)。返回的所有的NGram权重。返回的是指定长度的存储回退权重的数组。数组的长度为n-1。
public int getLogBigramSegmentSize();返回的是bigram段长度。即为LogBigramSegmentSize属性。为log域的。
public int[] getTrigramSegments();返回的是trigram段表。即调用了getNGramSegments(3);返回的是存储段的数组。数组的长度为3.
public float[] getTrigramBackoffWeights();返回的是所有trigrams的回退权重,数组的长度为3.存储的是回退权重。
public float[] getTrigramProbabilities();返回的是所有trigrams 概率。数组存储的是trigram的概率。长度为3.
public float[] getBigramProbabilities();返回的是所有的bigrams的概率,数组长度为2.存储的是bigrams概率。
public UnigramProbability[] getUnigrams();返回的是所有的unigrams,即tUnigrams属性。为数组存储的是UnigramProbability对象。
public int getNumberNGrams(int n);返回的是指定阶的Ngrams的个数。即numberNGrams[n - 1]处的值。
public int getNumberTrigrams();返回的是trigrams的个数数目。
public int getNumberBigrams();返回的是bigrams的个数即数目。
public int getNumberUnigrams();返回的是unigrams的个数即数目。
public void deallocate();释放资源。即为file.close()方法被调用。
public byte[] loadBuffer(long position, int size);输入参数:position为在文件中的开始的位置。Size为要装载的字节数。返回的是已经装载的进数组的字节数组。从内存映射文件的指定位置开始装载指定字节数即个数的字节的,把字节存储在一个字节数组中。此方法被实现是因为MappedByteBuffer.load()不能合适的工作。即不能很好的起到相应的作用。
private float[] readFloatTable(DataInputStream stream, boolean bigEndian);从给定数据流中读取概率到概率表中即浮点数组中。
private int[] readIntTable(DataInputStream stream, boolean bigEndian,int tableSize);从给定输入流中读取NGram segment到一个int数组中。tableSize为返回的数组的长度。
private String[] readWords(DataInputStream stream, int length,int numberUnigrams);输入参数:numberUnigrams为要读取的字符串的个数即数目。Length为所有字符串的字节数的总字节数。返回的是读到的字符串的数组。
private float readFloat(DataInputStream stream, boolean bigEndian);从输入流都一个浮点数。
private void applyWip(float[] logProbabilities, double wip);对给定的概率数组应用wip字插入概率。数组中的每一个概率值加上此wip的log域值。在线性域是乘法。Log域为加法。
private void applyLanguageWeight(float[] logProbabilities,float languageWeight);对给定的log域的概率数组应用语言权重。即数组中的每一个值乘以语言权重值后在放入概率数组中。
private void applyUnigramWeight();对unigrams集合应用unigram 权重。
private void skipNGrams(DataInputStream stream);跳过在语言模型中的Ngrams。</span>