一、Classifier4J通过统计高频词和句子分析来实现。
1. 取得高频词;
2. 把内容拆分成句子;
3. 取得包含高频词的前k个句子。可以把意思完整的句子分值加高。
4. 将句子按照在文中出现的顺序重新排列,添加适当的分隔符后输出。
为了快速的统计高频词,这里用到的一个重要的方法是从数组中快速的选取最大的k个数。我们可以设计接口如下:
selectRandom(ArrayList<WordFreq> a, int size, int k, int offset);
输入是待选取的数组,它的长度,k值和偏移量。根据快速排序的原理,具体实现方法如下:
static void selectRandom(ArrayList<WordFreq> a, int size, int k, int offset) { if (size < 5) { for (int i = offset; i < (size + offset); i++) for (int j = i + 1; j < (size + offset); j++) if (a.get(j).compareTo(a.get(i)) < 0) swap(a, i, j); return; } Random rand = new Random(); int pivotIdx = partition(a, size, rand.nextInt(size) + offset, offset); if (k != pivotIdx) { if (k < pivotIdx) { selectRandom(a, pivotIdx - offset, k, offset); } else { selectRandom(a, size - pivotIdx - 1 + offset, k, pivotIdx + 1); } } } static int partition(ArrayList<WordFreq> a, int size, int pivot, int offset) { WordFreq pivotValue = a.get(pivot); swap(a, pivot, size - 1 + offset); int storePos = offset; for (int loadPos = offset; loadPos < (size - 1 + offset); loadPos++) { if (a.get(loadPos).compareTo(pivotValue) < 0) { swap(a, loadPos, storePos); storePos++; } } swap(a, storePos, size - 1 + offset); return (storePos); } //对数组中的5个值排序。 static int median5(ArrayList<WordFreq> a, int offset) { WordFreq a0 = a.get(0 + offset); WordFreq a1 = a.get(1 + offset); WordFreq a2 = a.get(2 + offset); WordFreq a3 = a.get(3 + offset); WordFreq a4 = a.get(4 + offset); if (a1.compareTo(a0) < 0) { WordFreq tmp = a0; a0 = a1; a1 = tmp; } if (a2.compareTo(a0) < 0) { WordFreq tmp = a0; a0 = a2; a2 = tmp; } if (a3.compareTo(a0) < 0) { WordFreq tmp = a0; a0 = a3; a3 = tmp; } if (a4.compareTo(a0) < 0) { WordFreq tmp = a0; a0 = a4; a4 = tmp; } if (a2.compareTo(a1) < 0) { WordFreq tmp = a1; a1 = a2; a2 = tmp; } if (a3.compareTo(a1) < 0) { WordFreq tmp = a1; a1 = a3; a3 = tmp; } if (a4.compareTo(a1) < 0) { WordFreq tmp = a1; a1 = a4; a4 = tmp; } if (a3.compareTo(a2) < 0) { WordFreq tmp = a3; a3 = a2; a2 = tmp; } if (a4.compareTo(a2) < 0) { WordFreq tmp = a4; a4 = a2; a2 = tmp; } if (a2 == a.get(0 + offset)) return 0; if (a2 == a.get(1 + offset)) return 1; if (a2 == a.get(2 + offset)) return 2; if (a2 == a.get(3 + offset)) return 3; return 4; }
注: 本文来源于网络。