Java實現中文自動摘要的基本方法

jopen 10年前發布 | 34K 次閱讀 Java開發 Classifier4J

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