ぽんこつ備忘録

自分用のWatsonやらAndroidやらやったことの備忘録 さぼりがち

言語化の練習

とりあえず備忘録を書こう

私はフィードバックが嫌いで振り返りが嫌いだ.
よくテストを解いた後にすぐに答え合わせをするような人たちを見て,それで結果が良くなるわけでもないのに...と思ってしまうような人種.
自分の感情を言語化するのも得意ではないしそもそもすぐに忘れてしまうから学習に時間もかかる.
とりあえずこのままではいかんな??という感情に駆られたので,その練習の意味を込めてこの備忘録をうまく活用していきたいと思う.
語彙力もクソもないから本も読まねばなぁ...

ほら,GithubでプルリクとかWikiとか書くしその練習としてもね

AsyncTaskのあれこれ

Javaに対しての勉強不足が相まって依頼されたアプリ作成が滞ってしまったため簡単に備忘録

public class UploadTask extends AsyncTask<String, Void, Response> {
    private Context context;
   
    public UploadTask(Context context) {
        super();
        this.context = context;
    }

    // 非同期処理
    @Override
    protected Response doInBackground(String... params) {

        // パラメータで送った値を受け取る
        String lat = params[0];
        String lng = params[1];
       
        // 処理を記述 

        // 結果を下に送る
        return response;
    }

    // 非同期処理終了後、結果をメインスレッドに返す
    @Override
    protected void onPostExecute(Response response) {
        super.onPostExecute(response);

        if (response != null) {

            // 完了したら画面遷移する
            Intent intent = new Intent(context, hogehogeActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            context.startActivity(intent);
        } else {
            Toast.makeText(context, R.string.post_failed, Toast.LENGTH_SHORT).show();
            Log.w(TAG + "POST:", "error: " + "responseがNULL");
        }
    }
}

んで使うときは

 UploadTask task = new UploadTask(context);
        task.execute(
                String.valueOf(lat), // lat
                String.valueOf(lng), // lng
        );

って書いてやればいい

AndroidでWatson NLUを使ってみた(だけ) その2

なんとなくググり続けてやっと解決

responseで受けたJavaObjectをJsonに変換して

AnalysisResults response = service
                .analyze(parameters)
                .execute();
        System.out.println(response); //Object形式で帰ってくる

        Gson gson = new Gson();
        json = gson.toJson(response);

        JsonParser parser = new JsonParser();
        JsonObject result = parser.parse(response.toString()).getAsJsonObject();
        System.out.println(result.getAsJsonArray("concepts").get(0).getAsJsonObject().get("text"));

前回の実行結果をこれで受け取ると"金本知憲"が返ってきた
阪神ってワードからアニキが出てきた

んで,これは別スレッドで動かしてるから,UIに反映させようとしても
”Only the original thread that created a view hierarchy can touch its views.”ってエラーを吐いてくる
UI変更したけりゃメインスレッドからやれってことらしい
だからHandlerつかってメインスレッドに処理を依頼すればOK

AndroidでWatson NLUを使ってみた(だけ) その1

Watson NLUをAndroidで動かしてみたい
ってことでリファレンスとにらめっこ

www.ibm.com

その前にこいつを見て日本語で使える機能を確認

IBM Cloud Docs

Conceptsとcategoriesが使えるっぽい
他を日本語で取得しようとするとエラーが返ってきた

NaturalLanguageUnderstanding service = new NaturalLanguageUnderstanding(
 "2018-03-16",
  nlu_username,
 nlu_password
 );
 String text = "阪神の福留が同点ソロ本塁打を放ち試合を振り出しに戻した。" ;

 CategoriesOptions categories = new CategoriesOptions();

 ConceptsOptions concepts= new ConceptsOptions.Builder()
  .limit(3)
  .build();

 Features features = new Features.Builder()
  .categories(categories)
  .concepts(concepts)
  .build();

 AnalyzeOptions parameters = new AnalyzeOptions.Builder()
  .text(text)
  .features(features)
  .build();

