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为
[华, 贸, 中, 心],[华贸, 贸中, 中心]