Stanford nlp CoreNLP标记器/句子拆分器在HTML输入上行为不正常
我从命令行使用Stanford CoreNLP管道来解析一个大型文档的依赖关系,文档中的每一行都接收其自己的依赖关系树(否则其他内容将无法对齐),这一点非常重要。这两句话现在让我很伤心:Stanford nlp CoreNLP标记器/句子拆分器在HTML输入上行为不正常,stanford-nlp,Stanford Nlp,我从命令行使用Stanford CoreNLP管道来解析一个大型文档的依赖关系,文档中的每一行都接收其自己的依赖关系树(否则其他内容将无法对齐),这一点非常重要。这两句话现在让我很伤心: <!-- copy from here --> <a href="http://strategis.gc.ca/epic/internet/inabc-eac.nsf/en/home"><img src="id-images/ad-220x80_01e.jpg" alt="Abor
<!-- copy from here --> <a href="http://strategis.gc.ca/epic/internet/inabc-eac.nsf/en/home"><img src="id-images/ad-220x80_01e.jpg" alt="Aboriginal Business Canada:
Opening New Doors for Your Business" width="220" height="80" border="0"></a> <!-- copy to here --> Small ABC Graphic Instructions 1.
这就是结果输出:
1 <!-- copy from here --> _ _ JJ _ 9 amod _ _
2 <a href="http://strategis.gc.ca/epic/internet/inabc-eac.nsf/en/home"> _ _ JJ _ 9 amod _ _
3 <img src="id-images/ad-220x80_01e.jpg" alt="Aboriginal Business Canada:
Opening New Doors for Your Business" width="220" height="80" border="0"> _ _ NN _ 9 compound _ _
4 </a> _ _ NN _ 9 compound _ _
5 <!-- copy to here --> _ _ NN _ 9 compound _ _
6 Small _ _ JJ _ 9 amod _ _
7 ABC _ _ NNP _ 9 compound _ _
8 Graphic _ _ NNP _ 9 compound _ _
9 Instructions _ _ NNS _ 0 root _ _
10 1 _ _ CD _ 9 nummod _ _
11 . _ _ . _ 9 punct _ _
1\ujj\u9 amod\u_
2,NN,9化合物_
5-NN-9化合物_
6小号JJ小号amod小号_
7 ABC-NNP-9化合物_
8图-NNP-9化合物-_
9指令\unns\u0根\u_
10 1 CD 9 nummod_
11 . _ _ . _ 9点_
看起来HTML标记中引号内的换行符被解释为标记的一部分,而不是句子中断。这很奇怪,因为我使用的是-ssplit.newlineisntencebreak always
标志,我希望它会强制解析器拆分HTML代码。但是,即使我不需要每一行都获得自己的解析,这种行为也会令人不安,因为生成的文件不再是有效的conllu格式,因为第3行只有两个制表符分隔的列(而不是必需的10列),第4行只有9列
我使用的一种解决方法是将原始文件中的每一行都转换为自己的文件,然后使用-filelist
参数将它们输入,但这会产生太多的stdout
输出,从而减慢速度并阻塞终端。我尝试将输出重定向到/dev/null
或打开“安静模式”时遇到了失败,但这可能是另一篇文章的问题
我试着把文件的间距加倍,但没用。使用sed's/“/\\”/g'
对文本进行预处理确实可以通过破坏管道将其识别为HTML代码的能力来解决此问题,但引入了新代码,因为解析器可能没有接受过关于转义引号的培训
显然,这是一个奇怪的句子,我不希望输出被合理地解析,但我确实需要它被合理地格式化。有什么建议吗
更新
有人建议我尝试使用cleanxml注释器来完全去除HTML标记。这减少了文件中的行数,这可能会导致以后的不对齐,但是由于HTML标记没有被合理地解析,因此独立地去掉它们似乎是有利的。稍后我将再次更新,说明这是否适用于我的目的,但同时我愿意接受其他建议。这里有两个问题:
img
标记保持在一起——但是如果你想像在大多数机器翻译语料库中那样严格地处理每行一句话的文本,那将是灾难性的。在本例中,您希望将每一行视为一个句子,即使原来的句子是错误的,如这里所示-tokenize.options tokenizePerLine
,它将禁止标记器在形成标记或做出标记化决策时查看行边界。(此选项可以与所有其他tokenize.options
选项组合在逗号分隔的列表中。)U+00A0
(非中断空格)。这已经发生在U+0020
(空格)上,现在也发生在换行符上。这修复了CoNLL/CoNLL-U输出,并为Stanford CoreNLP保持了正确的不变量:令牌有时可能包含非中断空格,但从不包含空格或换行符PTBLexer.class
和PTBTokenizer.class
,那么您将拥有这个新选项,并且应该很好。以下命令应为您提供所需的内容:
java-cp“*”-Xmx1g edu.stanford.nlp.pipeline.StanfordCoreNLP\
-注释器标记化、ssplit、pos、depparse-ssplit.eolonly true\
-tokenize.options tokenizePerLine-outputFormat conllu-文件“input.txt”
p、 我猜你是在试图解决问题,但如果你使用的是-ssplit.eolonly true
,那么你不需要也看不到与-ssplit.newlineIsSentenceBreak的区别。此外,我们可能应该使启用-ssplit.eolonly true
自动启用-tokenize.options tokenizePerLine
,但目前情况并非如此
1 <!-- copy from here --> _ _ JJ _ 9 amod _ _
2 <a href="http://strategis.gc.ca/epic/internet/inabc-eac.nsf/en/home"> _ _ JJ _ 9 amod _ _
3 <img src="id-images/ad-220x80_01e.jpg" alt="Aboriginal Business Canada:
Opening New Doors for Your Business" width="220" height="80" border="0"> _ _ NN _ 9 compound _ _
4 </a> _ _ NN _ 9 compound _ _
5 <!-- copy to here --> _ _ NN _ 9 compound _ _
6 Small _ _ JJ _ 9 amod _ _
7 ABC _ _ NNP _ 9 compound _ _
8 Graphic _ _ NNP _ 9 compound _ _
9 Instructions _ _ NNS _ 0 root _ _
10 1 _ _ CD _ 9 nummod _ _
11 . _ _ . _ 9 punct _ _