Русский
Русский
English
Статистика
Реклама

Языки

Наблюдения за погодными условиями в проекте с CCLI

01.02.2021 12:14:39 | Автор: admin

Каждая команда в своей работе сталкивается с необходимостью внедрения новой технологии или языка программирования в проект. Иногда это внедрение проходит успешно, а иногда нет. В этой статье хотелось бы рассказать о нашем опыте использования C++/CLI.

Начало. Ожидается солнечная погода

Задание: разработать программный комплекс для моделирования различных процессов, протекающих на объектах в системах сбора, подготовки и транспортировки углеводородов. Объектами моделирования могут быть скважины (как добывающие, так и нагнетательные), трубопроводы, объекты подготовки нефти, газа и воды. В среднем каждое месторождение характеризуется более чем 100 объектами обустройства. Причём некоторые объекты имеют размерность либо по глубине, либо по длине в несколько километров. Приемлемое время расчёта модели одного месторождения порядка нескольких минут. Если совсем просто, то необходимо представить вот такой объект:

В виде вот такой модели и рассчитать её характеристики.

Наработки: существующие методики, существующий проект с функциональностью, частично покрывающей задачи проекта.

Команда: программист стека .NET/WPF, программист C++, методист, руководитель проекта.

На первом этапе задача состояла в том, чтобы освоиться с уже существующей кодовой базой, понять, что и как работает, убрать всё лишнее, добавить часть нового функционала в соответствии с описанием, полученным от методистов. Небольшое замечание, которое в дальнейшем будет иметь значение: все расчёты должны быть выполнены на C++, это было связано с тем, что необходимо обеспечить:

высокую скорость расчётов;

последующее использование наработок в качестве подмодулей для других приложений.

Безоблачное продолжение

Уже существующий проект, на базе которого предстояло начать работать, был выполнен с использованием .NET/WPF, методики расчёта модели реализованы при помощи .NET/C# c промежуточными вызовами плюсового кода через P/Invoke. P/Invoke (для справки) это технология, которая позволяет обращаться к структурам, обратным вызовам и функциям в неуправляемых библиотеках из управляемого кода. Т. е. примерно вот так:

Код на C# содержал описание моделей объектов, участвующих в расчёте, а также расчёт сети объектов. За расчёт параметров отдельного объекта отвечала плюсовая часть. Время выполнения расчёта соответствовало заявленным требованиям, поэтому было решено оставить расчёт сети объектов на C# и сосредоточиться на расширении расчётов параметров самих объектов на C++.

Так как предстояло значительное увеличение количества вычисляемых параметров (и, соответственно, количества параметров, которые необходимо передавать через P/Invoke), то возник вопрос: "Использовать прежнюю схему взаимодействия с неуправляемым кодом или воспользоваться другими технологиями?".

Ключевыми критериями для выбора мы определили скорость взаимодействия и удобство использования.

В качестве альтернативы использованию P/Invoke, возникла идея использования технологии C++/CLI.

Спецификация языка C++/CLI (C++ modified for Common Language Infrastructure) была создана компанией Microsoft на замену Managed Extensions for C++. C++/CLI позволяет одновременно работать как с классами и методами языков .NET, так и с обычным кодом C++.

Приставка CLI расшифровывается как Common Language Infrastructure это открытая спецификация (технический стандарт), разработанная Microsoft и стандартизированная ISO и Ecma, описывающая исполняемый код и среду выполнения, которая позволяет использовать несколько языков высокого уровня на различные компьютерных платформах без переписывания под конкретные архитектуры. Т. е. C++/CLI нужен вот для этого:

В C++/CLI, прежде всего, нам показалось привлекательной возможность вызова уже написанного на плюсах кода при помощи управляемых оберток для существующих классов на С++. Сравнительный тест скорости вызова плюсового кода при помощи C++/CLI и P/Invoke, как ни странно, также показал уменьшение времени расчёта при использовании первого.

Вызовов P/Invoke на тот момент было совсем немного и поэтому в короткий срок нам удалось перейти на использование новой технологии. Стандартный вариант использования C++/CLI в нашем проекте выглядел примерно вот так:

public ref class DeviceBaseClr : public IDisposable, public Figures::Models::IItemBase

{

#pragma region Поля и свойства

protected:

/// <summary>

/// C++ unmanaged объект декоратора

/// </summary>

DeviceBase* obj_;

#pragma endregion

#pragma region IItemBase

public:

virtual IState^ GetState(DateTime date);

virtual IState^ SetState(DateTime date, IState^ state);

#pragma endregion

#pragma region Конструкторы

public:

DeviceBaseClr(IStateFactory^ stateFactory);

virtual ~DeviceBaseClr();

protected:

!DeviceBaseClr();

#pragma endregion

};

} // Simtep::Diagrams

#endif // _DEVICEBASECLR_H_

Предполагаемая архитектура приложения, выполненного в соответствии с парадигмой MVVM, выглядела следующим образом:

Тучи сгущаются

На следующем этапе развития проекта, по мере наращивания функционала, мы начали сталкиваться с некоторыми проблемами.

Во-первых, появилась необходимость вызова расчётов реализованных на C# внутри неуправляемого кода (и, кстати, да C++/CLI и это позволяет делать тоже).

Во-вторых, нам пришлось опустить часть модели в неуправляемую часть из-за того, что возникла необходимость использования сторонних библиотек, реализованных на С++.

После этих изменений архитектура приложения приобрела следующий вид:

В результате возникли как технические проблемы:

Мы не могли просто подключать сторонние библиотеки на C++ (имеются в виду библиотеки с расчётами предоставленные нашими коллегами из параллельных проектов), нужно было пересобирать их из исходного кода, используя специальные директивы для CLI.

Существует отдельный синтаксис LINQ для CLI, его возможности ограничены по сравнению с обычным, например, в нём нет лямбда-выражений, писать отдельные методы каждый раз не очень удобно.

Отсутствие возможности использовать умные указатели.

Постоянно возникали вопросы при использовании контейнеров, например при попытке добавления в коллекцию, созданную на стороне неуправляемого кода, объекта, созданного на стороне .NET.

Управление памятью, например, что будет, если для одного нативного объекта вдруг создастся две обёртки на CLI, и в какой-то момент будет освобождена сборщиком мусора?

При организации взаимодействия нужно быть готовым к тому, что для каждого объекта придётся писать обёртку. И их может потребоваться очень много.

Логика классов может усложняться, что неизбежно ведёт к усложнению обёрток.

Как уже было сказано выше, рано или поздно возникает необходимость обратного использования управляемого кода в неуправляемом. C++/CLI позволяет это сделать, при этом увеличивается сложность проекта.

Так и вопросы организационного характера:

C++/CLI это всё-таки ещё один язык программирования. Т. е. если к вам в команду добавляется джуниор с базовыми знаниями по C++, нужно учитывать, что ему необходимо влиться в предметную область, чуть подтянуть свой уровень владения C++ и плюс ко всему выучить ещё один язык программирования. Ну и, соответственно, ошибки можно сделать как в нативном коде, так и в обёртке.

Программистам C# будет тяжело в случае необходимости внести изменения в обёртку.

По мере развития проекта мы стали замечать, что большая часть времени уходит не на расширение функционала, а именно на изучение самого C++/CLI, особенностей его синтаксиса и поддержание кода именно обёрток. Разумеется, к обычным ошибкам, сопутствующим процессу разработки, добавились ошибки, возникающие на стыке C# и C++/CLI.

Возможно, мы бы продолжали поддерживать и развивать проект в таком виде, если бы не ещё одна проблема, которая стала критической, а именно мы перестали укладываться в ограничения по времени выполнения расчёта модели. Это случилось не в один день, просто каждая итерация по расширению функционала вносила свой вклад в общее время расчёта. Если при старте проекта мы рассчитывали лишь простые параметры по объекту, то расчётное ядро значительно увеличилось в размерах:

Попытки оптимизации кода не давали нужных результатов, помимо возросшего функционала. Причины низкой скорости расчётов крылись в следующем:

Множественный вызов CLI. Почти на каждой строке. Это значит постоянное создание декораторов, постоянный (почти непрерывный маппинг) как в одну сторону, так и в другую.

