Thanks to visit codestin.com
Credit goes to github.com

Skip to content

MultiLabel classification of cow diseases by text and symptoms recognition (NER)

Notifications You must be signed in to change notification settings

poteminr/agrocode2021

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AgroCode Data Science Cup

Private score: 0.7673505952640405

Score = 0.8*(1 - logloss) + 0.2*F1

Задача:

(Multilabel classification + NER)

Необходимо по текстовому описанию болезней:

  1. определить потенциальные болезни коров ("label")
  2. научиться автоматически выделять признаки заболеваний и симптомы болезней ("span")

label – вероятность каждого из 11 возможных заболеваний

span – индексы начала и конца размеченных признаков болезни

Пример текста:

У нетели болячки на вымени. Здравствуйте. Нетель на позднем сроке. Обнаружила, что все вымя покрылось маленькими болячками. Вымя массирую - стоит смирно. На фото - коричневые точки. Что это? Помогите, пожалуйста.

Дополнительные данные:

  1. The Russian Drug Reaction Corpus (RuDReC).

    Датасет для NER, содержит много симптомов с контекстом, что полезно для нашей задачи(остальные тэги из датасета мы не учитываем) https://github.com/natasha/corus

  2. labeled_train_by_hand.json

  3. labeled_by_hand_version_2.json

    Ручная разметка в label-studio, пытался соотвествовать логике разметки авторов разметки первых 30 сэмплов.

    Отличие второго файла от третьего:

    • Второй файл больше соотвествует разметке авторов.
    • В третьем файле добавлено больше подробностей, которые, как мне кажется, помогли бы при классификации.

Краткое описание решения:

NER

  • В ноутбуке NER стандартный процесс обучения, используются данные с ручной разметкой, как модель я использую cointegrated/rubert-tiny2.

  • Для полей теста, где модель выдала пустое предсказание, я использую простой бейзлайн для предсказания спанов:

    span_words.py состоит из слов, которые содержались в размеченных спанах для трейна.

    prediction = model(text)
    
        if len(prediction) == 0:
            text = text.lower()
            prediction = model(text)
    
    
        if len(prediction) == 0:
            spans = self.predict_spans_baseline(text)

MultiLabel Classification

  • Как модель также использую cointegrated/rubert-tiny2 от @avidale

  • Для обучения использую текст из спанов, которые разметил руками + полный текст из датасета(получил большой прирост):

    new_train_df['text'] = " ".join(span_text) +  " | " + new_train['text']
  • Для обучения использую LSEP Loss, его нет в PyTorch, но на MultiLabel классификации показывает лучший результат(в моих экспериментах это так).

    classification/lsep_loss.py содержит класс для использования в PyTorch.

    class LSEPLoss(nn.Module): 
        def __init__(self): 
            super(LSEPLoss, self).__init__()
            
        def forward(self, input, target): 
            return LSEP.apply(input.cpu(), target.cpu())

    Reference: Li+2017: https://arxiv.org/pdf/1704.03135.pdf

  • Для теста также используем текст из спанов, полученных после NER + полный текст из датасета.

  • Небольшая фишка с log-loss score:

    drawing

    Из-за особенностей метрики, если значения меньше, например, 0.01, то мы их оставляем равными 0.01, аналогично, если больше 0.94.

        np.clip(x, 0.01, 0.94)

    (Данный трюк не используется в лучшем сабмите, но докинул на паблике и привате в других случаях)

About

MultiLabel classification of cow diseases by text and symptoms recognition (NER)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors