Здравствуйте, коллеги.
В последнее время мы вынашиваем планы издать книгу по обработке естественного языка. Одним из наиболее масштабных решений, которые определяют перспективы этой отрасли, несомненно, является платформа Google Cloud, как нельзя лучше адаптированная для машинного обучения. Просим высказываться о востребованности этой книги
и почитать под катом о небольшой библиотеке, предназначенной для обработки естественного языка на R.
Одни из важнейших благ, которыми мы располагаем — это речь и язык. Именно благодаря речевой способности мы можем похвастаться практически всеми нашими достижениями. Способность анализировать коммуникацию помогает нам гораздо лучше понимать друг друга.
Именно для этой цели в Google разработали пакет googleLanguageR
на языке R, позволяющий преобразовывать речь в текст, обеспечивающий перевод с применением нейронных сетей и обработку естественного языка, при помощи сервисов машинного обучения, предлагаемых в Google Cloud.
Ниже вы можете кратко ознакомиться с этим пакетом, а более подробная информация приведена на сайте googleLanguageR
.
Выбор Google
По прогнозам Google машинное обучение станет фундаментальной составляющей любого бизнеса, поэтому Google стремится собрать такую инфраструктуру, в которой созданы все условия для машинного обучения. Образно говоря, если машинное обучение – это электричество, то Google хочет стать той компанией, что уставит всю страну опорами ЛЭП.
Возможно, Google – и не единственная компания с такими амбициями, но у Google есть важное преимущество: объем данных, имеющийся в распоряжении. Благодаря двадцатилетнему опыту поискового индексирования Google наработала беспрецедентный корпус данных для обучения моделей. Кроме того, недавние шаги Google в сторону обработки аудио и видео позволили компании собрать крупнейшие речевые и звуковые множества данных. Таким образом, Google удобно разрабатывать приложения для машинного обучения и встраивать их в свои продукты – например, в поисковик и Gmail. Google готова и далее инвестировать в эту отрасль – отметим хотя бы, что недавно компания приобрела британский стартап Deepmind, занятый исследованиями в сфере искусственного интеллекта и обучивший собственный бот игре го – недавно в новостях сообщалось, что эта программа обыграла чемпиона мира по го. Также Google всерьез занялась опенсорсом, создав ведущую библиотеку машинного обучения Tensorflow и опубликовав ее код.
Конечно, вы можете создавать собственные модели машинного обучения, но для тех, у кого для этого не хватает опыта, данных или времени, Google также предлагает все более разнообразные API для машинного обучения, которые уже предобучены для решения конкретных задач – например, для распознавания образов и видео или для поиска работы. googleLanguageR служит оберткой для подгруппы таких API машинного обучения, тяготеющих к обработке естественного языка — Cloud Speech, Translation и Natural Language.
Поскольку вывод всех этих API взаимно дополняет друг друга, все три API включены в один пакет. Например, можно расшифровать чьи-то слова, произнесенные по-датски, перевести этот текст на английский и определить, положительно или отрицательно автор относится к содержанию (анализ тональности), а затем вычленить самые важные концепции и объекты в тексте (анализ сущностей).
Зачем это нужно
Фейковые новости
Одна из причин, по которым мы стали присматриваться к этой теме – это «фейковые новости» и тот эффект, который они оказывают на политический дискурс в соцсетях. Я интересовался, возможно ли каким-либо образом измерить, в какой степени новостной сюжет подкрепляет чье-то личное предвзятое отношение к проблеме в пределах индивидуального пузыря фильтров. API сущностей позволяет выполнять масштабный анализ сущностей и тональности на материале твитов, на основании чего сопоставляются различные пользователи и интересующие их новостные источники – и определяется, насколько они коррелируют с вашими предпочтениями, взглядами и вашей подборкой «авторитетных» источников.
Написать собственную Alexa
Еще один мотив прикладного характера связан с тем, что в настоящее время пользователи все активнее начинают работать с приложениями при помощи голосовых команд – и постепенно такое взаимодействие станет основным. По данным Google, уже сегодня 20% запросов поступает через голосовой поиск. Хотелось бы, чтобы у меня была возможность сформулировать запрос так: “R, распечатай мне этот отчет для клиента X”. Приложение Shiny, записывающее ваш голос, загружает его на API, затем разбирает возвращенный текст и преобразует его в действия. Таким образом, вы можете создать собственную Alexa-подобную инфраструктуру.
Alexa от Amazon. Подключенный к Интернету микрофон, активируемый голосом. Изображение с сайта www.amazon.co.uk
Перевести все
Наконец, я живу и работаю в Дании. Всего около 6 миллионов человек во всем мире говорит по-датски, поэтому приложения, доступные на английском языке, на датском могут появиться нескоро или вообще не появиться. API машинного перевода, появившийся в 2016 году, широко разрекламировали в новостях как «систему, которая изобрела собственный язык». Действительно, программа обеспечивает гораздо более качественный перевод с английского на голландский, чем бесплатная веб-версия, которую, возможно, вскоре начнут применять в Дании.
Работа с библиотекой
Чтобы использовать эти API на языке R, сначала нужно выполнить одноразовую начальную настройку и создать Google Project, добавить номер кредитной карты и аутентифицироваться – весь процесс подробно описан на странице пакета.
После этого заносите в систему те объекты R, которыми собираетесь манипулировать. Благодаря rOpenSci review удалось обеспечить удобное наращивание этой системы – таким образом, в программу можно записывать крупные текстовые векторы, которые библиотека затем будет разбирать; при необходимости скорость можно ограничить. Функции также работают с синтаксисом каналов 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 для обработки естественного языка помогает разобраться со структурой и значением текста. Этот API доступен через функцию gl_nlp.
Он обеспечивает несколько видов анализа:
- Анализ сущностей – находим в тексте именованные сущности (сейчас речь идет о об именах собственных и распространенных именах нарицательных), а также исследуем значимость, количество упоминаний каждой сущности и другие свойства. По возможности также возвращаем метаданные о конкретной сущности, например, ссылку на статью Википедии.
- Синтаксис – анализируем синтаксис текста, размечаем границы предложений и делаем токенизацию, а также частично анализируем части речи, деревья зависимостей и другие свойства.
- Тональность – общая тональность текста, выражаемая по шкале [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
Благодарности
Пакет удалось значительно усовершенствовать благодаря помощи рецензентов – Нила Ричардсона и Джулии Густавсен, благодаря которым документация, вывод и тестовые примеры были приведены в тот вид, в каком вошли в состав версии 0.1.0
. Спасибо большое!
Надеемся, что пока мы только в начале пути, и пакет помогут улучшить сами пользователи. Можете высказываться поэтому поводу на Github – и мы постараемся реализовать ваши предложения. Очень интересно увидеть, чего смогут добиться пользователи, вооружившись такими мощными инструментами.
Автор: ph_piter