Использование декораторов означает их создание, т. е. постоянное выделение памяти внутри расчётного цикла.

Цикл расчёта на стороне .NET, не позволявший осуществить многопоточный расчёт в полной мере.

Плюс системные затраты на преобразование типов из managed в unmanaged и обратно (речь о передаче стандартных типов).

Разгон облаков

Скорость расчёта критична для нашего приложения, поэтому нам было необходимо либо дальше оптимизировать существующий код с небольшими шансами на успех, либо попытаться отделить расчёты от интерфейса и модели (заодно отказавшись от CLI) с чуть более высокими шансами. В итоге мы выбрали второе. По сути, это означало практически переписать приложение на 70 процентов заново.

Какие факторы помогали нам верить в успешность задуманного:

сработавшаяся команда разработчиков;

высокая степень владения кодом;

высокая степень понимания разработчиками предметной области;

запас времени перед сдачей этапа;

природный оптимизм.

Новая архитектура в наших планах выглядела следующим образом:

Подобное разделение позволило бы нам избавиться от проблем с CLI и воспользоваться, наконец, в полной мере скоростью расчётов на чистом C++. Из минусов( если это можно назвать минусом) появилась необходимость создания и поддержания эквивалентной модели на стороне С++, а также обеспечения взаимодействия между моделями.

При реализации взаимодействия был соблазн воспользоваться RabbitMQ или ZeroMQ, однако, оценивая вероятность того, что мы одновременно сумеем и переписать большую часть кода, и реализовать механизм взаимодействия на основе очереди сообщений, мы решили выбрать самый простой вариант, а именно файловый обмен. На практике при грамотной реализации с ним возникло меньше всего проблем, в том числе и по скорости.

Переход на новую архитектуру занял у нас около 3-х месяцев, и если говорить о каких-то подводных камнях, то они были такими:

Мы планировали завершить рефакторинг во время Х, а закончили во время 3*Х. Значительное превышение первоначальных сроков было связано с тем, что изначально в проекте были большие фрагменты кода, написанные на C#. Во время оценки времени, необходимого на переход, мы не учли того, что у нас отсутствует формализованное описание алгоритмов для этих фрагментов, а прямой перенос не всегда был возможен.

Рефакторить 3 месяца при отсутствии навыков программирования на C++ большей части команды было тяжело.

Ожидается солнечная погода без осадков

Подводя итог, хочется сказать, что:

C++/CLI это интересный язык программирования, и в некоторых случаях он позволяет значительно упростить жизнь. Однако прежде, чем внедрять его в свой проект, мы бы посоветовали заранее на этапе проектирования очертить рамки, в которых он будет использоваться. Т. е. в случае, когда он используется для обеспечения взаимодействия с нативным кодом, по нашему мнению, это должно быть либо штучное взаимодействие крупных узлов системы, либо подключение небольшого класса или функции. В противном случае вы рискуете повторить наши ошибки. Всем спасибо!

Если у кого-то есть свой опыт использования C++/CLI, то нам было бы интересно о нём узнать.

Подробнее..

Cтоит ли учить Ruby

01.02.2021 06:08:37 | Автор: admin

Одним из популярных языков программирования можно назвать язык Ruby, с его не менее популярным веб-фреймворком Ruby On Rails.Однако, несмотря на его популярность, вам не стоит тратить на него время, и вот почему.

Рассвет Ruby на рельсах

В 2005 году на свет появился фреймворк Ruby On Rails, который на момент своего выхода наиболее удобно и просто реализовывал архитектурный шаблон MVC. И многие программисты осознали, что они теперь могут делать очень просто и быстро кастомные веб-приложения. Это был настоящий прорыв в сфере создания веб-приложений.

И огромное количество компаний (в основном стартапы), стали делать свои сервисы именно на языке Ruby, на фреймворке Ruby on Rails Netflix, Bloomberg, Airbnb, Groupon, Basecamp, GitHub, KickStarter и так далее.

В России и странах СНГ также огромное количество новых компаний в период 2008-2010, стали делать свои решения на ROR. Тогда были популярным в основном стартапы на туристическую тематику.


Переломный момент у Ruby

