Size: a a a

Natural Language Processing

2021 January 14

DD

David Dale in Natural Language Processing
Евгений Зубов
Ваш совет в итоге стал решением. Спасибо! Написал такую функцию, которая всегда возвращает 512 вектор: https://paste.ofcode.org/vynJRq9GLjjDUXrmvdPmbb
Я конкретно про t5 не знаю, но с bert'ом обычно лучше использовать не эмбеддинг первого токена, а усреднять по всем токенам, чтобы получить представление всего текста. Подозреваю, что к t5 это относится ещё к большей мере, т.к. у него первый токен не обладает особым смыслом, как [CLS] в берте.
источник

ЕЗ

Евгений Зубов... in Natural Language Processing
David Dale
Я конкретно про t5 не знаю, но с bert'ом обычно лучше использовать не эмбеддинг первого токена, а усреднять по всем токенам, чтобы получить представление всего текста. Подозреваю, что к t5 это относится ещё к большей мере, т.к. у него первый токен не обладает особым смыслом, как [CLS] в берте.
Спасибо. На тесте действительно думал сравнить первый токен и mean() от всех токенов. Пока не понятно, стоит ли, а сравнений в лоб не встретил.
источник

ЕЗ

Евгений Зубов... in Natural Language Processing
Anton
Уверен что 512 возвращать будет всегда?
Ну я тупо взял 500 постов из вк, абсолютно разных и циклом проверил длину вектора. В каких случаях может быть другой результат?
источник

DD

David Dale in Natural Language Processing
Евгений Зубов
Ну я тупо взял 500 постов из вк, абсолютно разных и циклом проверил длину вектора. В каких случаях может быть другой результат?
Ни в каких. Согласно документации, T5EncoderModel возвращает тензор размера (batch_size, sequence_length, hidden_size). Поэтому когда мы первый раз выбираем 0-й элемент, выбирается единственный элемент в батче, а второй раз выбирается первый токен в последовательности, у которого размерность всегда  hidden_size.
источник

ЕЗ

Евгений Зубов... in Natural Language Processing
Товарищи, а как называется и обычно решается на python задача извлечения нужного смысла из текста? Например, как извлекать название медпрепарата из текста, не имея реестра препаратов, а по смыслу? Видел готовые решения по извлечению дат, имен, городов, адресов. Буду благодарен ссылку на бэйслайн для старта.
источник

DD

David Dale in Natural Language Processing
Евгений Зубов
Товарищи, а как называется и обычно решается на python задача извлечения нужного смысла из текста? Например, как извлекать название медпрепарата из текста, не имея реестра препаратов, а по смыслу? Видел готовые решения по извлечению дат, имен, городов, адресов. Буду благодарен ссылку на бэйслайн для старта.
Для имена/даты/города/адреса называются named entities, и вся задача - named entity recognition.
Если у тебя есть размеченная выборка, можно попробовать на ней дообучить трансформер, как здесь.
источник

ЕЗ

Евгений Зубов... in Natural Language Processing
А без размеченного датасета решаемо?
источник

GF

Grigory Frantsuzov in Natural Language Processing
Евгений Зубов
А без размеченного датасета решаемо?
для каких то типов сущностей есть предобученные модели
источник

DD

David Dale in Natural Language Processing
Евгений Зубов
А без размеченного датасета решаемо?
Совсем без размеченного - нерешаемо, но если есть хорошая предобученная модель, то для её донастройки может хватить буквально нескольких сотен примеров.
Если есть люди, которые шарят в медпрепаратах, они за вечер могут этот объем нагенерировать или разметить.
источник

GF

Grigory Frantsuzov in Natural Language Processing
Евгений Зубов
Товарищи, а как называется и обычно решается на python задача извлечения нужного смысла из текста? Например, как извлекать название медпрепарата из текста, не имея реестра препаратов, а по смыслу? Видел готовые решения по извлечению дат, имен, городов, адресов. Буду благодарен ссылку на бэйслайн для старта.
самое интересное в вашей задаче что реестр есть
источник

