代码之家  ›  专栏  ›  技术社区  ›  Danila Zharenkov

Stanford Corenlp无空格分段句子

  •  0
  • Danila Zharenkov  · 技术社区  · 6 年前

    我遇到了斯坦福的句子注释器的问题。 作为一个输入,我得到了文本,其中包含句子,但在它的一些部分后没有空白点。这样地:

    狗爱猫,猫爱老鼠。老鼠讨厌每个人。

    所以当我试着用句子注释器的时候-我得到了两个句子

    狗爱猫,猫爱老鼠。

    老鼠讨厌每个人。

    这是我的密码

    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是一个单词,不会分割它。

    0 回复  |  直到 6 年前
        1
  •  1
  •   aab    6 年前

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

    正如你所发现的,我认为 ssplit.boundaryTokenRegex 属性将告诉句子拆分器在将“.”视为标记时结束句子,但如果标记赋予器未将“.”与周围文本拆分为单独的标记,则这无助于执行此操作。

    您需要:

    • 预处理文本(在“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?