Package org.fnlp.nlp.cn.anaphora

Source Code of org.fnlp.nlp.cn.anaphora.Anaphora

/**
*  This file is part of FNLP (formerly FudanNLP).
*  FNLP is free software: you can redistribute it and/or modify
*  it under the terms of the GNU Lesser General Public License as published by
*  the Free Software Foundation, either version 3 of the License, or
*  (at your option) any later version.
*  FNLP is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU Lesser General Public License for more details.
*  You should have received a copy of the GNU General Public License
*  along with FudanNLP.  If not, see <http://www.gnu.org/licenses/>.
*  Copyright 2009-2014 www.fnlp.org. All rights reserved.
*/

package org.fnlp.nlp.cn.anaphora;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.TreeSet;

import org.fnlp.ml.classifier.linear.Linear;
import org.fnlp.ml.types.Instance;
import org.fnlp.ml.types.InstanceSet;
import org.fnlp.nlp.cn.tag.POSTagger;
import org.fnlp.util.exception.LoadModelException;
/**
* 指代消解的程序接口
* @author jszhao,xpqiu
* @version 1.0
* @since FudanNLP 1.5
*/
public class Anaphora {

  private Linear cl;
  private TreeSet<Entity> ts;
  private FormChanger fc;
  private LinkedList<Instance> llis;
  private InstanceSet test;
  EntitiesGetter ep;
  POSTagger pos;
 
  public Anaphora(String armodel) throws LoadModelException {
    ep = new EntitiesGetter();   
    cl = Linear.loadFrom(armodel);
  }
 
  public Anaphora(String segmodel, String posmodel, String armodel) throws LoadModelException{
    pos = new POSTagger(segmodel,posmodel);
    ep = new EntitiesGetter();   
    cl = Linear.loadFrom(armodel);
  }
 
  public Anaphora(POSTagger tag,String armodel) throws LoadModelException{
    pos = tag;
    ep = new EntitiesGetter();   
    cl = Linear.loadFrom(armodel);
  }
 
 

  /**
   * 用了标注模型,得到指代对集合
   * @param str
   * @return 指代对集合
   * @throws Exception
   */
  public LinkedList<EntityGroup> resolve(String str) throws Exception{
    LinkedList<EntityGroup> arGroup = new LinkedList<EntityGroup>();
   
    String[][][] taggedstr = pos.tag2DoubleArray(str);
    init(taggedstr, str);
    LinkedList<Entity> entityList = ep.parse(taggedstr);
    return doIt(entityList, arGroup);
  }
 
  public LinkedList<EntityGroup> resolve(String[][][] strigTag,String str) throws Exception{
    LinkedList<EntityGroup> arGroup = new LinkedList<EntityGroup>();
    init(strigTag, str);
    LinkedList<Entity> entityList = ep.parse(strigTag);
    return  doIt(entityList, arGroup);
  }
 
 

  private void init(String[][][]stringTag,String str) throws Exception{
    ts = new TreeSet<Entity>();
    llis = new LinkedList<Instance>();
    fc = new FormChanger();
    test = new InstanceSet(cl.getPipe());
    test.loadThruPipes(new AR_Reader(stringTag,str));
    for(int i=0;i<test.size();i++){
      String ss = cl.getStringLabel(test.getInstance(i));
      if(ss.equals("1")){
        llis.add(test.getInstance(i));
     
    }
    fc.groupToList(llis);
    fc.getLlsb();
    ts = fc.getTs();
  }
 
 
  private LinkedList<EntityGroup> doIt(LinkedList<Entity> entityList, LinkedList<EntityGroup> arGroup){
    LinkedList<Entity> ll =null;
    int flag = 0;Entity re =null;Entity re1 =null;
    int i = this.ts.size();int j =0;
    WeightGetter wp = null;
    EntityGroup reg =null;
    EntityGroup reg1 =null;
    while(flag!=i-j){
      flag =0;
      ll = new LinkedList<Entity>();
      Iterator<Entity> it = this.ts.iterator();
      while(it.hasNext()){
        flag++;
        re = it.next();
        if(!re.getIsResolution()){
          ll.add(re);
        }
        else{
          j++;
          it.remove();
          break;
        }         
      }
      if(flag==i-j&&!re.getIsResolution())
        break;
      it = ll.iterator();
      int ii = -1000;
      while(it.hasNext()){
        re1 = it.next();     
        reg = new EntityGroup(re1,re);
        wp = new WeightGetter(reg);
        if(wp.getWeight()>=ii){
          ii = wp.getWeight();
          reg1 =reg;
          reg1.setWeight(ii);
        }
      }
      if(reg1!=null){
        if(reg1.getWeight()<-100)
        continue;
        arGroup.add(reg1);
      }
    }
    return arGroup;
  }
}
TOP

Related Classes of org.fnlp.nlp.cn.anaphora.Anaphora

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.