예제 #1
0
        private int uniformFind(NgramSet ngram, TrieRange range, int wordId)
        {
            var vocabRange = new TrieRange(0, ngram.maxVocab);

            while (range.getWidth() > 1)
            {
                int pivot = range.begin + 1 + calculatePivot(wordId - vocabRange.begin, vocabRange.getWidth(), range.getWidth() - 1);
                int mid   = ngram.readNgramWord(pivot);
                if (mid < wordId)
                {
                    range.begin      = pivot;
                    vocabRange.begin = mid;
                }
                else if (mid > wordId)
                {
                    range.end      = pivot;
                    vocabRange.end = mid;
                }
                else
                {
                    return(pivot);
                }
            }
            return(-1);
        }
예제 #2
0
        public float readNgramProb(int wordId, int orderMinusTwo, TrieRange range, NgramTrieQuant quant)
        {
            int      ptr;
            NgramSet ngram = getNgram(orderMinusTwo);

            if ((ptr = findNgram(ngram, wordId, range)) < 0)
            {
                return(0.0f);
            }
            return(quant.readProb(bitArr, ngram.memPtr, ngram.getNgramWeightsOffset(ptr), orderMinusTwo));
        }
예제 #3
0
        private int findNgram(NgramSet ngramSet, int wordId, TrieRange range)
        {
            int ptr;

            range.begin--;
            if ((ptr = uniformFind(ngramSet, range, wordId)) < 0)
            {
                range.setFound(false);
                return(-1);
            }
            //read next order ngrams for future searches
            if (ngramSet is MiddleNgramSet)
            {
                ((MiddleNgramSet)ngramSet).readNextRange(ptr, range);
            }
            return(ptr);
        }