Статьи

Кодирование приложения для Android с помощью машинного обучения IBM Watson

В начале 2011 года компьютерная система, понимающая естественный язык под названием IBM Watson, смогла одолеть всех участников конкурса в игровом шоу под названием Jeopardy! Это было историческое событие и, возможно, тот момент, когда широкая публика начала осознавать, что искусственный интеллект больше не является предметом научной фантастики.

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

В этой серии руководств я покажу вам, как использовать различные сервисы, предлагаемые IBM Watson Developer Cloud, в приложениях для Android. Из этого вводного руководства вы узнаете, как работать с IBM Bluemix, Watson Java SDK и службой анализатора тонов Watson, чтобы создать простое приложение для Android, которое может определять эмоции, присутствующие в любом фрагменте текста.

Чтобы иметь возможность следовать, вам понадобится:

  • последняя версия Android Studio
  • бесплатный аккаунт IBM Bluemix
  • и устройство или эмулятор под управлением Android 4.4 или выше

Доступ к услугам Watson возможен только через облачную платформу IBM Bluemix. Это означает, что вы можете использовать их в своем приложении только после того, как вы включили их в консоли Bluemix и получили необходимые учетные данные.

Начните с входа в консоль и перейдите к Сервисам> Watson .

Главный экран служб Watson

Затем нажмите кнопку « Создать службу Watson» , чтобы увидеть все доступные вам службы Watson.

Список услуг Watson

На данный момент, поскольку мы заинтересованы только в анализе эмоционального тона в письменном тексте, выберите сервис Tone Analyzer .

На следующем экране измените название службы на что-то значимое и нажмите кнопку « Создать» .

Экран создания тонального анализатора

Сервис тонального анализатора теперь будет активирован для вашей учетной записи, и будет создан набор учетных данных для входа. Чтобы увидеть, что это за учетные данные, откройте вкладку « Учетные данные службы » и выберите действие « Просмотреть учетные данные» .

Учетные данные тонального анализатора

Сохраните содержимое документа JSON в файл на вашем компьютере. Я предлагаю вам назвать файл credentials.json .

Watson Java SDK упрощает взаимодействие с любым сервисом Watson. Чтобы иметь возможность использовать его в своем проекте, добавьте его в качестве зависимости compile в файл build.gradle модуля app .

1
compile ‘com.ibm.watson.developer_cloud:java-sdk:3.7.2’

Для этого урока вам понадобятся еще две библиотеки: Commons IO , чтобы упростить операции ввода-вывода файлов, и Android Design Support, чтобы иметь возможность использовать несколько виджетов Material Design. Добавьте их тоже как зависимости compile .

1
2
compile ‘commons-io:commons-io:2.5’
compile ‘com.android.support:design:23.4.0’

Вам также понадобится разрешение INTERNET для связи с серверами IBM, поэтому добавьте следующую строку в файл AndroidManifest.xml :

1
<uses-permission android:name=»android.permission.INTERNET»/>

Наконец, нажмите кнопку « Синхронизировать сейчас» , чтобы завершить настройку проекта.

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

1
2
final ToneAnalyzer toneAnalyzer =
           new ToneAnalyzer(«2017-07-01»);

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

Экземпляр ToneAnalyzer должен быть настроен на использование ваших учетных данных, поэтому переместите файл credentials.json , который вы создали ранее в этом руководстве, в папку res / raw вашего проекта.

Далее необходимо извлечь значения ключей имени username и password из файла JSON. В следующем коде показано, как это сделать быстро с помощью классов IOUtils и JSONObject :

1
2
3
4
5
6
7
JSONObject credentials = new JSONObject(IOUtils.toString(
        getResources().openRawResource(R.raw.credentials), «UTF-8»
));
 
// Extract the two values
String username = credentials.getString(«username»);
String password = credentials.getString(«password»);

Теперь вы можете завершить настройку экземпляра ToneAnalyzer , вызвав метод setUsernameAndPassword() .

1
toneAnalyzer.setUsernameAndPassword(username, password);

Наше приложение нуждается в интерфейсе, который позволит пользователю ввести несколько предложений и нажать кнопку, чтобы начать анализ тона. Другими словами, теперь вы должны создать простой макет, содержащий виджет EditText виджет Button .

При желании вы также можете добавить контейнер TextInputLayout чтобы убедиться, что виджет EditText соответствует рекомендациям по дизайну материалов.

Соответственно, добавьте следующий код в XML-файл макета вашей деятельности:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<android.support.design.widget.TextInputLayout
    android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:layout_alignParentTop=»true»
    android:layout_alignParentStart=»true»
    android:id=»@+id/container»>
 
    <EditText
        android:layout_width=»match_parent»
        android:layout_height=»wrap_content»
        android:hint=»Say something»
        android:id=»@+id/user_input»
        android:lines=»3″/>
</android.support.design.widget.TextInputLayout>
 
