文本语料库通常作为包含特定文档的大型文件分发在每个新行上。例如,我有一个包含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代码示例。
答案 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