强制stanford解析器接受未经解析器词典许可的POS标签

时间:2011-06-09 22:11:41

标签: java parsing stanford-nlp

我有一个预先判断的句子文件,其中一些是命令式的(隐式主语,动词优先等)。在没有任何部分标记的情况下,stanford解析器错误地将第一个单词(动词)标记为这些命令句中的大多数(但不是全部)主语中的名词。使用部分标记(我相当肯定我做得正确 - 我已编辑并重新编译LexicalizedParser以确保相关的命令行选项被识别并最终在lexicalizedParser.java中的正确位置)在这些句子的第一个单词上(使用_VB),它的行为 no 与标记不存在的行为不同。

根据lexparser package summary(在页面下方大约60%的位置“对解释有一些限制......”)这是因为将POS标签VB放在其中一些单词上是对于解析器而言,这太奇怪了。

如何让解析器读取并跟踪所有标记(最好是从命令行)?更新词典?

使用EnglishFactored.ser.gz而不是EnglishPCFG.ser.gz可以减轻这个问题,但它不会消失。

几年前有人向{stanford [parser-user]邮件列表发布了a similar question,但我似乎找不到这篇文章的答案。

编辑: 使用另一个版本的解析器(从2010年8月20日开始),这个问题似乎根本不会发生//。

1 个答案:

答案 0 :(得分:1)

目前还没有办法让解析标签的东西被认为是“太奇怪”了。如果它将单词的标记视为不可能,则无法使其成为可能,但您可以在其所关注的范围内指定应该使用的内容。通常这就足够了。这应该够了。这是一个例子。正如你所指出的那样,它通常在没有帮助的情况下得到了必要的错误(部分原因是它们在训练数据中没有得到很好的证明。它并不总是让它们弄错,但它通常会这样做,而我选择3它确实出错了:< / p>

$ cat imper.txt
Use care when opening.
Brush your hair!
Shut the door.
$ java -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser englishPCFG.ser.gz imper.txt 2> /dev/null
(ROOT
  (S
    (NP (NNP Use))
    (VP (VBP care)
      (SBAR
        (WHADVP (WRB when))
        (S
          (VP (VBG opening)))))
    (. .)))

(ROOT
  (NP
    (NP (NNP Brush))
    (NP (PRP$ your) (NN hair))
    (. !)))

(ROOT
  (NP
    (NP (NNP Shut))
    (NP (DT the) (NN door))
    (. .)))

但是使用这样的标记化和部分标记的文本:

$ cat imper.tok
Use_VB care when opening .
Brush_VB your hair !
Shut_VB the door .

一切都已修复:

$ java -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser -tokenized -tagSeparator _ englishPCFG.ser.gz imper.tok 2> /dev/null
(ROOT
  (S
    (VP (VB Use)
      (NP (NN care))
      (SBAR
        (WHADVP (WRB when))
        (S
          (VP (VBG opening)))))
    (. .)))

(ROOT
  (S
    (VP (VB Brush)
      (NP (PRP$ your) (NN hair)))
    (. !)))

(ROOT
  (S
    (VP (VB Shut)
      (NP (DT the) (NN door)))
    (. .)))

但你必须使用正确的标签。它不会将“使用”标记为VB。这太奇怪了。 “使用”作为动词应该是VBG。它是现在的分词形式,而不是命令式中使用的动词。