我的环境:
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/