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;