我的环境:

  • CoreNLP 3.5.1
  • stanford-chinese-corenlp-2015-01-30-models
  • 中文默认属性文件:StanfordCoreNLP-chinese.properties
  • annotators = segment, ssplit


  • 我的测试文本是 "這是第一個句子。這是第二個句子。"我得到句子
    val sentences = annotation.get(classOf[SentencesAnnotation])
    for (sent <- sentences) {
      count+=1
      println("sentence{$count} = " + sent.get(classOf[TextAnnotation]))
    }
    

    它总是将整个测试文本打印为一个句子,而不是这里预期的两个:
    sentence1 = 這是第一個句子。這是第二個句子。
    

    预期是:
    expected sentence1 = 這是第一個句子。
    expected sentence2 = 這是第二個句子。
    

    如果我添加更多属性,即使是相同的结果:
    ssplit.eolonly = false
    ssplit.isOneSentence = false
    ssplit.newlineIsSentenceBreak = always
    ssplit.boundaryTokenRegex = [.]|[!?]+|[。]|[!?]+
    

    CoreNLP 日志是
    Registering annotator segment with class edu.stanford.nlp.pipeline.ChineseSegmenterAnnotator
    Adding annotator segment
    Loading Segmentation Model [edu/stanford/nlp/models/segmenter/chinese/ctb.gz]...Loading classifier from edu/stanford/nlp/models/segmenter/chinese/ctb.gz ... Loading Chinese dictionaries from 1 files:
      edu/stanford/nlp/models/segmenter/chinese/dict-chris6.ser.gz
    
    loading dictionaries from edu/stanford/nlp/models/segmenter/chinese/dict-chris6.ser.gz...Done. Unique words in ChineseDictionary is: 423200
    done [56.9 sec].
    done. Time elapsed: 57041 ms
    Adding annotator ssplit
    Adding Segmentation annotation...output: [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
    INFO: TagAffixDetector: useChPos=false | useCTBChar2=true | usePKChar2=false
    INFO: TagAffixDetector: building TagAffixDetector from edu/stanford/nlp/models/segmenter/chinese/dict/character_list and edu/stanford/nlp/models/segmenter/chinese/dict/in.ctb
    Loading character dictionary file from edu/stanford/nlp/models/segmenter/chinese/dict/character_list
    Loading affix dictionary from edu/stanford/nlp/models/segmenter/chinese/dict/in.ctb
    這是第一個句子。這是第二個句子。
    --->
    [這是, 第一, 個, 句子, 。, 這是, 第二, 個, 句子, 。]
    done. Time elapsed: 419 ms
    

    曾经看到someone得到如下日志(CoreNLP 3.5.0);但奇怪的是我没有这个日志:
    Adding annotator ssplit edu.stanford.nlp.pipeline.AnnotatorImplementations:ssplit.boundaryTokenRegex=[.]|[!?]+|[。]|[!?]+
    

    有什么问题 ?有解决方法吗?如果无法解决,我可以自己拆分,但我不知道如何将拆分集成到 CoreNLP 管道中。

    最佳答案

    好的,我完成了一个解决方法。

    自己定义 ssplit 注释器。

    为了方便起见,我在这里对参数进行了硬编码,尽管正确的方法应该解析 Prop 。

    class MyWordsToSentencesAnnotator extends WordsToSentencesAnnotator(
      true,
      "[.]|[!?]+|[。]|[!?]+",
      null,
      null,
      "never") {
      def this(name: String, props: Properties) { this() }
    }
    

    并在属性文件中指定类。
    customAnnotatorClass.myssplit = ...
    

    显然,我猜默认的 CoreNLP 管道设置或代码有错误?

    关于nlp - 斯坦福 NLP CoreNLP 不为中文做句子拆分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29542569/

    10-12 22:42