人工智慧API+安卓=智慧機器人與情緒值分析

GooooooTrue發表於2017-10-27

本人是大四在校生,寫這篇文章的目的就是主要記錄下我在使用鵝場的文智API以及阿里雲開放的智慧機器人api所做的一個小demo

主要用到的東西是:

  1. Retrofit2.0
  2. 騰訊雲文智情緒值分析API
  3. 阿里雲智慧機器人API
  4. Gson解析
  5. recyclerview

先上一波示例圖:

(主介面_one)

人工智慧API+安卓=智慧機器人與情緒值分析

(主介面_two)

分析主介面:

在這個主介面中,主要是RecyclerView,兩個頭像用的ImageView,一個EditText,一個由TextView設計的傳送按鈕,模擬微信的訊息傳送(這裡沒有對訊息種類進行判斷,所以只是簡單的傳送一條資料,獲得一條資料,還沒有行聊天工具那樣可以傳送多條資料,因為每一個資訊請求都會有一條資訊返回就沒有做資訊的左右判斷 )

人工智慧API+安卓=智慧機器人與情緒值分析

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.luobotie.kingshun.mychat.MainActivity">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_chat"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

        <!--蒙層,用於edittext的聚焦以及失焦-->
        <View
            android:id="@+id/maskForETFocus"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/transparent"
            android:onClick="clickToClearFocus" />
    </FrameLayout>

    <!--這裡是訊息傳送-->
    <LinearLayout
        android:elevation="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:orientation="horizontal"
        android:padding="5dp">

        <ImageView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:id="@+id/iv_send"
            android:layout_weight="0.5"
            android:src="@android:drawable/ic_menu_send" />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="5"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:orientation="vertical"
            android:padding="3dp">


            <EditText
                android:id="@+id/et_message"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@null"
                android:hint="從這裡寫入您的話"
                android:maxLines="3"
                android:padding="5dp"
                android:textAppearance="?android:attr/textAppearanceLargeInverse"
                android:textCursorDrawable="@drawable/color_cursor"
                android:textSize="16sp" />

            <View
                android:layout_marginTop="3dp"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:background="@color/colorGray" />
        </LinearLayout>

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:background="@drawable/btn_selector"
            android:gravity="center_horizontal|clip_horizontal"
            android:onClick="sendMsg"
            android:padding="8dp"
            android:text="傳送"
            android:textColor="#fff"
            android:textSize="13sp" />
    </LinearLayout>
</LinearLayout>複製程式碼

這裡有一個framlayout裡面放了兩個元件,一個是recyclerview,另一個是一個透明的蒙層@android:color/transparent 這個是用來給edittext失去焦點用來隱藏鍵盤用的,這個可以用於通過控制元件的可見性來設定它是否存在,給edittext設定一個監聽器用來判斷聚焦狀態的改變

@Override
public void onFocusChange(View view, boolean b) {
    if (b) {
        Log.d(TAG, "onFocusChange: 已聚焦");
        mMask.setVisibility(View.VISIBLE);
    } else {
        Log.d(TAG, "onFocusChange: 取消聚焦");
        //鍵盤的強制隱藏
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(mContent.getWindowToken(), IMM_HIDE_FLAGS);
        //將mask取消存在
        mMask.setVisibility(View.GONE);
    }
}複製程式碼

 

聚焦的時候,可以給輸入框寫字,並且給蒙層設定可見(蒙層的作用就是控制輸入框聚焦),

鍵盤的強制隱藏在程式碼中已經貼出。在manifest中也要做出對軟鍵盤的控制

<activity
    android:name=".MainActivity"
    android:windowSoftInputMode="stateUnspecified|adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>複製程式碼
 android:windowSoftInputMode="stateUnspecified|adjustResize"這句話是有必要的 具體詳見複製程式碼

這裡是網址:blog.csdn.net/xww810319/a…

接下來是介紹用Retrofit來請求API資料:

定義一個介面

public interface GetChatRequest {
    @GET("/iqa/query?")
    Call<chatBean> getChat(@Query("question") String question, @Header("Authorization") String appcode);
}
複製程式碼

定義一個JavaBean(用GsonFormat外掛)

