Хабрахабр

[Перевод] Google Cloud: новая платформа и возможности машинного обучения

Здравствуйте, коллеги.

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

и почитать под катом о небольшой библиотеке, предназначенной для обработки естественного языка на R.

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

Именно для этой цели в Google разработали пакет googleLanguageR на языке R, позволяющий преобразовывать речь в текст, обеспечивающий перевод с применением нейронных сетей и обработку естественного языка, при помощи сервисов машинного обучения, предлагаемых в Google Cloud.

Ниже вы можете кратко ознакомиться с этим пакетом, а более подробная информация приведена на сайте googleLanguageR.

Выбор Google

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

Благодаря двадцатилетнему опыту поискового индексирования Google наработала беспрецедентный корпус данных для обучения моделей. Возможно, Google – и не единственная компания с такими амбициями, но у Google есть важное преимущество: объем данных, имеющийся в распоряжении. Таким образом, Google удобно разрабатывать приложения для машинного обучения и встраивать их в свои продукты – например, в поисковик и Gmail. Кроме того, недавние шаги Google в сторону обработки аудио и видео позволили компании собрать крупнейшие речевые и звуковые множества данных. Также Google всерьез занялась опенсорсом, создав ведущую библиотеку машинного обучения Tensorflow и опубликовав ее код. Google готова и далее инвестировать в эту отрасль – отметим хотя бы, что недавно компания приобрела британский стартап Deepmind, занятый исследованиями в сфере искусственного интеллекта и обучивший собственный бот игре го – недавно в новостях сообщалось, что эта программа обыграла чемпиона мира по го.

googleLanguageR служит оберткой для подгруппы таких API машинного обучения, тяготеющих к обработке естественного языка — Cloud Speech, Translation и Natural Language. Конечно, вы можете создавать собственные модели машинного обучения, но для тех, у кого для этого не хватает опыта, данных или времени, Google также предлагает все более разнообразные API для машинного обучения, которые уже предобучены для решения конкретных задач – например, для распознавания образов и видео или для поиска работы.

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

Зачем это нужно

Фейковые новости

Я интересовался, возможно ли каким-либо образом измерить, в какой степени новостной сюжет подкрепляет чье-то личное предвзятое отношение к проблеме в пределах индивидуального пузыря фильтров. Одна из причин, по которым мы стали присматриваться к этой теме – это «фейковые новости» и тот эффект, который они оказывают на политический дискурс в соцсетях. API сущностей позволяет выполнять масштабный анализ сущностей и тональности на материале твитов, на основании чего сопоставляются различные пользователи и интересующие их новостные источники – и определяется, насколько они коррелируют с вашими предпочтениями, взглядами и вашей подборкой «авторитетных» источников.

Написать собственную Alexa

По данным Google, уже сегодня 20% запросов поступает через голосовой поиск. Еще один мотив прикладного характера связан с тем, что в настоящее время пользователи все активнее начинают работать с приложениями при помощи голосовых команд – и постепенно такое взаимодействие станет основным. Приложение Shiny, записывающее ваш голос, загружает его на API, затем разбирает возвращенный текст и преобразует его в действия. Хотелось бы, чтобы у меня была возможность сформулировать запрос так: “R, распечатай мне этот отчет для клиента X”. Таким образом, вы можете создать собственную Alexa-подобную инфраструктуру.

Подключенный к Интернету микрофон, активируемый голосом. Alexa от Amazon. Изображение с сайта www.amazon.co.uk

Перевести все

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

Работа с библиотекой

Чтобы использовать эти API на языке R, сначала нужно выполнить одноразовую начальную настройку и создать Google Project, добавить номер кредитной карты и аутентифицироваться – весь процесс подробно описан на странице пакета.

Благодаря rOpenSci review удалось обеспечить удобное наращивание этой системы – таким образом, в программу можно записывать крупные текстовые векторы, которые библиотека затем будет разбирать; при необходимости скорость можно ограничить. После этого заносите в систему те объекты R, которыми собираетесь манипулировать. Функции также работают с синтаксисом каналов tidyverse.

Преобразование речи в текст

Речевой Cloud Speech API предоставляется через функцию gl_speech.

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

Пример кода:

library(googleLanguageR) my_audio <- "my_audio_file.wav"
gl_speech(my_audio)
# A tibble: 1 x 3
# transcript confidence words
#* <chr> <dbl> <list>
#1 Hello Mum 0.9227779 <data.frame [19 x 3]>

Перевод

Переводческий Cloud Translation API позволяет переводить текст при помощи функции gl_translate.

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

library(googleLanguageR)
library(cld2)
library(purrr) my_text <- c("Katten sidder på måtten", "The cat sat on the mat") ## offline detect language via cld2
detected <- map_chr(my_text, detect_language)
# [1] "DANISH" "ENGLISH" ## get non-English text
translate_me <- my_text[detected != "ENGLISH"] ## translate
gl_translate(translate_me)
## A tibble: 1 x 3
# translatedText detectedSourceLanguage text
#* <chr> <chr> <chr>
#1 The cat is sitting on the mat da Katten sidder på måtten

Обработка естественного языка

Этот API доступен через функцию gl_nlp. API для обработки естественного языка помогает разобраться со структурой и значением текста.

