Netbeans 斯坦福·内尔:我可以在代码中同时使用两个分类器吗?

Netbeans 斯坦福·内尔:我可以在代码中同时使用两个分类器吗?,netbeans,classification,stanford-nlp,Netbeans,Classification,Stanford Nlp,在我的代码中,我从第一个分类器中获得了Person识别,对于我创建的第二个分类器,我添加了一些单词以被识别或注释为组织,但它不注释Person 我需要从他们两个那里得到好处,我怎么能做到呢 我使用的是Netbeans,代码如下: String serializedClassifier = "classifiers/english.all.3class.distsim.crf.ser.gz"; String serializedClassifier2 = "/Users/ha/stanford-n

在我的代码中,我从第一个分类器中获得了Person识别,对于我创建的第二个分类器,我添加了一些单词以被识别或注释为组织,但它不注释Person

我需要从他们两个那里得到好处,我怎么能做到呢

我使用的是Netbeans,代码如下:

String serializedClassifier = "classifiers/english.all.3class.distsim.crf.ser.gz";
String serializedClassifier2 = "/Users/ha/stanford-ner-2014-10-26/classifiers/dept-model.ser.gz";

if (args.length > 0) {
  serializedClassifier = args[0];
}

AbstractSequenceClassifier<CoreLabel> classifier = CRFClassifier.getClassifier(serializedClassifier);
AbstractSequenceClassifier<CoreLabel> classifier2 = CRFClassifier.getClassifier(serializedClassifier2);

  String fileContents = IOUtils.slurpFile("/Users/ha/NetBeansProjects/NERtry/src/nertry/input.txt");
  List<List<CoreLabel>> out = classifier.classify(fileContents);
  List<List<CoreLabel>> out2 = classifier2.classify(fileContents);

  for (List<CoreLabel> sentence : out) {
      System.out.print("\nenglish.all.3class.distsim.crf.ser.gz: ");
    for (CoreLabel word : sentence) {
      System.out.print(word.word() + '/' + word.get(CoreAnnotations.AnswerAnnotation.class) + ' ');
    }

  for (List<CoreLabel> sentence2 : out2) {
      System.out.print("\ndept-model.ser.gz");
    for (CoreLabel word2 : sentence2) {
      System.out.print(word2.word() + '/' + word2.get(CoreAnnotations.AnswerAnnotation.class) + ' ');
    }

    System.out.println();
  }
}
它从第二个分类器中将名称识别为组织,我需要将其注释为PERSON。
有什么帮助吗?

我不太确定这里的问题是什么。您已经有了两个分类器的输出。也许这更像是一个Java问题,即如何进行迭代

