【问题标题】:CoreNLP Sentiment training data in wrong formatCoreNLP 情绪训练数据格式错误
【发布时间】:2017-11-11 12:11:13
【问题描述】:

我正在尝试为 corenlp 训练我自己的情绪分析模型。我想在 java 代码中执行此操作(而不是从命令行),所以我从 https://github.com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/sentiment/BuildBinarizedDataset.java 复制片段以准备数据,然后从 https://github.com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/sentiment/SentimentTraining.java 复制一些片段以进行实际训练。我将前一个链接的代码,第 171-226 行在我自己的代码中(以了解发生了什么)压缩为以下内容:

String text = IOUtils.slurpFileNoExceptions(inputPath);
    String[] chunks = text.split("\\n\\s*\\n+"); // need blank line to
    for (String chunk : chunks) {
        if (chunk.trim().isEmpty()) {
            continue;
        }
        String[] lines = chunk.trim().split("\\n");
        String sentence = lines[0];
        StringReader sin = new StringReader(sentence);
        DocumentPreprocessor document = new DocumentPreprocessor(sin);
        document.setSentenceFinalPuncWords(new String[] { "\n" });
        List<HasWord> tokens = document.iterator().next();
        Integer mainLabel = new Integer(tokens.get(0).word());
        tokens = tokens.subList(1, tokens.size());
        Map<Pair<Integer, Integer>, String> spanToLabels = Generics.newHashMap();
        for (int i = 1; i < lines.length; ++i) {
            extractLabels(spanToLabels, tokens, lines[i]);
        }
        Tree tree = parser.apply(tokens);
        Tree binarized = binarizer.transformTree(tree);
        Tree collapsedUnary = transformer.transformTree(binarized);
        if (sentimentModel != null) {
            Trees.convertToCoreLabels(collapsedUnary);
            SentimentCostAndGradient scorer = new SentimentCostAndGradient(sentimentModel, null);
            scorer.forwardPropagateTree(collapsedUnary);
            setPredictedLabels(collapsedUnary);
        } else {
            setUnknownLabels(collapsedUnary, mainLabel);
        }
        Trees.convertToCoreLabels(collapsedUnary);
        collapsedUnary.indexSpans();
        for (Map.Entry<Pair<Integer, Integer>, String> pairStringEntry : spanToLabels.entrySet()) {
            setSpanLabel(collapsedUnary, pairStringEntry.getKey(), pairStringEntry.getValue());
        }

        //trainingTrees.add(collapsedUnary);
        System.out.println("Debugging collaped Unary:" + collapsedUnary);
    }

println 给了我类似的东西:

> Debugging collaped Unary:(ROOT (NP (DT The) (NNS performances)) (@S (VP (VBP are) (ADJP (RB uniformly) (JJ good))) (. .)))

然而,据我了解,它应该是这样的(至于格式,抱歉在这里复制另一个句子)):

(3 (2 (2 The) (2 Rock)) (4 (3 (2 is) (4 (2 destined) (2 (2 (2 (2 (2

https://mailman.stanford.edu/pipermail/java-nlp-user/2013-November/004308.htmlstanford corenlp sentiment training setHow to train the Stanford NLP Sentiment Analysis tool 等中所述。

在 BuildBinarizedDataset 中的这些行之后没有任何反应。有人能告诉我如何把它变成正确的格式吗? (在这里我自己一起破解一些东西感觉很愚蠢,而且一定有我遗漏的东西。)

即我稍后在 SentimentTraining 中遇到的错误是:

Exception in thread "main" java.lang.NumberFormatException: For input string: "DT"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.valueOf(Integer.java:766)
at edu.stanford.nlp.sentiment.SentimentUtils.attachLabels(SentimentUtils.java:37)
at edu.stanford.nlp.sentiment.SentimentUtils.attachLabels(SentimentUtils.java:33)
at edu.stanford.nlp.sentiment.SentimentUtils.attachLabels(SentimentUtils.java:33)
at edu.stanford.nlp.sentiment.SentimentUtils.readTreesWithLabels(SentimentUtils.java:69)
at edu.stanford.nlp.sentiment.SentimentUtils.readTreesWithGoldLabels(SentimentUtils.java:50)
at de.dkt.eservices.esentimentanalysis.modules.CoreNLPSentimentAnalyzer.trainModel(CoreNLPSentimentAnalyzer.java:251)
at de.dkt.eservices.esentimentanalysis.modules.CoreNLPSentimentAnalyzer.main(CoreNLPSentimentAnalyzer.java:306)

这是有道理的,因为它需要一个数字,但会获取树中节点的标签...

如果有任何指点,将不胜感激!

【问题讨论】:

    标签: stanford-nlp


    【解决方案1】:

    尚未找到真正的解决方案,但万一其他人遇到此问题,以下方法可以解决问题:

    public static Tree traverseTreeAndChangePosTagsToNumbers(Tree tree) {
    
        for (Tree subtree : tree.getChildrenAsList()) {
            if (subtree.label().toString().matches("\\D+")) { 
                subtree.label().setValue("2");
    
            }if (Integer.parseInt(subtree.label().toString())<0||Integer.parseInt(subtree.label().toString())>4){
                subtree.label().setValue("2");
            }
            if (!(subtree.isPreTerminal())) {
                traverseTreeAndChangePosTagsToNumbers(subtree);
            }
        }
    
        return tree;
    }
    

    不是一个真正体面的解决方案,因为它不承认提供情绪范围的选项(即在树中注释子短语,因为子短语的数量始终为 2(中性)),因此情绪始终基于值对于整个句子/树,但至少它摆脱了语法错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多