public class chatBean {
    /**
     * status : 0
     * msg : ok
     * result : {"type":"標準回覆","content":"杭州今天10℃~21℃ 晴 北風3-4 級轉東北風微風\r\n建議著薄外套、開衫牛仔衫褲等服裝。年老體弱者應適當新增衣物,宜著夾克衫、薄毛衣等。","relquestion":"查詢天氣[那麼?][天氣地區名|省名|城市別稱][天氣地區名?]"}
     */
    private String status;
    private String msg;
    private ResultBean result;
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public ResultBean getResult() {
        return result;
    }
    public void setResult(ResultBean result) {
        this.result = result;
    }
    public static class ResultBean {
        /**
         * type : 標準回覆
         * content : 杭州今天10℃~21℃ 晴 北風3-4 級轉東北風微風
         建議著薄外套、開衫牛仔衫褲等服裝。年老體弱者應適當新增衣物,宜著夾克衫、薄毛衣等。
         * relquestion : 查詢天氣[那麼?][天氣地區名|省名|城市別稱][天氣地區名?]
         */
        private String type;
        private String content;
        private String relquestion;
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public String getContent() {
            return content;
        }
        public void setContent(String content) {
            this.content = content;
        }
        public String getRelquestion() {
            return relquestion;
        }
        public void setRelquestion(String relquestion) {
            this.relquestion = relquestion;
        }
    }
}複製程式碼

這裡主要是利用getContent()方法獲取的資訊接下來就是請求

很簡單的Retrofit的使用 ,這裡使用的GsonConverterFactory是用來返回Gson資料的, String returnStr = response.body().getResult().getContent();就是返回的結果,但是是需要引數的

  1. question:提交請求的問題
  2. APPCODE,在阿里雲建立的appcode 

地址:market.aliyun.com/products/57…這裡是免費的人工機器人啊!!!

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();
GetChatRequest request = retrofit.create(GetChatRequest.class);
Call<chatBean> call = request.getChat(question, APPCODE);
call.enqueue(new Callback<chatBean>() {
    @Override
    public void onResponse(Call<chatBean> call, Response<chatBean> response) {
        String returnStr = response.body().getResult().getContent();
        //與Adapter交換資料
        swapDatas(returnStr);
    }
    @Override
    public void onFailure(Call<chatBean> call, Throwable t) {
        Toast.makeText(MainActivity.this, "機器人崩潰", Toast.LENGTH_SHORT).show();
    }
});複製程式碼

請求的資料就在adapter中簡單的通過對2取餘數來判斷是顯示在左側還是右側

當然為了資料的正常顯示不移位(因為recycleview的複用)在onBindView中:必須對元件設定可見性  對每一個需要的元件(父元件就行)設定 當然還有設定Tag的方法!!!!!敲黑板!!!!

public void onBindViewHolder(MyViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder: " + position);
    if (position % 2 == 1) {
        //左邊訊息
        holder.mLeftContainer.setVisibility(View.VISIBLE);
        holder.mRightContainer.setVisibility(View.GONE);
        holder.mLeftMsg.setText(mDatas.get(position));
    } else {
        holder.mRightContainer.setVisibility(View.VISIBLE);
        holder.mLeftContainer.setVisibility(View.GONE);
        holder.mRightMsg.setText(mDatas.get(position));
    }
}複製程式碼

到此 我們的機器人對話就完成了!!!

情緒值分析:

先上圖

人工智慧API+安卓=智慧機器人與情緒值分析


人工智慧API+安卓=智慧機器人與情緒值分析

人工智慧API+安卓=智慧機器人與情緒值分析人工智慧API+安卓=智慧機器人與情緒值分析


沒錯就是item的點選事件!!!!通過點選來彈出提示框 點選確定後通過騰訊雲的文智API來獲取資料並顯示在一個新的Activity中那麼文智的連結在這裡:nlp.qq.com/

文智介面描述

域名:wenzhi.api.qcloud.com
介面名: TextSentiment
在輿情監控、話題監督、口碑分析等商業分析領域有非常重要的應用價值。(引用騰訊雲)

下面是例項:

https://wenzhi.api.qcloud.com/v2/index.php?
    Action=TextSentiment
    &Nonce=345122
    &Region=sz
    &SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA
    &Timestamp=1408704141
    &Signature=HgIYOPcx5lN6gz8JsCFBNAWp2oQ
    &content=雙萬兆伺服器就是好,只是記憶體小點複製程式碼

這裡有一個很大的坑就是HmacSHA256的加密演算法如何去做請看官方文件

這裡騰訊給廣大開發者一個通用的jar包具體請見SDK文件用這裡的jar包完全可以輕鬆一件介入

到此微小Demo做完了給大佬們放上Github傳送門!!!忘大佬們輕虐!!!!

注意::本人把APPCODE未收錄在github(必須要從騰訊與阿里api申請一個才可以)導致不能再真機除錯忘周知!

Github傳送門(簡單的傳輸了一點java檔案)


相關文章