Natural language processing
Инструкции
Ваша задача - выделить названия генов в биологическом тексте. Здесь только один вид объектов - ген (GENE). Набор данных адаптирован из BioCreAtIvE II открытой задачи(http://biocreative.sourceforge.net/biocreative_2.html).
Файлы для задания доступны в архиве по ссылке выше. Там вы найдете тренировочный корпус с расставленными пометками tagger.train и неразмеченный набор данных для проверки tagger.test. В файле с пометками каждое слово вместе с меткой идет на отдельной строке, например:
Comparison O
with O
alkaline I-GENE
phosphatases I-GENE
and O
Файл tagger.test содержит только слова из текста, по одному на строке; он будет использоваться для оценки вашей модели.
Подсчет количеств вхождений
В архиве вы можете найти скрипт count_freqs.py, который помогает считать количество вхождений. Он принимает тренировочный корпус как ввод, и выводит количество всех триграмов, биграмов, а также количество соотвествий слова тэгу.
Каждая строка выхода содержит количество вхождений для одного из объектов. Встречаются два вида:
- Строки, в которых второе слово -
WORDTAG, содержат количество соответствий слова тэгу, например:
13 WORDTAG I-GENE consensus
означает, что в тренировочных данных слову consensus 13 раз была поставлена в соответствие метка I-GENE.
- Строки, в которых второе слово - n
-GRAM (где n - 1, 2 или 3), содержат количества вхождений униграмов, биграмов и триграмов соответственно. Например:
16624 2-GRAM I-GENE O
означает, что метка O следовала за меткой I-GENE 16624 раза, а
9622 3-GRAM I-GENE I-GENE O
означает, что в 9622 случаях метки встречались в последовательности I-GENE, I-GENE, O.
Оценка
Для оценки эффективности вашего таггера будет использоваться F1-Score. Пусть A - множество позиций, которые ваш таггер пометил как GENE, и B - множество позиций, которые на самом деле являются GENE сущностями. Тогда определим точность как размер пересечения A и B делить на размер A (как часто метка была поставлена справедливо), и покрытие как размер пересечения A и B делить на размер B (какая часть всех нужных сущностей оказалась угадана). F1-Score - среднее гармоническое точности и покрытия.
Для каждой из частей ответ засчитывается, если F1-Score оказался не меньше указанного.
Часть 1 (20 баллов)
- Используя частоты, полученные с помощью
count_freqs.py, посчитайте параметры соответствия слова x от метки y как простое отношение количества раз, когда в тренировочных данных слово x было помечено меткой y, к количеству меток y во всем корпусе: e(x|y) = Count(y -> x) / Count(y).
- Необходимо предсказывать вероятности соответствия для слов, которые вообще не встречаются в тренировочных данных. Один простой подход - считать все редкие слова, в том числе вообще не встречавшиеся, одинаковыми. Замените редкие слова (встречаются в корпусе меньше 5 раз) общим обозначением _RARE_, затем пересчитайте количества с помощью
count_freqs.py
- Для начала, реализуйте простой таггер, который всегда выдает метку с максимальным параметром соответствия для данного слова
res = arg max e(x|y). Убедитесь, что ваш алгоритм использует _RARE_ вместо редких слов.
Ваш таггер должен ввести количества вхождений и файл tagger.test, в котором он должен расставить метки и вывести их в таком же формате, как в тренировочном файле. Например
Nations I-ORG
Файл с выводом (именно его, а не код) нужно отправить на ejudge (ссылка для входа на контест вверху страницы).
Ожидаемый F1-Score - 0.25.
Часть 2 (30 баллов)
- Используя частоты, полученные с помощью
count_freqs.py, посчитайте параметры q(yi|yi-2, yi-1) = Count(yi-2, yi-1, yi) / Count(yi-2, yi-1) для данного триграма yi-2, yi-1, yi. Убедитесь, что посчитаны крайние значения q(yi|*, *), q(y2|*, y1), q(STOP|yn-1, yn).
- Оценив параметры, реализуйте алгоритм Витерби для нахождения ответа. Не забудьте о редких словах.
Ожидаемый F1-Score - 0.39.
Часть 3 (10 баллов)
Здесь вам предлагается улучшить ваш таггер, разделив один класс редких слов на несколько более информативных, например, можно выделить класс редких слов, начинающихся на заглавную букву.
Ожидаемый F1-Score - 0.42.