В начале 2011 года компьютерная система, понимающая естественный язык под названием IBM Watson, смогла одолеть всех участников конкурса в игровом шоу под названием Jeopardy! Это было историческое событие и, возможно, тот момент, когда широкая публика начала осознавать, что искусственный интеллект больше не является предметом научной фантастики.
В то время Уотсон работал на суперкомпьютере и мог сделать немного больше, чем просто ответить на мелочи. Однако сегодня она превратилась в гораздо более универсальную систему, и многие ее возможности доступны через облако.
В этой серии руководств я покажу вам, как использовать различные сервисы, предлагаемые IBM Watson Developer Cloud, в приложениях для Android. Из этого вводного руководства вы узнаете, как работать с IBM Bluemix, Watson Java SDK и службой анализатора тонов Watson, чтобы создать простое приложение для Android, которое может определять эмоции, присутствующие в любом фрагменте текста.
Предпосылки
Чтобы иметь возможность следовать, вам понадобится:
- последняя версия Android Studio
- бесплатный аккаунт IBM Bluemix
- и устройство или эмулятор под управлением Android 4.4 или выше
1. Создание службы Watson
Доступ к услугам Watson возможен только через облачную платформу IBM Bluemix. Это означает, что вы можете использовать их в своем приложении только после того, как вы включили их в консоли Bluemix и получили необходимые учетные данные.
Начните с входа в консоль и перейдите к Сервисам> Watson .
Затем нажмите кнопку « Создать службу Watson» , чтобы увидеть все доступные вам службы Watson.
На данный момент, поскольку мы заинтересованы только в анализе эмоционального тона в письменном тексте, выберите сервис Tone Analyzer .
На следующем экране измените название службы на что-то значимое и нажмите кнопку « Создать» .
Сервис тонального анализатора теперь будет активирован для вашей учетной записи, и будет создан набор учетных данных для входа. Чтобы увидеть, что это за учетные данные, откройте вкладку « Учетные данные службы » и выберите действие « Просмотреть учетные данные» .
Сохраните содержимое документа JSON в файл на вашем компьютере. Я предлагаю вам назвать файл credentials.json .
2. Настройка проекта
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»/>
|
Наконец, нажмите кнопку « Синхронизировать сейчас» , чтобы завершить настройку проекта.
3. Инициализация тонального анализатора
Для связи со службой анализа тонов 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);
|
4. Создание пользовательского интерфейса
Наше приложение нуждается в интерфейсе, который позволит пользователю ввести несколько предложений и нажать кнопку, чтобы начать анализ тона. Другими словами, теперь вы должны создать простой макет, содержащий виджет 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» />
|
5. Использование тонального анализатора
Анализ тона должен начаться, как только пользователь нажмет кнопку. Следовательно, вам нужно добавить обработчик событий по щелчку в виджет 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