Stanford coreNLP拆分不带空格的段落句子

时间:2019-03-26 08:34:01

标签: java nlp stanford-nlp

我遇到了斯坦福(Stanford)句子注释器的问题。 作为输入,我得到了包含句子的文本,但是在某些部分的点后没有空格。像这样:

  

狗爱猫,猫爱老鼠。鼠标讨厌所有人。

所以当我尝试使用SentenceAnnotator时-我得到2个句子

  

狗爱猫,猫爱老鼠。

     

鼠标讨厌所有人。

这是我的代码

Annotation doc = new Annotation(t);
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,coref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
pipeline.annotate(doc);
List<CoreMap> sentences = doc.get(CoreAnnotations.SentencesAnnotation.class);

我也尝试添加属性

props.setProperty("ssplit.boundaryTokenRegex", "\\.");

但没有效果。

也许我缺少了什么? 谢谢!

UPD 我也尝试使用PTBTokenizer标记文本

PTBTokenizer ptbTokenizer = new PTBTokenizer(
        new FileReader(classLoader.getResource("simplifiedParagraphs.txt").getFile())
        ,new WordTokenFactory()
        ,"untokenizable=allKeep,tokenizeNLs=true,ptb3Escaping=true,strictTreebank3=true,unicodeEllipsis=true");
List<String> strings = ptbTokenizer.tokenize();

但是tokenizer认为cat.Cat是一个单词,不会将其拆分。

1 个答案:

答案 0 :(得分:1)

这是一个管道,句子拆分器将为令牌生成器提供的令牌标识句子边界,但句子拆分器仅将相邻令牌分组为句子,而不会尝试合并或拆分它们。

正如您所发现的,我认为ssplit.boundaryTokenRegex属性将告诉句子拆分器在看到“”时结束句子。作为令牌,但这在令牌生成器未拆分“。”的情况下无济于事。除了将周围的文字放到单独的标记中。

您将需要:

  • 预处理文本(在“ cat”之后插入一个空格),
  • 对令牌或句子进行后处理,以分割这种情况,或者
  • 找到/开发一个令牌生成器,可以将“ cat.Cat”划分为三个令牌。

尚未开发出通常用于报纸文本的标准英语令牌生成器来处理这种文本。

一些相关问题:

Does the NLTK sentence tokenizer assume correct punctuation and spacing?

How to split text into sentences when there is no space after full stop?