NLTK Part-Of-Speech Tagger по русскому корпусу

Nov 19, 2016 20:21

Ингредиенты:

1. Python
2. NLTK, точнее та часть, которая лежит в nltk.tag
3. Набор предложений с ручной морфологической разметкой слов собственного производства, примерно 2,2 миллиона слов.

С помощью небольшой утилитки на C# выгружаем корпус в простейший формат:

юноша    СУЩЕСТВИТЕЛЬНОЕ
отрицательно    НАРЕЧИЕ
покачал    ГЛАГОЛ
головой    СУЩЕСТВИТЕЛЬНОЕ
.    ПУНКТУАТОР

принцесса    СУЩЕСТВИТЕЛЬНОЕ
вообще    НАРЕЧИЕ
потеряла    ГЛАГОЛ
дар    СУЩЕСТВИТЕЛЬНОЕ
речи    СУЩЕСТВИТЕЛЬНОЕ
.    ПУНКТУАТОР

Пустая строка отделяет предложения, каждое слово и его часть речи представлены одной строкой с табуляцией в качестве разделителя. По уму надо бы доработать формат до стандартного ConLL, чтобы использовать стандартный ридер в NLTK, но для прикидочного эксперимента годится и так. Сжатый файл можно взять здесь и повторить эксперимент.

Далее с помощью простой программы на питоне обучаем тэггеры и смотрим на их точность.
Я проверил варианты:

AffixTagger с affix_length=-4, то есть для суффиксов длиной 4 символа.
UnigramTagger
UnigramTagger + AffixTagger в качестве backoff
TnT
ClassifierBasedPOSTagger с дефолтным классификатором
ClassifierBasedPOSTagger с MaxentClassifier

С учетом того, что распознаем только часть речи (а, например, парсер распознает еще и морфологические теги, различая, например, варианты коробка и коробок для слова 'коробок'), получается неплохо:

ClassifierBasedPOSTagger accuracy=0.967824110688
ClassifierBasedPOSTagger+MaxentClassifier accuracy=0.959669832918
TnT accuracy=0.951016058807
AffixTagger accuracy=0.401332822737
UnigramTagger accuracy=0.942149998751
UnigramTagger+AffixTagger accuracy=0.970925150473

И неожиданный победитель - выделен жирным.

part-of-speech tagging, nlp, nltk, python, частеречная разметка, pos tagger

Previous post Next post
Up