如何保留Stanford CoreNLP输出中的原始行号?

时间:2015-07-10 14:02:30

标签: nlp stanford-nlp

文本语料库通常作为包含特定文档的大型文件分发在每个新行上。例如,我有一个包含1000万条产品评论的文件,每行一条,每条评论包含多个句子。

使用命令行处理使用Stanford CoreNLP的此类文件时,例如

java -cp "*" -Xmx16g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma -file test.txt

输出,无论是文本格式还是xml格式,都会将所有句子从1编号到n,忽略分隔文档的原始行编号。

我想跟踪原始文件的行号(例如,以xml格式,要有<original_line id=1>的输出树,然后是<sentence id=1>,然后是<token id=1>)。或者,能够重置原始文件中每个新行开头的句子编号。

我已经尝试过similar question关于斯坦福大学POS标记器的答案,但没有成功。这些选项不跟踪原始行号。

快速解决方案可能是将原始文件拆分为多个文件,然后使用CoreNLP和-filelist输入选项处理每个文件。但是,对于包含数百万个文档的大型文件,创建数百万个单独文件只是为了保留原始行/文档编号似乎效率低下。

我想可以修改Stanford CoreNLP的源代码,但我不熟悉Java。

任何保留输出中原始行编号的解决方案都非常有用,无论是通过命令行还是通过显示可实现此目的的Java代码示例。

2 个答案:

答案 0 :(得分:1)

我已经挖掘了代码库,我找不到可以帮助你的命令行标志。

我编写了一些可以解决问题的示例Java代码。

我把它放在DocPerLineProcessor.java中,我把它放到stanford-corenlp-full-2015-04-20中。我还放了一个名为sample-doc-per-line.txt的文件,每行有4个句子。

首先确保编译:

cd stanford-corenlp-full-2015-04-20

javac -cp“*:。” DocPerLineProcessor.java

以下是要运行的命令:

java -cp“*:。” DocPerLineProcessor sample-doc-per-line.txt

输出sample-doc-per-line.txt.xml应该是所需的xml格式,但句子现在具有它们所在的行号。

以下是代码:

<Window.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Background" Value="Red" />
        <Setter Property="Foreground" Value="Blue" />
    </Style>
    <Style TargetType="{x:Type Button}">
        <Setter Property="Background" Value="Red" />
        <Setter Property="Foreground" Value="Blue" />
    </Style>
    ...
</Window.Resources>

现在,当我运行它时,句子标签也有适当的行号。因此句子仍然具有全局ID,但您可以标记它们来自哪条线。这也将设置它,所以换行总是结束句子。

如果您需要任何澄清或我在转录代码时出错,请告知我。

答案 1 :(得分:0)

问题已经回答,但我遇到了同样的问题,并提出了一个适合我的命令行解决方案。诀窍是指定tokenizerFactory并为其提供选项tokenizeNLs = true

看起来像这样:

java -mx1g -cp stanford-corenlp-3.6.0.jar:slf4j-api.jar edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier english.conll.4class.distsim.normal.tagger -outputFormat slashTags -tokenizerFactory edu.stanford.nlp.process.WhitespaceTokenizer -tokenizerOptions "tokenizeNLs=true" -textFile untagged_lines.txt > tagged_lines.txt