快速将文本拆分成句子(Java)

Chr*_*ris 2 java performance nlp sentence opennlp

我有一套文章描述,我必须将文本分成句子.第一个实现使用opennlp工具sentdetect,它工作得非常好,但对我来说太慢了.有没有类似的东西表现得更快,并且质量相似或略差的结果?

注意:我正在使用(大量的)简短的德语文本.

Yas*_*sen 7

是的,这有助于提及你正在与德国人合作:)

可以在GATE中找到带有缩写列表的基于正则表达式的句子检测器.它使用位于此处的三个文件.正则表达式非常简单:

//more than 2 new lines
(?:[\u00A0\u2007\u202F\p{javaWhitespace}&&[^\n\r]])*(\n\r|\r\n|\n|\r)(?:(?:[\u00A0\u2007\u202F\p{javaWhitespace}&&[^\n\r]])*\1)+

//between 1 and 3 full stops
\.{1,3}"?

//up to 4 ! or ? in sequence
(!|\?){1,4}"?
Run Code Online (Sandbox Code Playgroud)

可以在此处找到使用这3个文件的代码.

我会用在网上找到的东西来增强正则表达式,比如这个.

然后我会想到GATE列表中所有单词的德语翻译.如果这还不够,我会去通过一些这些缩写的列表:1,2,创造我自己的名单.

编辑:

如果性能如此重要,我不会将整个GATE用于句子分割器 - 需要时间和内存来切换到他们的文档,创建注释,然后再解析它们等等.

我认为最好的方法是从RegexSentenceSplitter类(上面链接)获取代码并根据您的上下文进行调整.

我认为代码太长了,无法在此处粘贴.你应该看到execute()方法.通常,它会查找内部,外部和阻塞正则表达式的所有匹配项,然后迭代并仅使用那些不与任何阻塞重叠的内部和外部.

以下是您应该查看/重用的一些片段:

  • 如何解析文件

    // for each line
    if(patternString.length() > 0) patternString.append("|");
    patternString.append("(?:" + line + ")");
    
    //...
    return Pattern.compile(patternString.toString());
    
    Run Code Online (Sandbox Code Playgroud)
  • 在execute方法中,如何填充阻塞拆分:

    Matcher nonSplitMatcher = nonSplitsPattern.matcher(docText);
    //store all non split locations in a list of pairs
    List<int[]> nonSplits = new LinkedList<int[]>();
    while(nonSplitMatcher.find()){
       nonSplits.add(new int[]{nonSplitMatcher.start(), nonSplitMatcher.end()});
    }
    
    Run Code Online (Sandbox Code Playgroud)

同时检查否决方法"检查可能的匹配是否被非分割匹配否决.如果与否决区域有任何重叠,则可能的匹配被否决."

希望这可以帮助.