Java实现中文自动摘要的基本方法
jopen
11年前
参考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;