Он обеспечивает несколько видов анализа:

  • Анализ сущностей – находим в тексте именованные сущности (сейчас речь идет о об именах собственных и распространенных именах нарицательных), а также исследуем значимость, количество упоминаний каждой сущности и другие свойства. По возможности также возвращаем метаданные о конкретной сущности, например, ссылку на статью Википедии.
  • Синтаксис – анализируем синтаксис текста, размечаем границы предложений и делаем токенизацию, а также частично анализируем части речи, деревья зависимостей и другие свойства.
  • Тональность – общая тональность текста, выражаемая по шкале [0, +беск] и в диапазоне от -1.0 (негативная) до 1.0 (положительная)

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

Ниже показано, какой вывод вы могли бы получить:

library(googleLanguageR)
quote <- "Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."
nlp <- gl_nlp(quote) str(nlp)
#List of 6
# $ sentences :List of 1
# ..$ :'data.frame': 1 obs. of 4 variables:
# .. ..$ content : chr "Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."
# .. ..$ beginOffset: int 0
# .. ..$ magnitude : num 0.6
# .. ..$ score : num -0.6
# $ tokens :List of 1
# ..$ :'data.frame': 20 obs. of 17 variables:
# .. ..$ content : chr [1:20] "Two" "things" "are" "infinite" ...
# .. ..$ beginOffset : int [1:20] 0 4 11 15 23 25 29 38 42 48 ...
# .. ..$ tag : chr [1:20] "NUM" "NOUN" "VERB" "ADJ" ...
# .. ..$ aspect : chr [1:20] "ASPECT_UNKNOWN" "ASPECT_UNKNOWN" "ASPECT_UNKNOWN" "ASPECT_UNKNOWN" ...
# .. ..$ case : chr [1:20] "CASE_UNKNOWN" "CASE_UNKNOWN" "CASE_UNKNOWN" "CASE_UNKNOWN" ...
# .. ..$ form : chr [1:20] "FORM_UNKNOWN" "FORM_UNKNOWN" "FORM_UNKNOWN" "FORM_UNKNOWN" ...
# .. ..$ gender : chr [1:20] "GENDER_UNKNOWN" "GENDER_UNKNOWN" "GENDER_UNKNOWN" "GENDER_UNKNOWN" ...
# .. ..$ mood : chr [1:20] "MOOD_UNKNOWN" "MOOD_UNKNOWN" "INDICATIVE" "MOOD_UNKNOWN" ...
# .. ..$ number : chr [1:20] "NUMBER_UNKNOWN" "PLURAL" "NUMBER_UNKNOWN" "NUMBER_UNKNOWN" ...
# .. ..$ person : chr [1:20] "PERSON_UNKNOWN" "PERSON_UNKNOWN" "PERSON_UNKNOWN" "PERSON_UNKNOWN" ...
# .. ..$ proper : chr [1:20] "PROPER_UNKNOWN" "PROPER_UNKNOWN" "PROPER_UNKNOWN" "PROPER_UNKNOWN" ...
# .. ..$ reciprocity : chr [1:20] "RECIPROCITY_UNKNOWN" "RECIPROCITY_UNKNOWN" "RECIPROCITY_UNKNOWN" "RECIPROCITY_UNKNOWN" ...
# .. ..$ tense : chr [1:20] "TENSE_UNKNOWN" "TENSE_UNKNOWN" "PRESENT" "TENSE_UNKNOWN" ...
# .. ..$ voice : chr [1:20] "VOICE_UNKNOWN" "VOICE_UNKNOWN" "VOICE_UNKNOWN" "VOICE_UNKNOWN" ...
# .. ..$ headTokenIndex: int [1:20] 1 2 2 2 2 6 2 6 9 6 ...
# .. ..$ label : chr [1:20] "NUM" "NSUBJ" "ROOT" "ACOMP" ...
# .. ..$ value : chr [1:20] "Two" "thing" "be" "infinite" ...
# $ entities :List of 1
# ..$ :Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 6 obs. of 9 variables:
# .. ..$ name : chr [1:6] "human stupidity" "things" "universe" "universe" ...
# .. ..$ type : chr [1:6] "OTHER" "OTHER" "OTHER" "OTHER" ...
# .. ..$ salience : num [1:6] 0.1662 0.4771 0.2652 0.2652 0.0915 ...
# .. ..$ mid : Factor w/ 0 levels: NA NA NA NA NA NA
# .. ..$ wikipedia_url: Factor w/ 0 levels: NA NA NA NA NA NA
# .. ..$ magnitude : num [1:6] NA NA NA NA NA NA
# .. ..$ score : num [1:6] NA NA NA NA NA NA
# .. ..$ beginOffset : int [1:6] 42 4 29 86 29 86
# .. ..$ mention_type : chr [1:6] "COMMON" "COMMON" "COMMON" "COMMON" ...
# $ language : chr "en"
# $ text : chr "Two things are infinite: the universe and human stupidity; and I'm not sure about the universe."
# $ documentSentiment:Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 2 variables:
# ..$ magnitude: num 0.6
# ..$ score : num -0.6

Благодарности

1. Пакет удалось значительно усовершенствовать благодаря помощи рецензентов – Нила Ричардсона и Джулии Густавсен, благодаря которым документация, вывод и тестовые примеры были приведены в тот вид, в каком вошли в состав версии 0. Спасибо большое! 0.

Можете высказываться поэтому поводу на Github – и мы постараемся реализовать ваши предложения. Надеемся, что пока мы только в начале пути, и пакет помогут улучшить сами пользователи. Очень интересно увидеть, чего смогут добиться пользователи, вооружившись такими мощными инструментами.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть