斯坦福解析器无法阅读德语变音符号

时间:2016-03-31 23:10:22

标签: parsing stanford-nlp

stanford解析器(http://nlp.stanford.edu/software/lex-parser.html),版本3.6.0,附带用于英语,德语和其他语言的训练语法。为了解析德语文本,stanford解析器提供了工具lexparser-lang.sh

./lexparser-lang.sh
Usage: lexparser-lang.sh lang len grammar out_file FILE...

  lang       : Language to parse (Arabic, English, Chinese, German, French)
  len        : Maximum length of the sentences to parse
  grammar    : Serialized grammar file (look in the models jar)
  out_file   : Prefix for the output filename
  FILE       : List of files to parse

所以我用这些选项称呼它:

sadik@sadix:stanford-parser-full-2015-12-09$ ./lexparser-lang.sh German 500 edu/stanford/nlp/models/lexparser/germanFactored.ser.gz factored german_test.txt

输入文件german_test.txt包含一个德语句子:

Fußball findet um 8 Uhr in der Halle statt.

但是“ß”会导致警告和错误的结果。与“ä”,“ö”和“ü”相同。现在,lexparser-lang.sh应该被设计为处理德语文本作为输入。我有什么选择吗?

如何:

[main] INFO edu.stanford.nlp.parser.lexparser.LexicalizedParser - Loading parser from serialized file edu/stanford/nlp/models/lexparser/germanFactored.ser.gz ... 
 done [3.8 sec].
Parsing file: german_test.txt
Apr 01, 2016 12:48:45 AM edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable:  (U+9F, decimal: 159)
Parsing [sent. 1 len. 11]: Fuà ball findet um 8 Uhr in der Halle statt .
Parsed file: german_test.txt [1 sentences].
Parsed 11 words in 1 sentences (32.07 wds/sec; 2.92 sents/sec).

使用看起来像垃圾的解析树:

(S (ADV FuÃ) (ADV ball) (VVFIN findet)
  (PP (APPR um) (CARD 8) (NN Uhr))
  (PP (APPR in) (ART der) (NN Halle))
  (PTKVZ statt) ($. .))

应该如何

当写成“Fussball”时,没有问题(正确的拼写错误除外)

[main] INFO edu.stanford.nlp.parser.lexparser.LexicalizedParser - Loading parser from serialized file edu/stanford/nlp/models/lexparser/germanFactored.ser.gz ... 
     done [3.5 sec].
    Parsing file: german_test.txt
    Parsing [sent. 1 len. 10]: Fussball findet um 8 Uhr in der Halle statt .
    Parsed file: german_test.txt [1 sentences].
    Parsed 10 words in 1 sentences (40.98 wds/sec; 4.10 sents/sec).

正确的树:

(S (NN Fussball) (VVFIN findet)
  (PP (APPR um) (CARD 8) (NN Uhr))
  (PP (APPR in) (ART der) (NN Halle))
  (PTKVZ statt) ($. .))

1 个答案:

答案 0 :(得分:1)

演示脚本未运行具有正确字符集的标记生成器。因此,如果您的文本是预先标记的,您可以添加选项“-tokenized”,它只会使用空格作为标记分隔符。

您还想告诉解析器为德语使用“-encoding ISO-8859-1”。

这是完整的java命令(改变.sh脚本中的命令):

java -Xmx2g -cp "./*" edu.stanford.nlp.parser.lexparser.LexicalizedParser -maxLength 500 -tLPP edu.stanford.nlp.parser.lexparser.NegraPennTreebankParserParams -hMarkov 1 -vMarkov 2 -vSelSplitCutOff 300 -uwm 1 -unknownSuffixSize 2 -nodeCleanup 2 -writeOutputFiles -outputFilesExtension output.500.stp -outputFormat "penn" -outputFormatOptions "removeTopBracket,includePunctuationDependencies" -encoding ISO_8859-1 -tokenized -loadFromSerializedFile edu/stanford/nlp/models/lexparser/germanFactored.ser.gz german_example.txt

我得到了这个输出:

(NUR
  (S (NN Fußball) (VVFIN findet)
    (PP (APPR um) (CARD 8) (NN Uhr))
    (PP (APPR in) (ART der) (NN Halle) (ADJA statt.))))

再次更新:

确保将“statt”分开。进入“statt。”因为我们现在说令牌是白色空间分开的。如果我们应用此修复程序,我们将进行此解析:

(S (NN Fußball) (VVFIN findet)
  (PP (APPR um) (CARD 8) (NN Uhr))
  (PP (APPR in) (ART der) (NN Halle))
  (PTKVZ statt) ($. .))

总而言之,问题是我们需要告诉PTBTokenizer使用ISO_8859-1和LexicalizedParser来使用ISO_8859-1。

我建议只使用完整的管道来实现这一目标。

  1. 从这里下载Stanford CoreNLP 3.6.0:

    http://stanfordnlp.github.io/CoreNLP/

  2. 从这里下载德国模型罐:

    http://stanfordnlp.github.io/CoreNLP/download.html

  3. 运行此命令:

    java -Xmx3g -cp "stanford-corenlp-full-2015-12-09/*:stanford-corenlp-3.6.0-models-german.jar" edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,parse -props StanfordCoreNLP-german.properties -file german_example_file.txt -outputFormat text
    
  4. 这将标记化并解析文本并使用正确的字符编码。