Почему алгоритм тегирования POS помечает «не могу» как отдельные слова?

Я использую Stanford Log-linear Part-Of-Speech Tagger, и вот пример предложение, которое я помечаю:

Он не может этого сделать

Когда я помечен, я получаю этот результат:

He_PRP ca_MD n't_RB do_VB that_DT

Как видите, can't разбито на два слова, ca помечено как модальное (MD), а n't помечено как НАРЕЧИЕ (RB)?

На самом деле я получаю тот же результат, если использую can not отдельно: can — это MD, а not — это RB, так что ожидается ли такой способ разделения вместо того, чтобы, скажем, разбить, как can_MD и 't_RB?


person Max Koretskyi    schedule 30.04.2015    source источник


Ответы (1)


Примечание. Это не идеальный ответ.
Я думаю, что проблема связана с токенизатором, используемым в Stanford POS Tagger, а не с самим теггером. Токенизатор (PTBTokenizer) не может правильно обрабатывать апостроф:
1- разделительный разделитель токена Stanford PTBTokenizer.
2- Stanford coreNLP - разделить слова, игнорируя апостроф.
Как они упоминали здесь, Stanford Tokenizer, PTBTokenizer будет токенизировать предложение:

«О нет, — говорит она, — наш блендер за 400 долларов не справится с такой сложной задачей!»

to:

......
наш
$
400
блендер
ca
не
ручка
что-то

Попробуйте найти подходящий метод токенизации и примените его к тегировщику следующим образом:

    import java.util.List;
    import edu.stanford.nlp.ling.HasWord;
    import edu.stanford.nlp.ling.Sentence;
    import edu.stanford.nlp.ling.TaggedWord;
    import edu.stanford.nlp.tagger.maxent.MaxentTagger;

    public class Test {

        public static void main(String[] args) throws Exception {
            String model = "F:/code/stanford-postagger-2015-04-20/models/english-left3words-distsim.tagger";  
            MaxentTagger tagger = new MaxentTagger(model);
            List<HasWord> sent;
            sent = Sentence.toWordList("He", "can", "'t", "do", "that", ".");
            //sent = Sentence.toWordList("He", "can't", "do", "that", ".");
            List<TaggedWord> taggedSent = tagger.tagSentence(sent);
            for (TaggedWord tw : taggedSent) {
                 System.out.print(tw.word() + "=" +  tw.tag() + " , " );

            }

        }

}

вывод:

He=PRP, can=MD, 't=VB, do=VB, that=DT, .=. ,

person houssam    schedule 30.04.2015
comment
Спасибо, я мог бы рассмотреть этот подход. Но он дает другой результат, чем исходный - помечает 't как VB вместо RB - поэтому, возможно, я буду придерживаться исходной токенизации. - person Max Koretskyi; 01.05.2015
comment
Это не проблема, а выбор. Мы решили следовать набору тегов части речи Penn Treebank и, следовательно, токенизации.... - person Christopher Manning; 07.05.2015