自动摘要的设计

 一、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;
	}

 


  注:  本文来源于网络。


你可能感兴趣的:(Classifier4J)