Stanford POS Tagger: как сохранить новые строки в выводе?

Мой файл 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

Вот давайте и я. помечены неправильно.

Мой вопрос: как я могу сохранить разделители новой строки в выходном файле, не испортив токенизацию?


person Saprativa Bhattacharjee    schedule 27.08.2012    source источник
comment
Без проблем. Удачи с этим. :)   -  person Andrew Thompson    schedule 27.08.2012


Ответы (2)


Ответ должен был заключаться в использовании команды:

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).

person Christopher Manning    schedule 15.09.2012

Одна вещь, которую вы можете сделать, это использовать ввод 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.

person Himanshu Gahlot    schedule 27.08.2012
comment
я хочу, чтобы мой ввод был простым текстом, а не xml - person Saprativa Bhattacharjee; 28.08.2012
comment
Поскольку нет специального тега POS для пробелов или новых строк, поэтому сохранение новых строк при вводе текста без использования -tokenize false будет затруднено. Возможно, вы можете найти/заменить все свои новые строки на ‹/line›‹line› и добавить ‹text›‹line› и ‹/line›‹/text› в начало и конец вашего текста, чтобы быстро преобразовать его в xml ( Я знаю, что это грязное решение, но оно будет работать). Затем вы можете использовать аргумент xmlInput в тегах. - person Himanshu Gahlot; 28.08.2012