中文自动摘要的基本实现方法

参考Classifier4J的实现方法,中文自动摘要的基本实现方法如下5个步骤:

 1.通过中文分词,统计词频和词性等信息,抽取出关键词。

   2.把文章划分成一个个的句子。

   3.通过各句中关键词出现的情况定义出句子的重要度。

   4.确定前K个最重要的句子为文摘句。

   5.把文摘句按照在原文中出现的顺序输出成摘要。


其中,统计词频我们可以去掉一些停用词增加摘要的准确性。对于各行各业来说,都会有个子的一些行业关键字,可以增加其权重,不过涉及到文本分类的问题,这里就不一一赘述了。


下面是简单的实现:

ArrayList<CnToken> pItem = Tagger.getFormatSegResult(rouseStr);
		WordFreq[] charArray = new WordFreq[10];
		
		WordCounter wordCounter = new WordCounter();
		
		for (int i = 0; i < pItem.size(); ++i) {
			CnToken t = pItem.get(i);
			if (t.type().startsWith("n")) {
				wordCounter.ProNChar(t.termText());
			} else if (t.type().startsWith("v")) {
				wordCounter.ProVChar(t.termText());
			}
		}

		//取得出现的频率最高的五个名词
		WordFreq[] charNArray = wordCounter.getWords(wordCounter.CharNCount);
		
		for (int mn = 0; mn < 5; mn++) {
			charArray[mn] = charNArray[mn];
		}

		//取得出现的频率最高的五个动词
		WordFreq[] charVArray = wordCounter.getWords(wordCounter.CharVCount);
		for (int mn = 5; mn < 10; mn++) {
			charArray[mn] = charVArray[mn - 5];
		}

		//抽取句子
		SentenceExtractor senCou = new SentenceExtractor();
		ArrayList<SentenceScore> sentenceArray = senCou.getSentences(rouseStr);
		
		int q = 0;
		int sumCount = 1;
    //计算句子权重
		while ( q<sentenceArray.size() ) {
			
			String sentenCompare = sentenceArray.get(q).sentence;
			
			for (int j = 0; j < 10 ; j++) {
				//System.out.println("w:" +j);
				String charCompare = charArray[j].word;
				if(charCompare == null)
				{
					break;
				}
				//System.out.println("比较的词语依次为:"+charCompare);
				int k = sentenCompare.indexOf(charCompare) + 1;
				//System.out.println("词语在数组中的位置为:"+k);
				if (k >= 1) {
					sumCount = sumCount * charArray[j].freq;
				} else {
					sumCount = sumCount * 1;
				}
			}
			sentenceArray.get(q).score = sumCount;
			sumCount = 1;
			q++;
		}
		
		ArrayList<SentenceScore> copySenArr = new ArrayList<SentenceScore>();
		for(SentenceScore sc:sentenceArray)
		{
			copySenArr.add(sc);
		}

		int minSize = Math.min(sentenceArray.size(), 3);
		(new Select<SentenceScore>()).selectRandom(copySenArr, copySenArr.size(), minSize,0);
		//System.out.println("");
		for(int i=0;i<minSize;i++)
		{
			System.out.println("权值最大的三个句子为:"+
								copySenArr.get(i).sentence+
								"该句子的权值为:"+
								copySenArr.get(i).score);
		}

		//句子在原文中出现的顺序输出
		String summary = "";
		for (int i = 0; i<minSize; i++) {
			for (int j = 0; j < minSize; j++) {
				if (sentenceArray.get(i).sentence.equalsIgnoreCase(copySenArr.get(j).sentence)) {
					summary = summary.concat(sentenceArray.get(i).sentence);
					//System.out.println(summary);
				}
			}
		}

		return summary;


你可能感兴趣的:(中文自动摘要的基本实现方法)