<Button
    android:text=»Analyze Tone»
    android:layout_width=»match_parent»
    android:layout_height=»wrap_content»
    android:layout_below=»@+id/container»
    android:id=»@+id/analyze_button» />

Анализ тона должен начаться, как только пользователь нажмет кнопку. Следовательно, вам нужно добавить обработчик событий по щелчку в виджет Button используя его setOnClickListener() . Однако прежде чем сделать это, не забудьте получить ссылку на виджет с findViewById() метода findViewById() .

1
2
3
4
5
6
7
8
Button analyzeButton = (Button)findViewById(R.id.analyze_button);
 
analyzeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // More code here
    }
});

В обработчике события по щелчку первое, что вам нужно сделать, это определить, что пользователь ввел в виджет EditText используя его getText() .

1
2
3
EditText userInput = (EditText)findViewById(R.id.user_input);
 
final String textToAnalyze = userInput.getText().toString();

Как и все сервисы Watson, сервис тонального анализатора предлагает множество различных функций. Например, он может определить эмоции, языковой стиль и социальные тенденции в своем входе. Он также может работать с документами JSON, простым текстом и HTML. Поэтому, чтобы использовать его эффективно, вы должны явно указать необходимые функции, используя объект ToneOptions , который можно легко создать с ToneOptions.Builder класса ToneOptions.Builder .

Пока мы будем использовать сервис только для того, чтобы перечислить все эмоции, присутствующие в простой текстовой строке. Вот как вы создаете объект ToneOptions говоря так:

1
2
3
ToneOptions options = new ToneOptions.Builder()
       .addTone(Tone.EMOTION)
       .html(false).build();

Теперь вы можете составить запрос анализа тона, вызвав метод getTone() , который ожидает строку, содержащую текст для анализа, и объект ToneOptions качестве единственных аргументов. Чтобы фактически выполнить запрос асинхронно, вы также должны вызвать метод enqueue() , который принимает экземпляр ServiceCallback качестве аргумента.

01
02
03
04
05
06
07
08
09
10
11
12
toneAnalyzer.getTone(textToAnalyze, options).enqueue(
   new ServiceCallback<ToneAnalysis>() {
       @Override
       public void onResponse(ToneAnalysis response) {
           // More code here
       }
    
       @Override
       public void onFailure(Exception e) {
           e.printStackTrace();
       }
   });

Внутри onResponse() класса ServiceCallback вас есть доступ к объекту ToneAnalysis . Вызвав его getDocumentTone() , вы можете определить общий тон текста, который вы передали службе.

Возвращаемым значением метода getDocumentTone() является объект ElementTone содержащий список категорий тонов. Поскольку ранее мы прямо заявляли, что нас интересует только категория эмоций, список будет содержать только один элемент. Соответственно, вот как вы получаете баллы за все эмоции, обнаруженные службой:

1
2
3
4
List<ToneScore> scores = response.getDocumentTone()
                                .getTones()
                                .get(0)
                                .getTones();

Как и следовало ожидать, объект ToneScore представляет одну эмоцию. У него есть Double содержащий действительный счет и String сообщающую вам название эмоции. Если оценка больше 0,5, это означает, что есть большая вероятность, что эмоция выражается в тексте.

Давайте теперь выберем только те эмоции, баллы которых превышают 0,5, и используем их для создания сообщения, которое можно отобразить пользователю с помощью Toast .

01
02
03
04
05
06
07
08
09
10
String detectedTones = «»;
for(ToneScore score:scores) {
    if(score.getScore() > 0.5f) {
        detectedTones += score.getName() + » «;
    }
}
 
final String toastMessage =
                «The following emotions were detected:\n\n»
                + detectedTones.toUpperCase();

Поскольку метод onResponse() выполняется в другом потоке, вы должны обязательно создавать и отображать Toast только после вызова runOnUiThread() .

1
2
3
4
5
6
7
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getBaseContext(),
                toastMessage, Toast.LENGTH_LONG).show();
    }
});

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

Приложение тонального анализатора работает

В этом руководстве вы создали приложение для Android, которое может использовать службу анализатора тона IBM Watson для выполнения сложной задачи по отгадыванию эмоций, выраженных в куске текста. Вы также изучили основы использования Watson Java SDK и консоли IBM Bluemix.

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

А пока вы можете посмотреть некоторые другие наши посты об использовании машинного обучения для своих приложений для Android прямо здесь, на Envato Tuts +!

  • Android вещи
    Android вещи и машинное обучение
    Пол Требилкокс-Руис
  • Android вещи
    Вещи Android: создание облачного сервисного швейцара
    Пол Требилкокс-Руис
  • Android SDK
    Как использовать Google Cloud Machine Learning Services для Android
  • Android SDK
    Создайте интеллектуальное приложение с Google Cloud Speech и API на естественном языке
  • Android SDK
    Как использовать API Google Cloud Vision в приложениях для Android