当前位置: 首页 > 知识库问答 >
问题:

在CLI和Code中再现Stanford CoreNLP austen演示时的不同精度/召回/f1值

呼延俊风
2023-03-14

我试图用斯坦福CRF常见问题解答中的Jane Austen文件验证我的基于Stanford CoreNLP的java代码。我正在使用以下命令进行CLI中常见问题解答中所述的培训:

# Training with corenlp 3.9.2
java -cp stanford-ner-2018-10-16/stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier -prop austen.prop
# testing with corenlp 3.9.2
java -cp stanford-ner-2018-10-16/stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier \
    -loadClassifier ner-model.ser.gz -testFile jane-austen-emma-ch2.tsv

这给了我以下结果:

CRFClassifier tagged 1999 words in 1 documents at 6227,41 words per second.
         Entity P   R   F1  TP  FP  FN
           PERS 0,8205  0,7273  0,7711  32  7   12
         Totals 0,8205  0,7273  0,7711  32  7   12

现在我有了java代码来训练和测试模型程序:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import edu.stanford.nlp.ie.crf.CRFClassifier;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.sequences.SeqClassifierFlags;
import edu.stanford.nlp.util.Triple;

public class train {
    
    public static void main(String[] args) throws FileNotFoundException, IOException {
    
    System.out.println("Start NER training");
    
    Properties properties = new Properties();
    properties.load(new FileInputStream(new File("data/eval/austen.prop")));
        SeqClassifierFlags flags = new SeqClassifierFlags(properties);
    CRFClassifier<CoreLabel> crf = new CRFClassifier<>(flags);
    
    crf.train();
    
    crf.serializeClassifier("data/eval/ner-model.ser.gz");
    Triple<Double,Double,Double> scores = crf.classifyAndWriteAnswers("data/eval/jane-austen-emma-ch2.tsv", true);
    
    System.out.println("Scores:");
    System.out.format("    Precision:\t%.2f%%\n", scores.first);
    System.out.format("    Recall:\t%.2f%%\n", scores.second);
    System.out.format("    F1:\t\t%.2f%%\n", scores.third);
    System.out.println();

    System.out.println("End NER training done");

    }
}

这为精度/召回率/f1提供了不同的值:

CRFClassifier tagged 1999 words in 1 documents at 12572,33 words per second.
         Entity P   R   F1  TP  FP  FN
           PERS 0,8250  0,7500  0,7857  33  7   11
         Totals 0,8250  0,7500  0,7857  33  7   11
Scores:
    Precision:  82,50%
    Recall: 75,00%
    F1:     78,57%

测试、培训和奥斯汀。道具文件,未经修改,取自斯坦福大学。只有测试文件jane-austen-emma-ch2。tsv按照问题所述进行了修改。

我阅读了斯坦福大学的资料,看看我是否遗漏了什么,但我的价值观没有改变。我错过了什么?

提前谢谢你的帮助。

更新:我做了一些进一步的测试。这绝对是一个训练问题。使用cli训练的模型有一个模式假阴性。我做了一个比较,看看哪个实体没有被检测到:

371,372c371,372
< Miss  PERS    PERS
< Churchill PERS    PERS
---
> Miss  PERS    O
> Churchill PERS    O

是“丘吉尔小姐”。

更新2:找到了。这是edu/stanford/nlp/ie/crf/CRFClassifier.java中的以下行:

crf.knownLCWords.setMaxSize(-1);

不幸的是,该字段不可见。以及crf返回的对象。getKnownLCWords()没有方法setMaxSize()

共有1个答案

公冶才
2023-03-14

进一步阅读CoreNLP源代码,可以找到解决方案。我铸造了crf返回的对象。getKnownLCWords()MaxSizeCurrentHashSet。现在可以使用setMaxSize(),精度/召回率/F1值与使用CoreNLP CLI进行的培训相同。

CRFClassifier<CoreLabel> crf = new CRFClassifier<>(flags);
MaxSizeConcurrentHashSet<String> knownLCWords = (MaxSizeConcurrentHashSet<String>) crf.getKnownLCWords();
knownLCWords.setMaxSize(-1);
crf.train();
 类似资料:
  • 问题内容: 我正在研究情绪分析问题,数据看起来像这样: 所以,我的数据是不平衡的,因为1190标有。对于使用scikit的SVC进行的分类Im 。问题是我不知道如何以正确的方式平衡我的数据,以便准确地计算多类案例的精度,召回率,准确性和f1得分。因此,我尝试了以下方法: 第一: 第二: 第三: 但是,我收到这样的警告: 如何正确处理我的不平衡数据,以便以正确的方式计算分类器的指标? 问题答案: 我

  • 我有一些机器学习的结果,我正试图弄明白。任务是预测/标记“爱尔兰人”与“非爱尔兰人”。Python 2.7的输出: 如您所见,准确率和召回率一般,但AUC-ROC较高(~0.90)。我试图找出原因,我怀疑这是由于数据不平衡(大约1:5)。基于混淆矩阵,并使用Irish作为目标(),我计算了TPR=0.51和FPR=0.04。如果我将非爱尔兰人视为(),那么TPR=0.96,FPR=0.49。那么,

  • 问题内容: 我正在使用Python,并且有一些混淆矩阵。我想通过多类分类中的混淆矩阵来计算精度,召回率和f测度。我的结果日志不包含和,仅包含混淆矩阵。 您能否告诉我如何从多类别分类的混淆矩阵中获得这些分数? 问题答案: 让我们考虑MNIST数据分类(10个类)的情况,对于10,000个样本的测试集,我们得到以下混淆矩阵(Numpy数组): 为了获得精度和召回率( 每类 ),我们需要计算 每类 的T

  • 我不明白为什么浮点值与双精度值不同。从下面的示例来看,对于相同的操作,float 提供的结果似乎与双精度型不同: 输出: 你能解释一下float和double之间的区别吗?

  • 我尝试了使用stanford nlp python软件包和live demo对tweet文本进行情感分析,但结果不同。python包的结果是肯定的,而live demo的结果是否定的。 对于python包,我下载stanford-corenlp-4.0.0并安装py-corenlp,基本按照本答案中的说明:Stanford nlp for python,代码如下所示: 现场演示: 现场演示结果的屏

  • 为什么在添加相同的数字时输出不同? 输出为: 如果我交换值 我得到的输出为:<代码>15.7000000000001 如何获得相同的输出?