Успех Ruby On Rails не оставался незамеченным и на других языках программирования стали копировать решения из ROR. Так на Python появился Djnago, на PHP появился Laravel, а корпоративные фреймворке Spring (Java) и .Net (С#) стали брать удачные решения из ROR и внедрять в свои фреймворки.

И в какой момент на каждом языке программирования стало также удобно и просто разрабатывать кастомные веб-приложения, как в свое время на Ruby.

И тут стал появляться вопрос: Если везде также просто разрабатывать веб-приложения, то зачем выбирать именно Ruby с его рельсами. И на этот вопрос не нашелся ни один адекватный ответ.

  • Java и C# - предлагали корпоративную надежность и огромное количество разработчиков, готовых работать на этом стеке.

  • Python - подкупал своей универсальностью и элегантностью языка. Практически нет сферы, где нельзя было бы использовать python.

  • PHP предлагал безумную скорость разработки и относительную дешевизну рабочих рук.

Ruby не имел ни одного преимущества перед этими языками. У него был лишь веб-фреймворк Ruby on Rails, который все уже давно скопировали.

Как итог, новые стартапы стали выбирать другой стек для своих систем, популярность Ruby и спрос на него стали катастрофически падать. В итоге, если посмотреть сейчас какие новые стартапы запускаются на Ruby, вы вряд ли найдете громкие имена. Ruby проиграл.

Оценка рынка вакансий на Ruby

В России и странах СНГ Ruby никогда не был особо популярным стеком. Простой поиск по вакансиям дает крайне мало результатов, и большинство вакансий идет как раз в компании, что были основаны в период его популярности. Поэтому вам нужно быть готовым к тому, что основную часть своей работы вы будете тратить на поддержку существующих решений.

Однако тут есть небольшой плюс. В силу того, что специалистов на Ruby становится все меньше и меньше, а компании, которые уже завязались на Ruby, не могут с него слезть. Зарплаты на Ruby могут быть выше, чем на Python и PHP.

США и Силиконовая Долина

В США, а именно в Силиконовой Долине, ситуация с Ruby обстоит гораздо лучше. Там есть достаточно много крупных игроков, у которых код пишется на Ruby (смотрим самые известные копании на Ruby on Rails). Поэтому там есть приток свежей крови, там есть возможность переходить с одной компании на другую.

Другими словами, если вы хотите стать Ruby программистом, то вам нужно планировать переезд в Силиконовую долину, ведь только там есть стабильный спрос на Ruby программистов и какие-то перспективы на этом стеке.

Стоит ли учить Ruby в 2020 годах и выше

Если говорить объективно, то существующие программисты на Ruby могут зарабатывать неплохие деньги, так как ситуация на рынке позволяет им запрашивать более высокие зарплаты, чем у их коллег.

Если вы начинающий программист и только выбираете свой стек, то лучше выбрать что-то из PHP/Python/Java/C#. Эти языки активно развиваются, активно поддерживаются, и активно используются, как в легаси проектах, так и новых стартапах. Нет смысла изначально брать умирающий язык, каким бы крутым он не казался на первый взгляд.

УмретлиRubyиRuby on Rails

Все зависит от того, сможет ли язык предложить какие-то решение для новых проблем программирования. Мы все помним, как в свое время node.js взорвал рынок и привел к дикой популярности JavaScript. Как итог из узкоспециализированного языка JavaScript стали использовать везде: фронт, бекенд, микросервисы, десктоп-приложения, мобильные приложения.

Если на языке Ruby придумают что-то подобное, то это может привести к его возрождению и новой популярности. Однако, если этого не произойдет, он медленно умрет, как будут закрываться компании, которые держали на нем свою бизнес-логику.

Поэтому, смотрите на вакансии в своем городе, оценивайте их число и качество. Если по какой-то причине в вашем городе все вакансии именно на Ruby, то лучше выучить его, чем сидеть без работы. Однако, в большинстве случаев вакансий на Ruby будет мало.

p.s. здраво оценивайте рынок, не введитесь на рекламные лозунги продавцов курсов.

Подробнее..

Event2Mind для русского языка. Как мы обучили модель читать между строк и понимать намерения собеседника

18.06.2020 18:21:58 | Автор: admin
Умение модели распознавать намерения собеседника, то есть понимать зачем человек совершил то или иное действие, применимо в большом числе прикладных NLP-задач. К примеру, чат-ботам, голосовым помощникам и другим диалоговые системам это позволит эмоционально реагировать на высказывания собеседника, проявлять понимание, сочувствие и другие эмоции. Кроме того, задача распознавания намерения это еще один шаг на пути к пониманию человеческой речи (human understanding).



Уже было предпринято несколько попыток решить данную задачу в той или иной форме. Например, на NLP-progress публикуются последние достижения в области commonsense reasoning. Слабость большинства существующих моделей заключается в том, что в их основе лежит supervised подход, то есть им требуются большие размеченные датасеты для обучения. А в силу специфичности задачи разметка часто бывает весьма нестандартной и достаточно сложной.

Для английского существует ряд корпусов и benchmarkов, а вот для русского языка ситуация с данными намного печальнее. Отсутствие размеченных данных для русского часто является одним из основных препятствий, которое мешает русифицировать работающие английские модели.

В этом посте мы расскажем, как мы создали датасет для задачи Common Sense Reasoning в одной из ее возможных формулировок, предложенной в статье event2mind, а также адаптировали английскую модель event2mind от AllenNLP для русского языка. Для начала немного расскажем, что же из себя представляет задача Common Sense Reasoning.

На самом деле, правильнее было бы рассматривать это как целое направление задач, направленных на распознавание намерений и эмоций действующего лица. Единой формулировки у нее нет, и в данном посте мы возьмем за основу вот такой ее вариант, предложенный авторами event2mind: по короткому тексту в свободной форме, содержащему некоторое действие или событие (например, PersonX eats breakfast in the morning), определить намерения субъекта (X wants to satisfy hunger), его эмоции/реакции (X feels satiated, full) и возможные эмоции/реакции других участников события, если таковые присутствуют. Рисунок 1 это наглядно иллюстрирует.

Рисунок 1. Задача Commonsense Reasoning по короткому тексту-событию определить намерения, эмоции/реакции субъекта и эмоции/реакции окружающих


В оригинальной английской статье авторы предложили модель event2mind для решения этой задачи, а также большой размеченный корпус для ее обучения для английского языка. Нашей задачей было русифицировать эту модель, адаптировав для русского языка. Данную модель мы хотели потом встроить в чат-бота, чтобы научить его понимать намерения пользователя и правильно реагировать на эмоции. Для этого мы собрали датасет для русского языка, в формате, аналогичному английскому, а также обучили и протестировали несколько моделей архитектуры event2mind на собранных данных.

Данные, данные и еще раз данные


Итак, нашей задачей было собрать корпус размеченных текстов в свободной форме в формате, пригодном для обучения event2mind. Для простоты дальше мы будем называть такие короткие тексты просто событиями. При этом мы старались максимально расширить common sense reasoning кругозор модели, собрав события на самые разные темы из повседневной жизни.

Часть первая. Crowdsourced corpus


На первом этапе нам предстояло собрать достаточное количество сырых событий для последующей разметки. За основу мы взяли три источника данных:
  1. Короткие посерийные описания сериалов и мыльных опер. Мы вручную отобрали 50 сериалов с сюжетами из повседневной жизни, такие как Друзья, Секс в большом городе, Санта-Барбара, Универ, Кухня и другие. При этом мы старались выбирать сериалы о повседневной жизни с сюжетами на общие темы. Фантастика или профессиональные сериалы нам не подходили, так как они содержат очень много специальной лексики, и события там из своей специфичной области. Вы представляете, что может выучить модель, обученная на Докторе Хаусе или Звездном пути? Еще начнет подозревать у всех волчанку и сыпать рассказами о сражениях с инопланетянами.
  2. Краткие содержания книг. Суммарно нам удалось набрать краткие содержания 1512 книг.
  3. Тексты из SynTagRus, который является частью Русского Национального корпуса и содержит художественные тексты вместе с новостями.


На следующем шаге мы извлекли события из собранных текстов. События для тренировки event2mind можно определить как комбинацию глагольного предиката с входящими в составляющую глагола аргументами. Для поиска подобных паттернов был использован синтаксический парсер UdPipe, с помощью которого мы выделяли в текстах паттерны вида глагол + зависимые слова в синтаксическом дереве, как например на рисунке 2, которые удовлетворяли одному из следующих правил:

  • nsubj + root + obj
  • nsubj + root + iobj
  • nsubj + advmod + root
  • nsubj + root + case + obl
  • etc.


Рисунок 2. Синтаксические паттерны, использованные для извлечения событий из текстов



Отобранные события обезличиваются. По аналогии с оригинальным event2mind все действующие лица и именованные сущности были заменены на единообразные PersonX, а также PersonY и PersonZ, если в предложении упоминается более одного действующего лица. Для распознавания именованных сущностей (Named Entity Recognition) и дальнейшей замены мы вновь воспользовались UdPipe: в событиях, которые отвечают паттернам выше мы деперсонилизировали токены, помеченные тегами PROPN или PRONOUN. В завершении мы исключили события, которые не содержат одушевленных субъектов. Например, по этому критерию было отсеяно предложение Идет дождь. В итоге в корпус вошли только события с одушевленными именованными сущностями (person named entities).

После деперсонализации и фильтрации мы воспользовались частотным анализом и расстоянием Левенштейна для отобора наиболее распространенных событий и фильтрации нестандартных примеров, которые встретились лишь единожды. Во-первых, мы взяли все события, которые встретились в первоначальной выборке больше одного раза. Для оставшейся части данных мы посчитали попарные расстояния Левенштейна $L(phrase_1,phrase_2)$, ), отобрали пары, для которых оно не превосходило 5 и из каждой пары взяли более короткое предложение. При таком методе мы руководствовались следующим соображением: если для пары событий их расстояние Левенштейна мало (в данном случае порог 5), то эти предложения отличаются весьма незначительно, например, в роде глагола или прилагательного. Фактически это вариации одного и того же события. А более короткое предложения из пары мы выбирали потому, что оно скорее будет содержать начальные формы слов (они чаще короче, хотя и не всегда).

После сбора данных события предстояло разметить, выделив в них намерения PersonX, его эмоции/реакции, а также эмоции/реакции PersonY и PersonZ, если таковые присутствуют. Для этого мы создали задание в Яндекс.Толоке. Пример из него вы можете видеть на рисунке 3. Для каждого события мы спрашивали разметчиков:

  • содержит ли оно осмысленное событие;
  • можно ли по тексту события понять намерения действующего лица;
  • можно ли по событию понять эмоции/реакцию действующего лица;
  • может ли это событие вызвать реакцию окружающий.


Рисунок 3. Пример задания из Яндекс.Толоки



Для облегчения труда толокеров мы подготовили для них подсказки ответы пробной модели event2mind, обученной на переведенном английском корпусе event2mind. Так что им оставалось только верифицировать ответы черновой модели и по возможности предложить свои.

Тут стоит оговориться, что поскольку переведенные данные получились достаточно сырыми, то обученная на них модель оказалась слабой. До полноценной модели она не дотягивала, но в некоторых случаях ей достаточно точно удавалось угадывать эмоции и намерения субъектов.

В итоге нам удалось собрать 6756 событий на различные повседневные темы.

Часть 2. Translated English corpus


Помимо того, что мы использовали размеченный русский датасет, мы частично перевели английский корпус с помощью переводчика Google, а затем отфильтровали и откорректировали результат. Почему это было необходимо? Понятно же, что автоматический перевод несколько хуже исходно русских данных, размеченных вручную.

