Ингредиенты:
1. Python
2.
NLTK, точнее та часть, которая лежит в
nltk.tag3. Набор предложений с ручной морфологической разметкой слов собственного производства, примерно 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
И неожиданный победитель - выделен жирным.