【问题标题】:Parsing messy texts with Stanford Parser使用 Stanford Parser 解析凌乱的文本
【发布时间】:2014-07-11 21:23:44
【问题描述】:

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

一种方法是将文本分解成无数的单句文档,解析每个文档并记录输出。但是,这涉及多次加载 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)

【问题讨论】:

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


【解决方案1】:

众所周知,解析器很慢。您可以尝试使用浅解析器,它会比完整版本相对更快。如果您只需要 POS 标记,请考虑使用标记器。创建解析器的静态实例并一遍又一遍地使用它,而不是重新加载。 Q-24

【讨论】:

    【解决方案2】:

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

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

    选择是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多