docs: public void read(String filePath) throws IOException{
  
  
  		String line;
  		ArrayList<String> words = new ArrayList<String>();
  		ArrayList<String> markP = new ArrayList<String>();
  		ArrayList<String> typeP = new ArrayList<String>();
  		ArrayList<String> markC = new ArrayList<String>();
  		ArrayList<String> typeC = new ArrayList<String>();
  		if(filePath == null)
  			return;
  		File file = new File(filePath);
  		BufferedReader reader = null;
  		entityType = new HashSet<String>();
  
  		//按行读取文件内容，一次读一整行
  		reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
  
  		//从文件中提取实体并存入队列中
  
  		while ((line = reader.readLine()) != null) {
  			line = line.trim();
  			if(line.equals("")){
  
  				newextract(words, markP, typeP, markC, typeC);
  
  
  			}else{
  				//判断实体,实体开始的边界为B-***或者S-***，结束的边界为E-***或N（O）或空白字符或B-***
  				//predict
  				String[] toks = line.split("\\s+");
  
  				int ci = 1;
  				int cj=2;
  
  				if(toks.length>3){//如果列数大于三，默认取最后两列
  					ci=toks.length-2;
  					cj=toks.length-1;
  				}else if(toks.length<3){
  					System.out.println(line);
  					return;
  				}
  
  				String[] marktype = getMarkType(toks[ci]);
  				words.add(toks[0]);
  				markP.add(marktype[0]);
  				typeP.add(marktype[1]);
  				entityType.add(marktype[1]);	
  
  				//correct
  				marktype = getMarkType(toks[cj]);
  				markC.add(marktype[0]);
  				typeC.add(marktype[1]);	
  				entityType.add(marktype[1]);	
  
  			}
  		}
  		reader.close();
  		if(words.size()>0){
  			newextract(words, markP, typeP, markC, typeC);
  		}
  		//从entityPs和entityCs提取正确估计的实体，存到entityCinPs，并更新mpc中的统计信息
  		extractCInPEntity();
  	}