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