Chr*_*ris 2 java performance nlp sentence opennlp
我有一套文章描述,我必须将文本分成句子.第一个实现使用opennlp工具sentdetect,它工作得非常好,但对我来说太慢了.有没有类似的东西表现得更快,并且质量相似或略差的结果?
注意:我正在使用(大量的)简短的德语文本.
是的,这有助于提及你正在与德国人合作:)
可以在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)同时检查否决方法"检查可能的匹配是否被非分割匹配否决.如果与否决区域有任何重叠,则可能的匹配被否决."
希望这可以帮助.