GF

Grigory Frantsuzov in Natural Language Processing
но его надо спарсить, а сайт там отвратительный
источник

ЕЗ

Евгений Зубов... in Natural Language Processing
David Dale
Совсем без размеченного - нерешаемо, но если есть хорошая предобученная модель, то для её донастройки может хватить буквально нескольких сотен примеров.
Если есть люди, которые шарят в медпрепаратах, они за вечер могут этот объем нагенерировать или разметить.
Я опыт имею) Получается, если простыми словами, то моим y_batch по сути должна быть строка, в которой отсутствует предсказываемое название препарата, верно?
источник

DD

David Dale in Natural Language Processing
В качестве готовой базовой модели можно попробовать:
- bert или другой bert-подобный трансформер
- какой-нибудь очень простенький классификатор (например, свёрточную сеть) поверх эмбеддингов fasttext
Трансформер можно при этом попробовать пофайнтюнить на неразмеченных медицинских текстах, если есть их много, а потом уже обучать на размеченных данных.
Ну и fasttext можно попробовать обучить свой на медицинском корпусе, если таковой есть.
источник

DD

David Dale in Natural Language Processing
Евгений Зубов
Я опыт имею) Получается, если простыми словами, то моим y_batch по сути должна быть строка, в которой отсутствует предсказываемое название препарата, верно?
Нет, надо в качестве x подавать строку, пропущенную через токенизатор, а в качестве y - массив ноликов для тех токенов, которые не соответствуют искомой сущности, и единичек - там, где она есть.
источник

DD

David Dale in Natural Language Processing
А если предобучаешь модель на неразмеченных медицинских текстах, то подавать надо только x,
источник

DD

David Dale in Natural Language Processing
Если сущностей несколько, можно IOB-разметку ввести, как в примере, который я выше скинул.
источник

DD

David Dale in Natural Language Processing
Евгений Зубов
Я опыт имею) Получается, если простыми словами, то моим y_batch по сути должна быть строка, в которой отсутствует предсказываемое название препарата, верно?
Если есть тексты, которые хочется поразмечать ручками, рекомендую взять прогу для разметки данных типа бесплатного labelstudio или платного prodigy.
источник

ЕЗ

Евгений Зубов... in Natural Language Processing
David Dale
Нет, надо в качестве x подавать строку, пропущенную через токенизатор, а в качестве y - массив ноликов для тех токенов, которые не соответствуют искомой сущности, и единичек - там, где она есть.
Спасибо! Да, токенизированную строку имел ввиду, конечно. Есть опыт работы c bag words и вот думаю, как не изучая ничего нового решить задачу по быстрому. Приведенными вами ссылки изучаю, но если идти по верхам, то алгоритм примерно такой:

1. Беру много мед статей
2. Парсим базу препаратов
3. Статьи чищу, нормализую, токенизирую
4. Делю данные на x (ориг данные) и y (с 1 для искомых слов, а остальное 0)
5. Беру преобученную BERT трансофрмер
6. Доучиваю на своих данных

Верно? Получается, задача классификации и f1 мера в качестве целевой метрики?
источник

ЕЗ

Евгений Зубов... in Natural Language Processing
David Dale
Для имена/даты/города/адреса называются named entities, и вся задача - named entity recognition.
Если у тебя есть размеченная выборка, можно попробовать на ней дообучить трансформер, как здесь.
Спасибо, тут прям решение целиком, кажется
источник

DD

David Dale in Natural Language Processing
На самом деле, не совсем.
Это два разных пути, которые друга дополняют.
1. Берёшь много мед. статей
2. Статьи чистишь, делишь на параграфы, нормализуешь, токенизируешь
3. Размечаешь параграфы, выделяя в них искомые слова (то, что потом будет единичками)
4. Берёшь BERT для нужного тебе языка
5. (необязательно) дообучаешь BERT (for masked lanugage modeling) на неразмеченных параграфах
6. дообучаешь BERT for token classification на размеченных параграфах
источник