Seqlearn

Материал из NLPub
Перейти к навигации Перейти к поиску
Well.svg Данная статья была создана в рамках учебного задания.
Студент: Участник:User:Abiks
Преподаватель: Антон Алексеев
Срок: 10 декабря 2019

В настоящее время задание завершено и проверено. Данная страница может свободно правиться другими участниками NLPub.


Seqlearn — это библиотека, в которой реализованы методы решения задачи разметки последовательностей (например, NER). Авторы библиотеки постарались максимально соответствовать интерфейсу scikit-learn (что не всегда оказалось возможным, поэтому в библиотеке также присутствуют собственные реализации некоторых функций и классов, например, SequenceKFold).

Установка

Авторы рекомендуют устанавливать библиотеку через клонирование репозитория https://github.com/larsmans/seqlearn с последующим вызовом команды

 python setup.py install
   

Но также возможна установка через PyPI:

 pip install seqlearn

Демонстрация работы

В библиотеку входит метод seqlearn.datasets.load_conll для чтения и подготовки данных с файлов в формате CONLL-2003. Самый известный датасет этого формата — это датасет с самого конкурса CONLL-2003, который можно скачать с Kaggle.

Чтение данных

Функция load_conll принимает два обязательных аргумента: путь до файла в виде строки и функцию features. Возвращает кортеж из трех элементов: (X, y, lengths). Где X, y — соответственно матрица признаков и вектор меток, соответствующие отдельным токенам, lengths — длины предложений (по ним модель понимает, где в X и y заканчиваются токены одного предложения и начинаются токены другого)

Функция features осуществляет извлечение признаков из текста. Обязана принимать первым аргументом список токенов, соответствующих одному предложению и индекс токена из этого списка. Возвращает итератор на строки, представляющие признаки этого токена. Например, возьмем в качестве признаков следующее:

  1. само слово (из примера авторов),
  2. начинается ли с заглавной буквы при том, что все остальные буквы — строчные,
  3. написано ли слово капсом,
  4. есть ли в слове небуквенные символы (например, цифры),
  5. длина слова
from seqlearn.datasets import load_conll

def features(sequence, i):
    yield "word=" + sequence[i].lower()
    if sequence[i].istitle():
        yield "Capitalize"
    if sequence[i].isupper():
        yield "Uppercase"
    if not sequence[i].isalpha():
        yield "Not_only_letters"
    yield str(len(sequence[i])) 

path_to_data_folder = Path('CONLL003/')

X_train, y_train, lengths_train = load_conll('CONLL003/train.txt', features)
X_test, y_test, lengths_test = load_conll('CONLL003/test.txt', features)

Обучение модели

Обучим структурный перцептрон (класс seqlearn.perceptron.StructuredPerceptron; гиперпараметры не настроены):

from seqlearn.perceptron import StructuredPerceptron
clf = StructuredPerceptron()
clf.fit(X_train, y_train, lengths_train)

Оценка качества

В библиотеке есть функция seqlearn.evaluation.bio_f_score, считающая micro-averaged F1-меру для задачи NER.

from seqlearn.evaluation import bio_f_score
y_pred = clf.predict(X_test, lengths_test)
print(bio_f_score(y_test, y_pred))

>> 0.6236559139784946

Примечание: пример не демонстрирует максимум возможностей библиотеки seqlearn. Результат сильно зависит от выбора признаков, поэтому, генерируя более сложные признаки функцией features и подбирая гиперпараметры, можно сильнее приблизиться к текущему state-of-the-art результату в этой задаче (сейчас он составляет около 0.935)

whole_sequence_accuracy — accuracy (аналогично bio_f_score). Для работы требует также lengths

from seqlearn.evaluation import whole_sequence_accuracy
print(whole_sequence_accuracy(y_test, y_pred, lengths_test))

>> 0.511400651465798

Прочие функции в библиотеке

  • SequenceKFold — аналог класса KFold из sklearn, корректно семплирующий последовательности

Ссылки

Документация по библиотеке