Дело в том, что разметка подобного датасета трудоемкое дело, требующее большого количества ресурсов, денег и средств. У нас просто не было возможности разметить корпус, по размерам сопоставимый с английским, который состоит из 46 тысяч примеров. Поскольку собранный на русском датасет оказался меньшего размера, мы решили оценить, хватит ли такого объема данных для обучения. Для этого мы обучили английскую модель на частях оригинального корпуса и измерили, как меняется качество в зависимости от размера обучающего датасета. Результаты приведены в таблице. Качество для намерений (intent) и эмоций/реакций (react) оценивалось, по аналогии с оригинальной статьей, по метрике recall@10 на валидации. recall@10 отражает долю случаев, когда истинный ответ golden standard попадает в топ-10 предсказаний модели. Метрика меняется от 0 до 1, чем больше, тем лучше.

Таблица 1. Зависимость качества английской модели от размера корпуса для обучения



Сразу можно сказать, что 5000 примеров недостаточно для полноценного обучения модели. Однако уже при 30000 примеров, loss и recall практически не отличаются от результатов на полном объеме данных. Получается, что размеченных нами 7000 примеров не хватает для обучения модели и необходимо каким-то способом увеличить размер обучающей выборки.

Для этого мы подготовили дополнительный корпус, полученный из английского с помощью автоматического перевода Google Переводчиком. Как уже отмечалось выше, при автоматическом переводе всего корпуса некоторые переводы оказывались некорректными или полностью теряли смысл. Поэтому мы отобрали ту часть английских данных, которая переводилась наиболее адекватно. Изначально английский корпус собран из нескольких источников: ROC Story training set, the GoogleSyntactic N-grams, the Spinn3r corpus и idioms. При этом предложения из некоторых источников оказались проще для перевода, чем из других. Например, адекватный перевод идиом без ручной правки оказался не под силу компьютеру. Поэтому мы взяли только примеры из ROC-story. По результатам оригинальной статьи (см. таблицу 2), у этого источника коэффициент согласованности аннотаторов (Cohen's kappa coefficient), равный 0.57. А это, скорее всего, свидетельствует о том, что события оттуда проще для понимания и разметки, а значит меньше подвержены ошибкам при переводе.

Таблица 2 Данные и Cohen's kappa coefficient для разных источников в английском корпусе


После этого мы отфильтровали отобранные данные, удалили оттуда примеры, в которых после перевода остались английские слова и примеры, которые были переведены некорректно. Оставшаяся часть была отредактирована редакторами.

Стоит отметить, что несмотря на все уловки, фильтрацию и редактуру, переведенный корпус все равно отстает по качеству предложений от размеченного толокерами датасета.

В итоге нам удалось набрать 23409 переведенных событий, а объем объединенного корпуса с учетом размеченной русской части составил 30165. Этого, как мы выяснили во время экспериментов, должно было хватить для обучения русской модели.

А теперь к экспериментам!


Итак, данные собраны, пора переходить к обучению модели и экспериментам. Модель event2mind представляет собой нейросетевую архитектуру вида encoder-decoder с одним энкодером и тремя декодарами для каждого вида предсказаний (см. рисунок 4): намерение субъекта, его эмоции/реакции и эмоции/реакции других участников события, если таковые имеются (subjects intent, subjectss reaction и others events participants reactions). Исходные предложения изначально векторизуются с помощью одного из методов векторных представлений слов (например, word2vec или fasttext) и кодируются с помощью энкодера в вектор $h^E\in \mathbb{R}^H$. А затем с помощью трех RNN декодеров генерируются предсказания. Благодаря этому модель может генерировать ответы даже для намерений и реакций, которые она до этого не видела.

Рисунок 4. Архитектура модели event2mind


Для экспериментов мы использовали объединенный корпус для русского языка, размеченную и переведенную части. А чтобы сделать распределение русских и переведенных примеров более равномерным, мы дополнительно перемешали данные. Отметим, что мы также попробовали обучить модель только на размеченных данных, но из-за маленького объема датасета, она показала очень плохие результаты. Мы протестировали различные слои в энкодере LSTM и GRU, а также попробовали различные векторные представления fasttext и word2vec с RusVectores. Результаты приведены в таблице 3, результаты по intentам и reactам, как и ранее считались по метрике recall@10.

Таблица 3. результаты моделей для русского языка, intent и react оценивались по recall@10


Итак, какие выводы можно сделать из результатов экспериментов? Во-первых, word2vec embeddings оказались немного лучше, чем fasttext. При этом fasttext embeddings, обученные на ruscorpora показали себя лучше обученных на araneum. Во-вторых, можно отметить, что при использовании word2vec, GRU в энкодере оказывается лучше LSTM. И наконец, лучшая модель (areneum word2vec + GRU) практически повторяет результаты для английского языка.

И напоследок посмотрим на реальные примеры!





Весьма неплохо! Намерения выглядят весьма правдоподобно и действительно отражают какие-то общечеловеческие понятия и знания. А вот с эмоциями/реакциями модель справилась несколько хуже, они получились более примитивными и однообразными. Возможно, это связано с тем, что эмоции зависят от большего объема текста и короткого текста-события недостаточно, чтобы правильно его определить.

Вместо заключения


Итак, мы создали русскоязычный корпус для обучения модели event2mind. Помимо этого, мы провели эксперименты, которые показали, что архитектура event2mind работает для русского языка, который по своей природе грамматически сложнее английского. Несмотря на сложность русского языка, удалось достичь сравнимого с английским качества. Лучшая модель и данные выложены в репозитории.



Такой большой проект стал возможен, только благодаря совместным усилиям нашей команды. В адаптации event2mind для русского языка также принимали участие alenusch и onetwotrickster.
Подробнее..

Личный опыт изучения испанского так ли прост язык, как о нем пишут?

29.10.2020 20:09:21 | Автор: admin

Аtencin: Мнение, описанное в статье, субъективно, это личный взгляд на вещи. У каждого человека разные способности к изучению языков, как и к любой другой деятельности.

До переезда в Испанию у меня был скудный опыт в изучении иностранных языков. Относительного успеха я добилась только в изучении английского делового языка в университете. И даже его благополучно забыла в течение пары лет за ненадобностью. В 29 лет судьба закинула меня в Испанию, где я начала изучить совершенно новый для меня язык.

Все, что я читала в интернете на форумах живущих в Испании за полгода до переезда:

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

Как оказалось, многие утверждения вовсе не соответствуют реальному положению вещей. Подробнее обо всем этом под катом.

Как я готовилась к изучению испанского


Так как к переезду мы готовились заранее, я решила освоить азы испанского, в чем мне помогли видео на YouTube от Полиглота. Я их быстро просмотрела: запомнила не более 10 слов и принципы склонения простых глаголов в настоящем времени. Незнание меня не беспокоило, ведь меня ждали в Испании языковые курсы для таких же, как и я.

Когда начинаешь учить испанский язык, кажется, что все не так уж и плохо, даже для тех, у кого с гуманитарными науками проблемы. Уже через две недели после начала обучения я могла худо-бедно объясниться с преподавателем по бытовым и учебным вопросам. Но через два месяца стало понятно, что радовалась я рано.

Главная проблема: времена в испанском языке


В испанском языке выделяют от 14 до 18 времен, семь из которых сложные составные. Спрягается все это богатство в 4 наклонениях: повелительном, сослагательном, условном и изъявительном.

Изъявительное наклонение:

  • Presente de Indicativo;
  • Pretrito Indefinido;
  • Pretrito Imperfecto de Indicativo;
  • Pretrito Perfecto de Indicativo;
  • Pretrito Pluscuamperfecto de Indicativo;
  • Pretrito Anterior de Indicativo;
  • Futuro Simple de Indicativo;
  • Futuro Perfecto de Indicativo.

Повелительное наклонение:

  • Imperativo Afirmativo;
  • Imperativo Negativo.

Условное наклонение:

  • Condicional Simple;
  • Condicional Perfecto.

Сослагательное наклонение:

  • Presente de Subjuntivo;
  • Pretrito Imperfecto de Subjuntivo;
  • Pretrito Perfecto de Subjuntivo;
  • Pretrito Pluscuamperfecto de Subjuntivo;
  • Futuro Simple de Subjuntivo;
  • Futuro Perfecto de Subjuntivo.

Если сравнить с русским языком, то в великом и могучем исследователи выделяют от 10 до 16 времен. Но чаще всего используются три основные формы: будущее, прошедшее и настоящее время. В испанском языке активно используются все времена за исключением двух, которые можно увидеть только в официальных документах Futuro Simple de Subjuntivo и Futuro Perfecto de Subjuntivo.

Тем, кто изучает испанский, достается на освоение минимум 12 времен, о существовании большинства из которых я даже не догадывалась. Можно ли не мучить себя и разговаривать, используя три простых времени? Да, и вас скорее всего поймут. Но поймете ли вы, что вам ответят, другой вопрос. Однозначно, использовать только простые времена в разговорном испанском недостаточно. Если человек хочет влиться в испанское общество, найти работу или планирует учиться.

В моем плане перед переездом стояли два основных пункта: в течение полугода учиться языку и сразу после курсов начать учебу в университете, параллельно подтягивая испанский. Уже через два месяца после переезда я поняла, что мой план разлетелся в прах. Без потрясающих задатков схватывать иностранные слова на лету и запоминать их с первого раза, нет шансов научиться сносно говорить по-испански за полгода. Поэтому, похоронив свои надежды, я записалась на дополнительный семимесячный курс и параллельно наняла репетитора на 2-3 часа в неделю.

В первые полгода на учебу у меня уходило ежедневно от 5 до 7 часов с домашними заданиями. После того, как я записалась на новый курс и начала дополнительно заниматься с преподавателем, на испанский начало уходить до 10 часов каждый день. Это было полное погружение и сумасшедший ритм учебы. Несмотря на все мои усилия, я потратила полгода, чтобы начать разговаривать с людьми на улице.

Сослагательное наклонение и другие особенности


И в этот момент наша группа перешла к изучению сослагательного наклонения. С первого же урока стало ясно, что мы должны забыть все, что учили до этого, и начать учить заново с учетом subjuntivo. В русском языке также существует сослагательное наклонение, но в очень простой форме например, я бы пошел с тобой в кино, но буду занят. Вот это бы и формирует некоторую модальность глагола, то есть указывает на эмоции и желания говорящего.

Испанцы очень эмоциональный народ, у них сослагательное наклонение присутствует в любом разговоре и почти всех временах. Понять принцип и логику правил его употребления русскоязычному человеку достаточно сложно. Например, моей подруге из Италии даже не пришлось ничего учить, потому что в итальянском языке похожий подход. А я до сих пор ломаю голову, прежде чем сказать что-то в сослагательном наклонении.

И чтобы закрыть тему с испанскими глаголами, скажу только, что они склоняются по лицам и числам, как в русском языке. Например, простой глагол comer (с испанского есть) будет спрягаться следующим образом во всех временах:


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

Если говорить об испанском синтаксисе и фонетике, то здесь я, можно сказать, отдохнула. Правил немного, и они осваиваются в процессе обучения сами собой. В большинстве случаев слова читаются ровно так же, как и пишутся, за исключением пары правил. Например, звук h не произносится эту букву в слове нужно просто пропускать (зачем тогда она нужна?). LL всегда читается не как двойная л, а как й. Как видно, такие исключения несложно запомнить.


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


Для меня испанский язык стал не таким уж и податливым, как может показаться на первый взгляд. Я допускаю, что кто-то преодолеет языковой барьер раньше, но я не могла заставить себя разговаривать, зная, что делаю это неправильно.

Испанский язык в Андалусии


Даже несмотря на то, что некоторые испанцы искренне помогали мне в обучении, это часто вызывало дополнительные затруднения. А все потому, что учить кастильский испанский желательно одновременно с диалектом, который распространен в провинции, где ты живешь.

Я нахожусь в Андалусии, где испанский принял особую форму. Я ее любя называю деревенской. Представьте себе далекую русскую деревню, где люди говорят ейный и предпочитают разговаривать друг с другом очень громко, повышая тон в конце каждой фразы: Людк, а Людк, ты поросятам дала?!. Примерно таким образом говорят и здесь. Из-за этой особенности и манеры произношения слов жителями Андалусии долгое время я не могла начать общаться на испанском.

Сложно передать то уныние, когда после языковых курсов ты выходишь на улицу и не можешь разобрать почти ничего среди месива звуков и слов. И дело даже не в специфическом сленге, который есть в Андалусии и которого нет в словарях, а в манере произношения слов, глотании окончаний, сокращениях и очень высокой скорости, с которой предложения вылетают из уст окружающих. Например, известная всем фраза buenos das, или доброе утро, произносится в Андалусии очень быстро и в урезанном варианте. В итоге получается что-то вроде уэна!. А общение с пожилыми людьми у меня до сих пор вызывает некоторое страдание. Похожая ситуация и с молодежью от 10 до 25 лет, у которых своя манера общения и огромный запас жаргонных слов.

В процессе адаптации оказалось, что манера общения и андалузский диалект отличается от города к городу и от деревни к деревне. Даже в соседнем пригороде, который находится в километре от того места, где я живу, жители говорят немного по-другому. Это серьезно усложняет задачу, и даже сейчас я не всегда понимаю, что мне говорят, если в ход пошел местный говор.

То же самое можно сказать и о манере письма большинства испанцев. К несчастью, я состою в нескольких родительских чатах, потому что мои дети учатся в местной школе. Примерно половина родителей пишет корректно, используя при переписке официальный испанский язык и иногда расставляя запятые для лучшего понимания. А некоторые сообщения часто заставляют отставить бокал вина в сторону и усиленно разбирать сокращения, неграмотно написанные слова, а также мысленно расставлять точки там, где они не помешают. Часто только после серьезного разбора сообщения становится ясно, что оно не несет никакой полезной информации ни для кого, кроме самого отправителя.

При всех сложностях, которые возникали и возникают у меня на этом пути, испанцы никогда не отказываются повторить фразу или начать говорить чуть медленнее для успеха коммуникации. Практически всегда это сопровождается вежливой улыбкой. Но, на мой взгляд, радушие испанцев несколько преувеличено благодаря многочисленным отзывам туристов. Но об этом я напишу в другой раз.

А сейчас можно почитать про обучение в Испании (не языкам), переезд в Испанию и изучение английского в США.

Подробнее..

Перевод Тематическое исследование распознавания именованных сущностей в биомедицине

04.06.2021 18:05:38 | Автор: admin

Не так давно у автора этой статьи возник вопрос: может ли простой метод сопоставления строк в сочетании с некоторыми простыми оптимизациями конкурировать с моделью, обученной с учителем, в биомедицинской задаче распознавания именованных сущностей (NER)? Автор сравнил эти два метода между собой и предположил, что при правильном подходе даже простые модели могут конкурировать со сложными системами, а мы к старту курса "Machine Learning и Deep Learning" перевели его статью.


В начале любого нового проекта НИОКР я ищу наиболее подходящее решение поставленной задачи. Несмотря на наличие нескольких очень интересных крупных моделей, одной из моих самых больших проблем является внедрение решения в производство без ущерба для результатов, которые я хотел бы поддерживать.

Что касается системы сопоставления строк, я использовал классификатор QuickUMLS. QuickUMLS [1] как система сопоставления строк принимает на вход строку (например, документ или реферат статьи, содержащий медицинские понятия) и выводит все промежутки документа, которые соответствуют понятиям унифицированного языка медицинских систем (UMLS). Затем эти понятия могут быть повторно использованы в других условиях или в качестве исходных данных для других систем машинного обучения. По этой причине QuickUMLS можно рассматривать как удобный инструмент предварительной обработки для получения релевантных понятий из клинических и биомедицинских текстов. Однако в этой статье мы сосредоточимся на использовании QuickUMLS в качестве классификатора на сложном наборе данных MedMentions [2].

Рисунок 1. Схематическое описание того, как работает QuickUMLS. Получив строку, базу данных UMLS, превращённую в БД simstring, модель возвращает оптимальные соответствия, идентификаторы понятий и семантические типыРисунок 1. Схематическое описание того, как работает QuickUMLS. Получив строку, базу данных UMLS, превращённую в БД simstring, модель возвращает оптимальные соответствия, идентификаторы понятий и семантические типы

Некоторые ключевые моменты, которые необходимо знать о биомедицинском NER

Прежде чем мы погрузимся в проблему, которую пытаемся решить, полезно описать некоторые особенности биомедицинского NER. В целом проблема NER заключается в поиске именованных сущностей (например, известных мест, лиц, организаций и т. д.) в тексте. Как вы, вероятно, догадываетесь, многие из этих сущностей можно найти через контекст. Например, в таком предложении, как "Сэм и Дрю пошли в Колизей", мы можем сделать вывод, что Колизей это место, потому что вы обычно ходите в какие-то места. Аналогично, мы можем предположить, что "Сэм" это имя собственное, потому что слова в позиции подлежащего "идти", которые не являются обычными словами, это обычно имена.

В отличие от этого биомедицинская NER заключается в поиске и однозначном определении интересующих биомедицинских терминов из текста, таких как заболевания, названия лекарств, а также общих терминов, таких как "больница.роддом" (hospital), "палата интенсивной терапии/подопечный отделения интенсивной терапии" или "алкоголь/спирт" (alcohol). Это важное различие, поскольку существует очень мало контекстуальной информации, определяющей, имеет ли данное слово медицинское значение. Чтобы привести немного нагруженный пример, рассмотрим слово "alcohol" в предложении "пациент выпил много alcohol" [для ясности того, что речь идёт о неоднозначности, оставлено оригинальное alcohol]. Тяжесть этого заключения зависит от того, относится ли оно к алкоголю, такому как пиво или вино, или к чистому спирту, такому как спирт для растирания. Для более полного обзора состояния дел в области биомедицинского NER см. эту запись в блоге моего коллеги из Slimmer AI, Сибрена Янсена.

Знать, какие понятия имеют медицинское значение, сложно без большого количества обучающих данных, которые, как правило, не всегда доступны. Поэтому многие системы используют унифицированный язык медицинских систем (UMLS), которая представляет собой большую онтологию, содержащую множество различных понятий вместе с их строковыми представлениями и другой информацией. Обратите внимание, что "понятие" здесь отличается от "строки", поскольку многие строки могут ссылаться на более чем одно понятие. Например, строка "alcohol" может относиться к спирту для растирания или к алкогольным напиткам.

В UMLS каждое понятие описывается уникальным идентификатором понятия (CUI), который является символическим идентификатором для любого данного уникального понятия, и семантическим типом (STY), который, в свою очередь, является идентификатором семейства, группирующим понятия с похожими характеристиками. Одной из причин, по которой UMLS является полезным, но в то же время сложным для работы, его огромный размер. Версия UMLS 2020AB, которую мы будем использовать в дальнейшем, насчитывает более 3 миллионов уникальных английских понятий. Маловероятно, что значительная часть этих понятий появится даже в больших аннотированных наборах данных.

Работа с набором данных MedMentions

Одним из таких наборов данных является MedMentions. Он состоит из 4 392 статей (заголовки и рефераты), опубликованных в Pubmed за 2016 год; аннотировано 352 K понятий (идентификаторов CUI) и семантических типов из UMLS. В документах имеется около 34 тысяч аннотированных уникальных понятий это около 1 % от общего числа понятий в UMLS. Факт показывает, что аннотирование упоминаний в UMLS является сложной задачей, которую не всегда можно решить с помощью машинного обучения с учителем.

Особый интерес в этом отношении представляет то, что корпус MedMentions включает в тестовое множество CUI, которые не встречаются в обучающем наборе. В целом, однако, эта задача всё ещё рассматривается как задача машинного обучения с учителем и с использованием семантических типов понятий UMLS в качестве меток. Поскольку UMLS имеет 127 семантических типов, это всё равно приводит к большому пространству меток. У набора данных MedMentions тоже есть уменьшенная версия st21pv, который состоит из тех же документов, что и обычный набор, но в нём аннотирован только 21 наиболее часто встречающийся семантический тип.

Полумарковская базовая модель получает около 45,3 по F-мере на уровне сущностей [2]. Другие подходы, включая BlueBERT [3] и BioBERT [4], были протестированы и улучшили оценку до 56,3 балла, используя точное соответствие на уровне сущностей [5]. Обратите внимание, что все эти подходы являются контролируемыми и, следовательно, полагаются на определённое совпадение между обучающим и тестовым множеством в плане понятий. Если понятие или метка никогда не встречалась в процессе обучения, в подходе машинного обучения с учителем будет сложно её правильно классифицировать. Далее в качестве меток мы будем использовать семантические типы из набора данных MedMentions.

QuickUMLS: без учителя и на основе знаний

В отличие от BERT QuickUMLS по своей сути является методом без учителя, а это означает, что он не полагается на обучающие данные. Точнее, QuickUMLS это метод, основанный на знаниях. То есть модель, вместо того чтобы иметь параметры, сообщающих, что прогнозировать, для прогнозирования меток полагается на внешнюю базу знаний. Подход подразумевает две вещи:

  1. Качество модели ограничено качеством базы знаний. Модель не может предсказать то, чего нет в базе знаний.

  2. Модель может обобщать не только аннотированные данные. Модель, которая обучалась с учителем и во время обучения не видела конкретной метки, в целом не может точно предсказать эти вещи. Исключение из правила методы обучения zero-shot.

Zero-shot learning (ZSL) это постановка задачи в машинном обучении, когда во время тестирования алгориттм наблюдает выборки из классов, которые не наблюдались во время обучения, и должен спрогнозировать, к какому классу они принадлежат.

Исходя из этих двух фактов, мы утверждаем, что основанные на знаниях методы хорошо подходят для набора данных MedMentions. Что касается первого пункта, база данных MedMentions была аннотирована с использованием понятий UMLS, поэтому сопоставление между базой знаний и набором данных является точным сопоставлением. Что касается второго пункта, набор данных MedMentions в тестовом наборе содержит понятия, которых нет в обучающем наборе.

Архитектура модели QuickUMLS

QuickUMLS как модель проста. Сначала она анализирует текст с помощью парсера spacy. Затем выбирает словесные n-граммы, то есть последовательности слов, на основе цитат и описаний цитат, а также списков стоп-слов. Это означает, что модель отбрасывает определённые словесные n-граммы, если они содержат нежелательные токены и знаки препинания. Подробные сведения об этих правилах можно найти в оригинальной статье [1]. После выбора кандидатов вся база данных UMLS запрашивается, чтобы найти понятия, частично соответствующие словам n-грамм. Поскольку точное сопоставление в такой огромной базе данных неэффективно и сложно, авторы выполняют приблизительное сопоставление строк с помощью simstring [6]. При задании текста QuickUMLS, таким образом, возвращает список понятий в UMLS вместе с их сходством со строкой запроса и другой связанной информацией. Например, текст У пациента было кровоизлияние, используя (по умолчанию) порог сходства строк 0,7, возвращает следующих кандидатов:

Для слова patient:

{term: Inpatient, cui: C1548438, similarity: 0.71, semtypes: {T078}, preferred: 1},{term: Inpatient, cui: C1549404, similarity: 0.71, semtypes: {T078}, preferred: 1},{term: Inpatient, cui: C1555324, similarity: 0.71, semtypes: {T058}, preferred: 1},{term: *^patient, cui: C0030705, similarity: 0.71, semtypes: {T101}, preferred: 1},{term: patient, cui: C0030705, similarity: 1.0, semtypes: {T101}, preferred: 0},{term: inpatient, cui: C0021562, similarity: 0.71, semtypes: {T101}, preferred: 0}

Для слова hemmorhage:

{term: No hemorrhage, cui: C1861265, similarity: 0.72, semtypes: {T033}, preferred: 1},{term: hemorrhagin, cui: C0121419, similarity: 0.7, semtypes: {T116, T126}, preferred: 1},{term: hemorrhagic, cui: C0333275, similarity: 0.7, semtypes: {T080}, preferred: 1},{term: hemorrhage, cui: C0019080, similarity: 1.0, semtypes: {T046}, preferred: 0},{term: GI hemorrhage, cui: C0017181, similarity: 0.72, semtypes: {T046}, preferred: 0},{term: Hemorrhages, cui: C0019080, similarity: 0.7, semtypes: {T046}, preferred: 0}

Как вы можете видеть, слово patient имеет три соответствия с корректным семантическим типом (T101) и два соответствия с корректным понятием (C0030705). Слово кровоизлияние также имеет лишние совпадения, включая понятие "No hemmorhage". Тем не менее кандидат с самым высоким рейтингом, если исходить из сходства, является правильным в обоих случаях.

В приложении QuickUMLS по умолчанию мы сохраняем только предпочтительные термины, то есть термины, для которых предпочтительным является 1, а затем сортируем по сходству. После мы берём семантический тип (семтип) кандидата с самым высоким рейтингом в качестве прогноза мы называем это базовой моделью (baseline model). Мы использовали seqeval со строгой парадигмой соответствия, которая сопоставима с предыдущей работой [5].

    BERT  QUMLS  P   .53    .27  R   .58    .36  F   .56    .31 Таблица 1  производительность базовой модели

Не слишком впечатляюще, правда? К сожалению, базовая модель страдает от плохого случая, когда она не оптимизирована для конкретной задачи. Таким образом, давайте оптимизируем её с помощью простой эвристики.

Улучшение QuickUMLS с помощью некоторых простых оптимизаций

Есть несколько способов улучшить QuickUMLS помимо его первоначальной производительности. Во-первых, отметим, что стандартный синтаксический анализатор, используемый QuickUMLS, по умолчанию является моделью spacy, т. е. en_core_web_sm. Учитывая, что мы имеем дело с биомедицинским текстом, нам лучше применить модель биомедицинского языка. В нашем случае мы заменили spacy на scispacy [7], en_core_sci_sm. Это уже немного повышает производительность без каких-либо затрат.

    BERT  QUMLS  + Spacy  P   .53    .27      .29  R   .58    .36      .37  F   .56    .31      .32 Таблица 2  Замена на scispacy

Другие улучшения можно получить, используя некоторую информацию из учебного корпуса. Хотя это действительно превращает QuickUMLS из метода без учителя в метод с учителем, зависимости от большого количества конкретных аннотаций по-прежнему нет. Другими словами, нет явного подходящего шага для конкретного корпуса: улучшения, которые мы собираемся сделать, также могут быть оценены с помощью небольшого набора аннотаций или знаний врача, которыми он владеет по определению.

Оптимизация порога QuickUMLS

Настройки по умолчанию для QuickUMLS включают пороговое значение 0,7 и набор метрик. Метрика определяет, как подсчитывается сходство строк, и может быть установлена в Jaccard, cosine, overlap и dice. Мы выполняем поиск по сетке, по метрике и различным пороговым значениям. Наилучшими результатами оказались пороговые значения 0,99, а это означает, что мы выполняем точные совпадения только с помощью SimString и метрики Jaccard, которая превосходит все другие варианты с точки зрения скорости и оценки. Как видите, мы всё ближе и ближе подходим к производительности BERT.

    BERT  QUMLS  + Spacy  + Grid  P   .53    .27      .29     .37  R   .58    .36      .37     .37  F   .56    .31      .32     .37 Таблица 3  Поиск по сетке параметров

Преимущество добавления априорной вероятности

Напомним, что выше мы просто выбрали лучшего подходящего кандидата, основываясь на том, была ли это предпочтительная строка, и на их сходстве. Однако во многих случаях разные понятия будут иметь одно и то же строковое представление, как, например, в вышеупомянутом примере с alcohol. Это затрудняет выбор оптимального кандидата без модели устранения неоднозначности, которая требует контекста, и снова превращает проблему обучения в проблему обучения с учителем или по крайней мере требующую примеров контекстов, в которых встречаются термины. Один из простых выходов из этой головоломки состоит в том, чтобы учесть, что при прочих равных условиях некоторые семантические типы просто более вероятны и, следовательно, более вероятны в данном корпусе. Такая вероятность называется априорной вероятностью.

В нашем случае мы оцениваем априорную вероятность принадлежности к классу через обучающий набор данных, как это было бы сделано в хорошо известном наивном Байесовском классификаторе. Затем для каждого семантического типа, который мы извлекаем, в свою очередь, для каждого набора кандидатов, мы берём максимальное сходство, а затем умножаем его на предыдущий. В терминах нейронной сети вы можете представить это как максимальное объединение на уровне класса. Оно также означает, что мы игнорируем приоритетность кандидатов.

    BERT  QUMLS  + Spacy  + Grid  + Priors  P   .53    .27      .29     .37       .39  R   .58    .36      .37     .37       .39  F   .56    .31      .32     .37       .39 Таблица 4  Добавление приоров

К сожалению, это всё, что мы могли бы получить, используя простую систему в QuickUMLS. Учитывая, что мы в конечном счёте использовали порог 0,99, это означает, что мы вообще не используем функциональность приблизительного сопоставления QuickUMLS. Удаление приблизительного сопоставления также значительно ускорит работу всей системы, так как большая часть времени алгоритма теперь тратится на сопоставление в QuickUMLS.

Глубокое погружение в анализ ошибок: соответствовало ли наше решение поставленной задаче?

Когда мы выполняем задачу распознавания именованных сущностей, мы можем допустить ошибки нескольких типов. Во-первых, мы можем извлечь правильный промежуток, но неправильный класс. Это происходит, когда мы находим правильный термин, но даём ему неправильную метку: например, мы думаем, что alcohol относится к напитку, в то время как он относится к дезинфицирующему средству. Во-вторых, мы также можем извлечь промежуток частично, но при этом всё равно сопоставить его правильной метке. В этом случае возможно рассматривать совпадение как частичное совпадение. В нашем скоринге мы считали правильными только точные совпадения. Пример извлечение мягкого анестетика, когда золотым стандартом является анестетик. Мы также можем полностью пропустить какие-то промежутки, например потому, что UMLS не содержит термина, или извлечь не соответствующие упоминаниям золотого стандарта промежутки. На рисунке ниже показано, какие виды ошибок допускает наша система:

Это показывает, что ошибки, которые делает QuickUMLS, не относятся к одной конкретной категории. Она извлекает слишком много элементов, но, когда она делает это, то также часто присваивает им неправильную метку. Это показывает, что QuickUMLS можно использовать в качестве системы предварительного извлечения, после чего для назначения правильной метки можно применить систему устранения неоднозначности.

Заключение

Как вы можете видеть из результатов, готовая система извлечения терминологии может быть использована в качестве эффективной системы NER без обучения. Получение обучающих данных для конкретных случаев применения часто может быть трудоёмким, снижающим скорость R&D процессом. Построенный нами классификатор QuickUMLS показывает, что мы можем многого добиться с очень небольшим количеством обучающих примеров. И, будучи разумными в том, как использовать ресурсы, мы в процессе исследований и разработок для биомедицинских исследований сэкономили много времени. Модифицированный классификатор QuickUMLS можно опробовать здесь, на github. Преимущество подхода может означать, что мы нашли решение, достаточно надёжное для достижения конечного результата, простое в разработке и тестировании, а также достаточно небольшое, чтобы легко внедрить его в разработку продукта.

Именно сегодня медицина одна из самых важных областей знания, а обработка естественного языка одна из самых интересных областей в ИИ: чем лучше искусственный интеллект распознаёт речь, текст, чем точнее обрабатывает её, тем ближе он к здравому смыслу человека.

Вместе с тем одни из самых успешных моделей так или иначе комбинируют подходы из разных областей ИИ, например мы писали о визуализации пения птиц, чтобы ИИ работал со звуком так же, как работает с изображениями и если вам интересна не только обработка естественного языка, но и эксперименты с ИИ в целом, вы можете обратить внимание на наш курс "Machine Learning и Deep Learning", партнёром которого является компания NVIDIA.

Ссылки

[1]L. Soldaini, and N. Goharian. Quickumls: a fast, unsupervised approach for medical concept extraction, (2016), MedIR workshop, SIGIR

[2]S. Mohan, and D. Li, Medmentions: a large biomedical corpus annotated with UMLS concepts, (2019), arXiv preprint arXiv:1902.09476

[3]Y. Peng, Q. Chen, and Z. Lu, An empirical study of multi-task learning on BERT for biomedical text mining, (2020), arXiv preprint arXiv:2005.02799

[4]J. Lee, W. Yoon, S. Kim, D. Kim, S. Kim, C.H. So, and J. Kang, BioBERT: a pre-trained biomedical language representation model for biomedical text mining, (2020), Bioinformatics, 36(4)

[5]K.C. Fraser, I. Nejadgholi, B. De Bruijn, M. Li, A. LaPlante and K.Z.E. Abidine, Extracting UMLS concepts from medical text using general and domain-specific deep learning models, (2019), arXiv preprint arXiv:1910.01274.

[6]N. Okazaki, and J.I. Tsujii, Simple and efficient algorithm for approximate dictionary matching, (2010, August), In Proceedings of the 23rd International Conference on Computational Linguistics (Coling 2010)

[7]M. Neumann, D. King, I. Beltagy, and W. Ammar, Scispacy: Fast and robust models for biomedical natural language processing, (2019),arXiv preprint arXiv:1902.07669.

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Другие профессии и курсы
Подробнее..

How to learn languages online (fast) (Как учить языки онлайн быстро). Intro

27.10.2020 16:17:12 | Автор: admin
Вдохновленная названием сериала от Netflix How to sell drugs online (fast), я решила написать данный пост, который повлечет за собой в дальнейшем серию постов о том, как учить иностранные языки онлайн и (!) быстро. Эти посты будут содержать в себе полезные ссылки на ресурсы и позволят, при поступательном чтении и выполнении всех рекомендаций и заданий, освоить язык с нуля до довольно приемлемого уровня, позволяющего общаться на иностранном языке, читать литературу, смотреть сериалы. А сейчас несколько советов о том, как вообще учить языки.

Совет 1. Словарные карточки
Это словосочетание не обязывает вас вырезать карточки, расклеивать по всему дому, всюду носить с собой (но если вам так проще пожалуйста). В эпоху мобильных приложений существует ряд весьма удобных способов замены словарных карточек. Я рекомендую вам использовать приложение Anki.

Совет 2. Записывайте в словарные карточки и учите ВСЕ новые слова, с которыми вы встретились за день
Каким бы способом изучения языка вы ни пользовались, не идите по программе дальше, пока не выучите весь словарный запас прошлого урока. Будете делать так будете ощущать прогресс. Не будете и вам покажется, что вы топчетесь на месте, ибо изучение языка на 70% состоит из зазубривания новых слов и выражений.

Совет 3. Пишите эссе или дневник
После каждого урока и освоения новой лексики пишите небольшое эссе, которое будет включать эту лексику по максимуму. Если вы изучаете немецкий, проходите тему интерьер и знаете только, как составлять простые предложения составляйте! Пусть это будет банальное Das ist meine Wohnzimmer. Dieses Wohnzimmer ist wei. Главное писать регулярно. Обязательно сохраняйте все свои эссе, это даст вам возможность спустя время сравнить, какими они были в начале и какие они теперь и узреть прогресс. Поверьте, это очень мотивирует.

Совет 4. Every day practice
Посвящайте языку каждый свой день без перерыров и выходных, иначе он начнет забываться. Если у вас нет времени на полноценное занятие, откройте приложение Anki и повторите словарные карточки. Слова нужно учить обязательно на ежедневной основе. Пусть это будут 1520 мин в день, но они непременно должны быть. Именно регулярность занятий позволит вам в короткие сроки достичь прогресса.

Совет 5. Учите грамматику
Именно знание грамматических правил позволит вам в короткие сроки освоить язык то, что недоступно ребенку, когда он, находясь в языковой среде, пытается заговорить на родном языке. Именно грамматика тот ключ, который сокращает вашу дистанцию в языковом пути от многих лет до месяцев. Поэтому не игнорируйте грамматику. Она может стать вам отличным подспорьем и другом на этом увлекательнейшем пути.

Совет 6. Много практикуйте язык (чтение и сериалы)
Именно чтение большого количества литературы, соответствующей вашему уровню, и просмотр кино и сериалов, позволят вам выработать ощущение языка то, что имеется на уровне интуиции у любого носителя языка. При наличии этого ощущения вам будет резать слух любое грамматически неверное предложение, тогда и вы сами, волей-неволей, начнете говорить правильно и с удовольствием.

Успехов вам в освоении языков и ждите новых постов они будут максимально информативны!
Подробнее..

How to learn languages online fast. English. Part 1

27.10.2020 22:13:13 | Автор: admin
Список предыдущих статей:
0. Intro

Здесь и в дальнейших статьях будет использоваться комплексный подход к изучению языка. В каждой статье будет содержаться информация о фонетике, правилах чтения буквосочетаний, грамматике и лексике, будут даваться упражнения для закрепления материала. Структура статей будет опираться на учебник Бонк, расширяемая и дополняемая материалами из открытых источников. В дальнейшем, в статьях более продвинутого уровня, материалы будут дополняться публикациями из сферы IT.

Алфавит


Первое, с чего начинается изучение любого языка это алфавит. В английском алфавите 26 букв:
image

Примерное произношение с использованием кириллической транскрипции следующее:

A эй
B би
C си
D ди
E и
F эф
G джи
H эйч
I ай
J джей
K кей
L эл
M эм
N эн
O оу
P пи
Q кью
R а
S эс
T ти
U ю
V ви
W дабл ю
X экс
Y уай
Z зэт

Задание 1. Отработайте произношение и (желательно) выучите алфавит наизусть. Используйте следующее видео. Обязательно повторяйте вслед за диктором.

Фонетика. Звуки [i:, e, m, p, b, f, v, t, d, n, l]


Следующие звуки произносятся так:

[i:] долгий гласный звук и, как в слове ива
[e] краткий гласный звук, как звук e в слове жесть
[m] согласный звонкий звук м, при произнесении английской м губы смыкаются плотнее, чем при произнесении русской м
[p] английская п, глухой согласный звук, в отличии от русской п английский аналог произносится с придыханием. Чтобы понять, что такое придыхание, попробуйте произнести эту букву не только с помощью рта, но и с помощью легких
[b] звонкая согласная б, в конце слов не оглушается
[f] английский вариант ф, английский произносится более энергично, чем русский аналог.
[v] звонкий согласный в
[t] глухой согласный т. Перед гласными произносится с придыханием
[d] звонкий согласный звук д
[n] звонкая согласная н
[l] звонкий л. Перед гласными произносится с мягким оттенком, перед согласными и в конце слова с твердым

Видео о разнице между звуками [i:] и [i] youtu.be/_mMzVLHTp1s.
Видео о звуке [е] youtu.be/G3SozCwH-z8.

Задание 2. Посмотрите видео о гласных звуках [i:] и [e]

Буква е и буквосочетание ее


Буква е в словах читается следующим образом:

1. Как звук [i:], например, в словах Pete, me, be.
2. Как звук [e], например, в словах ten, pen, bed.

Сочетание ее читается как [i:]. Пример: meet

Задание 3. Прочитайте вслух следующие слова:

[i:]: deep, be, been, me, meet, feet, Pete
[e]: ten, pen, bed, men, net, tell, Ben, Ted

Лексика


Выпишите в приложение Anki или словарные карточки и запомните следующие слова:

meet встречать, знакомиться
tell рассказывать, говорить
me мне, меня
be быть
ten десять
pen ручка
bed кровать
men мужчина, человек
deep глубоко

Если вам не вполне ясно, как произносятся те или иные слова вбейте их в любой онлайн-переводчик и послушайте произношение.

Грамматика: побудительные предложения


Побудительные предложения, как и в русском языке, выражают побуждение говорящего собеседника к выполнению просьбы или указания. Строятся они довольно просто:

Глагол + дополнение (существительное или местоимение).
Например,

Tell Ben (Скажи Бену)
Meet me (Встреться со мной).

Задание 4. Составьте ряд побудительных предложений из слов, которые вы выучили из данного урока.

В заключение, держите серию видеороликов об истории английского языка (опционально) youtu.be/osMfsmEcbhs.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru