如何从tsv文件训练斯坦福CRF NER

时间:2015-04-21 18:08:15

标签: machine-learning nlp stanford-nlp sentiment-analysis named-entity-recognition

我希望训练自己的模型,例如这个字符串我需要通过我训练有素的模型:“49本杂志关于丰田兰德酷路泽的文章1956-1987黄金投资组合http://t.co/EqxmY1VmLg http://t.co/F0Vefuoj9Q

tsv文件如下所示:

Toyota  PERS
Land    PERS

当我通过该程序运行时:

public static void main(String[] args) {
        String serializedClassifier2 = "C:/standford-ner/ner-model.ser.gz";
      try {
            NERClassifierCombiner classifier = new NERClassifierCombiner(false, false, 
                     serializedClassifier2);
            String ss = "Book of 49 Magazine Articles on Toyota Land Cruiser 1956-1987 Gold Portfolio http://t.co/EqxmY1VmLg http://t.co/F0Vefuoj9Q";
            System.out.println("---");
            List<List<CoreLabel>> out = classifier.classify(ss);
            for (List<CoreLabel> sentence : out) {
              for (CoreLabel word : sentence) {
                System.out.print(word.word() + '/' + word.get(AnswerAnnotation.class) + ' ');
              }
              System.out.println();
            }


        } catch (ClassCastException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

以下是我得到的输出:

Book/PERS of/PERS 49/O Magazine/PERS Articles/PERS on/O Toyota/PERS Land/PERS Cruiser/O 1956-1987/PERS Gold/PERS Portfolio/PERS http://t.co/EqxmY1VmLg/PERS http://t.co/F0Vefuoj9Q/PERS 

对我来说,输出是错误的。我需要Book/O of/O。我不确定它是如何获得这个价值的,例如我的tsv文件中没有提到“book”。我在tsv文件中没有提到的词应该是O。这个tsv文件只是一个开始;我还有更多的话需要补充。

1 个答案:

答案 0 :(得分:1)

您已经提供了分类器培训数据,其中100%的数据是一个类:PERS。由于100%的培训数据都是该课程,因此它将为您提供100%的课程作业。

对于算法,O只是另一个类。您没有给出O的示例,因此它不会将其归类为O

Stanford NER CRF FAQ提供an example of training data

CHAPTER O
I   O
Emma    PERS
Woodhouse   PERS
,   O
handsome    O
,   O
clever  O
,   O
and O
rich    O
,   O
with    O
a   O
comfortable O
home    O
...

所以你可以看到,在那里,他们用O类的大量例子标记每个 in situ 的标记。我并不完全熟悉CRF分类器的工作方式,但我怀疑您需要为其提供实际数据,并对其进行适当标记,而不仅仅是目标类成员示例列表。

这又引出了另一个问题 - 如果您只想匹配此任务的字符串,为什么使用NER?为什么不匹配字符串?如果那是你的目标,那么就可以省去严重的麻烦,跳过复杂的NLP。您可以更快地获得结果,更容易手动调整。