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

标签 java performance nlp opennlp sentence

我有一组文章描述,我必须将文本分成句子。第一个实现使用opennlp工具sentDetect,它工作得很好,但对于我的目的来说太慢了。 是否有类似的东西,其执行速度更快,但结果的质量相似或稍差?

注意:我正在处理(大量)简短的经过编辑的德语文本。

最佳答案

是的,提及您正在使用德语工作会有所帮助:)

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

//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}"?

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

我会使用网络上可以找到的内容来增强正则表达式,例如 this one .

然后我会想到 GATE 列表中单词的所有德语翻译。如果这还不够,我会浏览一些缩写列表:1 , 2 ,并自行创建列表。

编辑:

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

我认为对您来说最好的方法是从 RegexSentenceSplitter 类( link above )获取代码并根据您的上下文进行调整。

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

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

  • 如何解析文件

    // for each line
    if(patternString.length() > 0) patternString.append("|");
    patternString.append("(?:" + line + ")");
    
    //...
    return Pattern.compile(patternString.toString());
    
  • 在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()});
    }
    

还要检查 veto 方法,该方法“检查可能的匹配是否被非分割匹配否决。如果可能的匹配与否决区域有任何重叠,则可能的匹配将被否决。”

希望这有帮助。

关于java - 快速将文本拆分成句子(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22905919/

相关文章:

java - 由于明显的类路径冲突而导致 jersey WadlAutoDiscoverable 转换错误?

performance - 在 O(1) 时间内检索堆栈中的最小元素

python - 如何阅读基于选区的解析树

nlp - 从实体和词性标记文本中寻找原因/提取信息

java - 从点创建 java.awt.geom.Area

java - 通过按钮更改数组中的 TextView 内容

android - XML 布局与代码布局的性能?

python - 使用来自 NLTK 的斯坦福解析器的依赖树结果与斯坦福解析器不匹配

java - 使用 recyclerview "No Adapter Attached"设置适配器时即将到来

performance - 搜索模式以创建用于高性能消息传递的 TCP 连接池