N-Gram原码分析

N表示词的长度,Gram表示按长度N切分原词得到的词段

1.N最小取值规则,如果原词的长度大于5,则最小值为3,如果原词的长度等于5,则最小值为2,否则最小值为1.

2.N最大值取值规则,如果原词长度大于5,则最大值为4,原词长度等于5,则最大值为3,否则最大值为2.

原码如下:

  //获取最小值

  private static int getMin(int l) {
    if (l > 5) {
      return 3;
    }
    if (l == 5) {
      return 2;
    }
    return 1;
  }

//获取最大值

private static int getMax(int l) {
    if (l > 5) {
      return 4;
    }
    if (l == 5) {
      return 3;
    }
    return 2;
  }

  例如:"中国人民在会堂",原词长度为7,最值为3,最大值为4

3.获取grams,原码如下:

//ng为原词长度最小值与最大值之间的值

for (int ng = getMin(lengthWord); ng <= getMax(lengthWord); ng++) {

        key = "gram" + ng; // form key
        //获取grams
        grams = formGrams(word, ng); // form word into ngrams (allow dups too)

        if (grams.length == 0) {
          continue; // hmm
        }

        if (bStart > 0) { // should we boost prefixes?
          add(query, "start" + ng, grams[0], bStart); // matches start of word

        }
        if (bEnd > 0) { // should we boost suffixes
          add(query, "end" + ng, grams[grams.length - 1], bEnd); // matches end of word

        }
        for (int i = 0; i < grams.length; i++) {
          add(query, key, grams[i]);
        }
      }

      

     //此方法分割原词,组成gram

     private static String[] formGrams(String text, int ng) {
        //原词长度
        int len = text.length();
        //字符串数组(长度为原词长度减去N的长度再加1),ng为最小值到最大值之间的数
        String[] res = new String[len - ng + 1];
        for (int i = 0; i < len - ng + 1; i++) {
            //截取原词()
            res[i] = text.substring(i, i + ng);
         }
         return res;
      }

    

      将"中国人民大会堂"进行切分,分割出来的grams为[中国人, 国人民, 人民大, 民大会, 大会堂]

      [中国人民, 国人民大, 人民大会, 民大会堂],将"华贸中心"进行切分,分割出来的grams为

      [华, 贸, 中, 心],[华贸, 贸中, 中心]

你可能感兴趣的:(String,query)