Iterator it1=out1.Iterator();
迭代器it2=out2.Iterator();
while(it1.hasNext()&&it2.hasNext()){
列表语句1=it1.next();
列表语句2=it1.next();
迭代器语句1it=sentence1.Iterator();
迭代器语句2it=sentence2.Iterator();
while(sentence1It.hasNext()&&sentence2It.hasNext()){
CoreLabel word1=sentence1It.next();
CoreLabel word2=sentence2It.next();
System.out.print(“\nenglish.all.3class.distsim.crf.ser.gz:”);
System.out.print(word1.word()+'/'+
get(CoreAnnotations.AnswerAnnotation.class)+'';
System.out.print(“\ndept model.ser.gz”);
System.out.print(word2.word()+'/'+
get(CoreAnnotations.AnswerAnnotation.class)+'';
}
System.out.println();
}

您应该使用的类是
NERClassifierCombiner
。它的语义是,当您指定分类器时,它按从左到右的顺序运行分类器(可以在构造函数中为其指定任何数字),并且后面的分类器不能对与前面分类器的实体标记重叠的实体进行注释,但可以自由添加注释。因此,在简单的偏好排序中,更倾向于使用早期分类器。下面我给出一个完整的代码示例

(如果您要训练所有自己的分类器,通常最好将所有实体一起训练,这样它们可以在指定的类别中相互影响。但这种简单的偏好排序通常效果很好,我们自己也会使用。)

import edu.stanford.nlp.ie.nerrclassifiercombiner;
导入edu.stanford.nlp.io.IOUtils;
导入edu.stanford.nlp.ling.corelab;
导入java.io.IOException;
导入java.util.List;
公共类多路复用器{
公共静态void main(字符串[]args)引发IOException{
String serializedClassifier=“classifiers/english.all.3class.distsim.crf.ser.gz”;
String serializedClassifier2=“classifiers/english.muc.7class.distsim.crf.ser.gz”;
如果(args.length>0){
serializedClassifier=args[0];
}
NERClassifierCombiner分类器=新的NERClassifierCombiner(假,假,
serializedClassifier,serializedClassifier2);
字符串fileContents=IOUtils.slurpFile(“input.txt”);
列出=分类器。分类(文件内容);
int i=0;
对于(列表lcl:out){
i++;
int j=0;
用于(CoreLabel cl:lcl){
j++;
System.out.printf(“%d:%d:%s%n”,i,j,
cl.ToSorterString(“文本”、“CharacterOffsetBegin”、“CharacterOffsetEnd”、“NamedEntityTag”);
}
}
}
}

我已经编辑了这个问题,从结果中你可以看到我得到了不同的注释,例如“James”,因此如果我的代码依赖于person的注释,它将失败。这就是为什么我需要一个解决方案。太好了!这就是我需要的。谢谢。再次你好@Christopher_Manning。我使用“english.all.3class.distsim”作为第一个序列化分类器,然后使用经过训练的分类器作为第二个。但它没有从我自己的分类器中识别出组织。但当我改变订单时,我得到的是组织的认可,而不是人!我做错了什么?
english.all.3class.distsim.crf.ser.gz: What/O date/O did/O James/PERSON started/O his/O job/O in/O Human/O and/O Finance/O ?/O 
dept-model.ser.gzWhat/O date/O did/O James/ORGANIZATION started/O his/O job/O in/O Human/ORGANIZATION and/O Finance/ORGANIZATION ?/O 
Iterator<List<CoreLabel>> it1 = out1.iterator();
Iterator<List<CoreLabel>> it2 = out2.iterator();
while(it1.hasNext() && it2.hasNext()) {
   List<CoreLabel> sentence1 = it1.next();
   List<CoreLabel> sentence2 = it1.next();
   Iterator<CoreLabel> sentence1It = sentence1.iterator();
   Iterator<CoreLabel> sentence2It = sentence2.iterator();
   while(sentence1It.hasNext() && sentence2It.hasNext()) {
       CoreLabel word1 = sentence1It.next();
       CoreLabel word2 = sentence2It.next();
       System.out.print("\nenglish.all.3class.distsim.crf.ser.gz: ");
       System.out.print(word1.word() + '/' +
         word1.get(CoreAnnotations.AnswerAnnotation.class) + ' ');
       System.out.print("\ndept-model.ser.gz");
       System.out.print(word2.word() + '/' + 
         word2.get(CoreAnnotations.AnswerAnnotation.class) + ' ');
   }
   System.out.println();
}
import edu.stanford.nlp.ie.NERClassifierCombiner;
import edu.stanford.nlp.io.IOUtils;
import edu.stanford.nlp.ling.CoreLabel;

import java.io.IOException;
import java.util.List;

public class MultipleNERs {

  public static void main(String[] args) throws IOException {
    String serializedClassifier = "classifiers/english.all.3class.distsim.crf.ser.gz";
    String serializedClassifier2 = "classifiers/english.muc.7class.distsim.crf.ser.gz";

    if (args.length > 0) {
      serializedClassifier = args[0];
    }

    NERClassifierCombiner classifier = new NERClassifierCombiner(false, false, 
            serializedClassifier, serializedClassifier2);

    String fileContents = IOUtils.slurpFile("input.txt");
    List<List<CoreLabel>> out = classifier.classify(fileContents);

    int i = 0;
    for (List<CoreLabel> lcl : out) {
      i++;
      int j = 0;
      for (CoreLabel cl : lcl) {
        j++;
        System.out.printf("%d:%d: %s%n", i, j,
                cl.toShorterString("Text", "CharacterOffsetBegin", "CharacterOffsetEnd", "NamedEntityTag"));
      }
    }
  }

}