 AnalysisResults response = service
  .analyze(parameters)
  .execute();
 System.out.println(response); //Object形式で帰ってくる

これを別スレッドで回してみると情報の取得ができた

Object形式の取り扱い方が分からなくて情報の抽出ができない...

これからやっていくこと

IBM Cloud のライトアカウントでどこまでできるのか確認
日本語を取り扱うためにはやっぱりライトアカウントだときつい?

NLUの一部が日本語に対応したとあるため使ってみようと試みたが,どうやらデフォルトでの対応ではないらしい
qiita.com

Watson Knowledge Studioでカスタムモデルを作成しNLUにデプロイする必要があるとのこと
その連携がライトアカウントではできない?
できないことが判明した.
え,じゃあライトアカウントからだとNLUの日本語での機能が使えないってこと?

IBMに直接問い合わせ中

Watson Discovery で分割文書管理

自分向けの備忘録なので悪しからず.
日本語ところどころ変だけどもお気になさらず.

Retrieve and rank(以下R&R)で,文書を<h1>タグ分けて
1つのHTMLを読み込ませるだけで複数の文書を読み込ませてきた.

だが11月頭にR&Rが廃止,Discoveryに統合され,使い方が少々変わってしまった.
この統廃合に「今まで積み上げてきたノウハウがパーじゃないか!」と憤りを感じたが,そう嘆いてもR&Rは帰ってこないのでDiscoveryを叩いていこう.

Discoveryでは<h1>タグによる分割管理がデフォルトでは備わっておらず,R&Rに読み込ませていたHTMLファイルをそのまま読み込ませても,ただテキストが長い1つの文書として読み込まれる.改悪じゃん.

Discoveryをtoolで管理しようと思っても,言語選択で「日本語」が無いのね.日本語使いたければCurlAPI使って作れって...いいじゃん日本語をtoolで選べるようにしてよ...


qiita.com
qiita.com


日本語のチュートリアルやリファレンスが皆無なためキータにはお世話になりっぱなし.
前者の記事には

Release Notesによると2017/10/3付でDocument segmentationという機能が搭載されたそうです。大きなHTML/Word/PDF文書をHTMLのH1-H6タグのレベルで分割するものだそうです。詳細はSplitting documents with document segmentationをご参照ください。(ちら読みした限りでは、注意点もいくつかありそうです)

流し見していたら読み飛ばしていた部分にさらっと分割管理のことが書かれていた.ありがとうございます...

どうやらConfigurationsをきちんと定義しないとダメらしい.
詳しくは
IBM Cloud Docs


configの追加

curl -X POST -u {usrname}:{pass} -H "Content-Type: application/json" -d @config.json "https://gateway.watsonplatform.net/discovery/api/v1/environments/{environ_id}/configurations?version=2017-11-07"

んでjsonも一緒に送る

{
  "configuration_id": "a23c467d-1212-4b3a-5555-93e788a3622a",
  "name": "Example configuration",
  "conversions": {
    "segment": {
      "enabled": true,
      "selector_tags": ["h1"]
    }
  }
}

これで文書読み込ませるときにConfigurationsをjsonで決めた名前の奴にしてから読み込ませたらOK
一応読み込ませたHTMLも書いておく

<!DOCTYPE html>

<html lang="ja">
<head>
<meta charset="UTF-8">
<title>2017_01</title>
</head>
<body>
<h1>2017_01_01</h1>
<p>aaa</p>
<h1>2017_01_02</h1>
<p>bbb</p>
<h1>2017_01_03</h1>
<p>ccc</p>
  </body>
</html>

最大50個までしか分割できなくて50個超えたやつは全部50番目に入る.


読み込ませた文書消す方法ってtoolでできる?CurlAPI使うしか消せないよね・・・.
プログラミング自体まだ全然だからノウハウが無さ過ぎてとてもつらい.

Conversationを使ってみる

参考:Watson Conversation Serviceでチャットボットを開発する
IBMワトソン 勉強会 20161121a
https://www.ibm.com/developerworks/community/wikis/home?lang=ja#!/wiki/%E3%81%93%E3%81%BF%E3%81%AD%E3%81%AE%E6%8A%80%E8%A1%93%E3%83%A1%E3%83%A2/page/Conversation%20%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%83%95%E3%83%AD%E3%83%BC%E4%BD%9C%E6%88%90%E5%AE%9F%E7%BF%92




Conversationはユーザーとの自然言語での会話を行うためのサービス.
NLCで与えられた質問では信頼度の高い分類ができない場合などに,もう少し詳しい質問文を求めたりすることができる.
一定の流れに沿った会話フローを作成することができる.

Conversationには
Intent,Entities,Dialog
の3つのタブがある.

Intent = ユーザーが入力したテキストに含まれる目的
対話相手の要求を受け取る意図を明確にする
「ライトをつけて」→スイッチ入
「音楽をかけて」→スイッチ入
「音楽をもっと大きく」→音量を上げる


Entities = 入力テキストから抽出すべきキーワード 目的の対象物を示す
要求の対象となる実体を明確にする
「ライトをつけて」→ライト
「音楽をかけて」→音楽
「音楽をもっと大きく」→音量


Dialog = Intent/Entitiesに対する回答 回答の流れもここで作成する
対話の流れを設計する
「音楽をかけて」→「音楽のジャンル取得」→指定ジャンルの音楽を開始


Intent,EntitiesはCSVファイルからインポートすることも可能(これもUTF-8でインポートする)