用斯坦福分析器解析凌乱的文本

时间:2014-05-22 17:32:01

标签: java error-handling machine-learning nlp stanford-nlp

我在大量文本上运行Stanford Parser。解析器在遇到无法解析的句子时终止,并给出以下运行时错误。有没有办法让Stanford Parser忽略错误,继续解析下一句话?

一种方法是将文本分解为无数的单句文档,并解析每个文档并记录输出。但是,这涉及多次加载斯坦福分析器(每次解析文档时,必须重新加载斯坦福分析器)。加载解析器需要花费大量时间,但解析时间要短得多。找到一种避免在每个句子上重新加载解析器的方法会很棒。

另一个解决方案可能是在遇到错误时重新加载解析器,然后拾取停止的文本并继续从那里解析。有谁知道实现这个解决方案的好方法?

最后但并非最不重要的是,是否存在任何忽略错误并保持Java程序运行直到程序自然终止的Java包装器?

谢谢!

Exception in thread "main" java.lang.RuntimeException: CANNOT EVEN CREATE ARRAYS OF ORIGINAL SIZE!!
at edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.considerCreatingArrays(ExhaustivePCFGParser.java:2190)
at edu.stanford.nlp.parser.lexparser.ExhaustivePCFGParser.parse(ExhaustivePCFGParser.java:347)
at edu.stanford.nlp.parser.lexparser.LexicalizedParserQuery.parseInternal(LexicalizedParserQuery.java:258)
at edu.stanford.nlp.parser.lexparser.LexicalizedParserQuery.parse(LexicalizedParserQuery.java:536)
at edu.stanford.nlp.parser.lexparser.LexicalizedParserQuery.parseAndReport(LexicalizedParserQuery.java:585)
at edu.stanford.nlp.parser.lexparser.ParseFiles.parseFiles(ParseFiles.java:213)
at edu.stanford.nlp.parser.lexparser.ParseFiles.parseFiles(ParseFiles.java:73)
at edu.stanford.nlp.parser.lexparser.LexicalizedParser.main(LexicalizedParser.java:1535)

2 个答案:

答案 0 :(得分:4)

此错误基本上是内存不足错误。这可能是因为有很长的文本没有句子终止标点符号(句号,问号),所以它一直在并且正在尝试解析它认为是单个句子的大量单词。

解析器通常会在解析失败后尝试继续,但在这种情况下无法解决,因为它无法创建用于解析较长句子的数据结构,然后无法重新创建先前使用的数据结构。所以,你需要做点什么。

选择是:

  • 自己指出句子/短文档边界。这样做需要多次加载解析器(你应该避免这种情况)。从命令行,您可以将每个句子放在一个文件中,并为解析器提供许多文档进行解析,并要求它将它们保存在不同的文件中(参见-writeOutputFiles选项)。
  • 或者(也许更好)你可以通过将句子分成每行一个,或者使用围绕每个句子的简单XML / SGML样式标签然后使用-sentences newline或{ {1}}。
  • 或者您可以通过指定最大句子长度来避免此问题。不会被判刑的更长的事情将被跳过。 (这对运行时也很有用!)您可以使用-parseInside ELEMENT
  • 执行此操作
  • 如果您正在编写自己的程序,则可以捕获此异常并尝试恢复。但只有在有足够的内存可用时才会成功,除非你采取前面的要点中的步骤。

答案 1 :(得分:0)

Parser已知很慢。您可以尝试使用浅解析器,这将比完整版本更快。如果您只需要POS标签,那么请考虑使用tagger。创建一个静态的解析器实例,并反复使用它,然后重新加载。 <> Q-24