我有一组文章描述,我必须将文本分成句子。第一个实现使用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/