【问题标题】:Stanford POS Tagger: How to preserve newlines in the output?Stanford POS Tagger:如何在输出中保留换行符?
【发布时间】:2012-08-27 10:57:35
【问题描述】:

我的 input.txt 文件包含以下示例文本:

你必须让我们
来看我吧。

现在,如果我使用默认命令调用 Stanford POS 标记器:

java -classpath stanford-postagger.jar edu.stanford.nlp.tagger.maxent.MaxentTagger -model models/wsj-0-18-bidirectional-distsim.tagger -textFile input.txt > output.txt

我的 output.txt 文件中包含以下内容:

you_PRP have_VBP to_TO let_VB 's_POS come_VB and_CC see_VB me_PRP ._.

上述输出的问题是我丢失了输入文件中使用的原始换行符。

现在,如果我使用以下命令在输出文件中保留换行符分隔符,我必须将 -tokenize 选项设置为 false:

java -classpath stanford-postagger.jar edu.stanford.nlp.tagger.maxent.MaxentTagger -model models/wsj-0-18-bidirectional-distsim.tagger -sentenceDelimiter newline -tokenize false -textFile input.txt > output.txt 

这段代码的问题在于它完全弄乱了输出:

you_PRP have_VBP to_TO let's_NNS  
come_VB and_CC see_VB me._NN

让我们和我。标记不当。

我的问题是如何在不弄乱标记化的情况下保留输出文件中的换行符分隔符?

【问题讨论】:

  • 没问题。祝你好运。 :)

标签: java text nlp stanford-nlp pos-tagger


【解决方案1】:

答案应该是使用命令:

java -classpath stanford-postagger.jar edu.stanford.nlp.tagger.maxent.MaxentTagger -model models/wsj-0-18-bidirectional-distsim.tagger -sentenceDelimiter newline -textFile input.txt > output.txt 

但是在 3.1.3 版本(可能还有所有早期版本)中存在一个错误并且它不起作用(忽略换行符)。它将在 3.1.4+ 版本中运行。

同时,如果文本量很小,您可以尝试使用 Stanford Parser(其中对应的标志名称不同,所以它是 -sentences newline)。

【讨论】:

    【解决方案2】:

    您可以做的一件事是使用 xml 输入而不是纯文本。在这种情况下,您的输入将是:

    <xml version="1.0" encoding="UTF-8">
    <text>
        <line>you have to let's</line>
        <line>come and see me.</line>
    </text>
    

    这里每一行都包含在一个 line 标记中。您现在可以发出以下命令:

    java -classpath stanford-postagger.jar edu.stanford.nlp.tagger.maxent.MaxentTagger -model models/wsj-0-18-bidirectional-distsim.tagger -xmlInput line -textFile sample.xml > ouput.xml
    

    请注意,参数“-xmlInput”指定用于 POS 标记的标记。在我们的例子中,这个标签是 line。当您运行上述命令时,输出将是:

    <?xml version="1.0" encoding="UTF-8"?>
    <text>
        <line>
            you_PRP have_VBP to_TO let_VB &apos;s_POS 
        </line>
        <line>
            come_VB and_CC see_VB me_PRP ._. 
        </line>
    </text>
    

    因此,您可以通过阅读包含在 line 标记中的内容来分隔行。

    【讨论】:

    • 我希望我的输入是简单的文本而不是 xml
    • 由于没有用于空格或换行符的特殊 POS 标签,因此在不使用“-tokenize false”的情况下在文本输入中保留换行符将很困难。您也许可以使用“”查找/替换所有换行符,并将“”和“”添加到文本的开头和结尾以快速将其转换为 xml(我知道这是一个肮脏的解决方案,但它会起作用)。然后您可以在标记中使用 xmlInput 参数。
    猜你喜欢
    • 2017-11-05
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多