Java實現中文自動摘要的基本方法
參考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;
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!