我试图用斯坦福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()
。
进一步阅读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 如何获得相同的输出?