使用IBM Watson Machine Learning编码Android应用

2011年初,一种称为IBM Watson的自然语言理解计算机系统在一场名为“危险”的类似问答游戏中击败了所有人类参赛者! 这是一个历史性事件,也许是普通民众开始意识到人工智能已不再是科幻小说的地步。

当时,沃森(Watson)在一台超级计算机上运行,​​除了回答琐事问题外,所能做的只是其他事情。 但是,今天,它已经转变为功能更广泛的系统,并且其许多功能都可以通过云获得。

在本系列教程中,我将向您展示如何在Android应用程序中使用IBM Watson Developer Cloud提供的各种服务。 在这个入门教程中,您将学习如何与IBM Bluemix,Watson Java SDK和Watson音调分析器服务一起使用,以创建一个简单的Android应用程序,该应用程序可以识别任何文本中出现的情绪。

先决条件

为了能够跟进,您需要:

1.创建Watson服务

只能通过IBM Bluemix云平台访问Watson的服务。 这意味着只有在Bluemix控制台中启用它们并获得所需的凭证之后,您才能在应用程序中使用它们。

首先登录控制台,然后导航到“ 服务”>“ Watson”

沃森服务主屏幕

接下来,按“ 创建Watson”服务按钮以查看所有可用的Watson服务。

屈臣氏服务清单

到目前为止,由于我们仅对分析书面文本中的语气感兴趣,因此选择“ 语气分析器”服务。

在下一个屏幕上,将服务名称更改为有意义的名称,然后按“ 创建”按钮。

音调分析器创建屏幕

现在将为您的帐户激活音频分析器服务,并生成一组登录凭据。 要查看这些凭据是什么,请打开“ 服务凭据”选项卡,然后选择“ 查看凭据”操作。

音调分析器凭据

将JSON文档的内容保存到计算机上的文件中。 我建议您将文件命名为certificate.json

2.项目设置

Watson Java SDK使您很容易与任何Watson服务进行通信。 为了能够在项目中使用它,请将其作为compile依赖项添加到app模块的build.gradle文件中。

compile 'com.ibm.watson.developer_cloud:java-sdk:3.7.2'

在本教程中,您将需要两个库: Commons IO ,以简化文件IO的操作;以及Android Design Support,以使用一些Material Design小部件。 也将它们添加为compile依赖项。

compile 'commons-io:commons-io:2.5'
compile 'com.android.support:design:23.4.0'

您还将需要INTERNET许可才能与IBM的服务器通信,因此将以下行添加到AndroidManifest.xml文件中:

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

最后,按立即同步按钮以完成项目配置。

3.初始化音调分析器

要与Watson的音频分析器服务进行通信,必须使用ToneAnalyzer类。 其构造函数将日期字符串作为其参数,它将用于自动确定要使用的音频分析器服务的版本。

final ToneAnalyzer toneAnalyzer =
            new ToneAnalyzer("2017-07-01");

请注意,日期应始终为静态字符串。 这有助于确保当新版本的服务引入重大更改时,您的应用不会停止运行。

必须将ToneAnalyzer实例配置为使用您的凭据,因此将您在本教程前面创建的凭据 ToneAnalyzer文件移动到项目的res / raw文件夹中。

接下来,您必须从JSON文件中提取usernamepassword密钥的值。 以下代码显示了如何使用IOUtilsJSONObject类快速完成此IOUtils

JSONObject credentials = new JSONObject(IOUtils.toString(
        getResources().openRawResource(R.raw.credentials), "UTF-8"
)); // Convert the file into a JSON object

// Extract the two values
String username = credentials.getString("username");
String password = credentials.getString("password");

现在,您可以通过调用setUsernameAndPassword()方法来完成ToneAnalyzer实例的配置。

toneAnalyzer.setUsernameAndPassword(username, password);

4.创建用户界面

我们的应用程序需要一个界面,该界面允许用户输入一些句子并按一个按钮以开始进行语气分析。 换句话说,您现在必须创建一个包含EditText小部件和Button小部件的简单布局。

您也可以选择放入TextInputLayout容器,以确保EditText小部件符合Material Design的准则。

因此,将以下代码添加到活动的布局XML文件中:

<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.使用音调分析器

用户一旦按下按钮,就必须开始进行音调分析。 因此,您需要使用其setOnClickListener()方法向Button小部件添加单击事件处理程序。 但是,在执行此操作之前,请不要忘记使用findViewById()方法获取对小部件的引用。

Button analyzeButton = (Button)findViewById(R.id.analyze_button);

analyzeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {        
        // More code here
    }
});

在单击事件处理程序内,您需要做的第一件事就是使用其getText()方法确定用户在EditText小部件中键入的内容。

EditText userInput = (EditText)findViewById(R.id.user_input);

final String textToAnalyze = userInput.getText().toString();

像所有Watson服务一样,音调分析器服务提供了许多不同的功能。 例如,它可以识别输入中的情绪,语言风格和社交倾向。 它也可以使用JSON文档,纯文本和HTML。 因此,为了有效地使用它,必须使用ToneOptions对象显式指定所需的功能,该对象可以使用ToneOptions.Builder类轻松创建。

现在,我们将仅使用该服务列出纯文本字符串中出现的所有情绪。 这样创建ToneOptions对象的方法如下:

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

现在,您可以通过调用getTone()方法来getTone()音调分析请求,该方法需要一个包含要分析的文本的字符串以及一个ToneOptions对象作为其唯一参数。 若要实际异步执行请求,还必须调用enqueue()方法,该方法将ServiceCallback实例作为其参数。

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();
        }
    });

ServiceCallback类的onResponse()方法中,您可以访问ToneAnalysis对象。 通过调用其getDocumentTone()方法,可以确定传递给服务的文本的整体色调。

getDocumentTone()方法的返回值是一个ElementTone对象,其中包含音调类别列表。 因为我们之前已经明确声明仅对情感类别感兴趣,所以列表将仅包含一个元素。 因此,以下是您提取服务检测到的所有情绪的分数的方法:

List<ToneScore> scores = response.getDocumentTone()
                                 .getTones()
                                 .get(0)
                                 .getTones();

如您所料, ToneScore对象代表一种情感。 它有一个Double包含实际得分)和一个String告诉您情感的名称。 如果得分大于0.5,则表示很有可能在文本中表达情感。

现在让我们只选择那些得分大于0.5的情绪,并使用它们来创建一条消息,该消息可以使用Toast显示给用户。

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()方法在不同的线程上运行,因此必须确保仅在调用runOnUiThread()方法之后创建并显示Toast

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getBaseContext(),
                toastMessage, Toast.LENGTH_LONG).show();
    }
});

该应用程序现已准备就绪。 如果运行它,输入一些句子,然后开始分析,您将可以看到Watson准确地识别出文本中出现的情绪。

音调分析器应用程序正在运行

结论

在本教程中,您创建了一个Android应用程序,该应用程序可以使用IBM Watson的音调分析器服务来执行猜测一段文本中表达的情绪的复杂任务。 您还学习了使用Watson Java SDK和IBM Bluemix控制台的基础知识。

要了解有关该服务的更多信息,可以参考其官方文档

翻译自: https://code.tutsplus.com/tutorials/coding-an-android-app-with-ibm-watson-machine-learning--cms-29217

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值