質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • Android

    5851questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • API

    1277questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

gooのPOSTAPIを利用して文章を形態素解析した結果から、単語だけを抜き出す方法を教えてほしい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 155

ehyai

score 30

前提・実現したいこと

私はこちらのサイトを参考にして、Android Studioを用いて、Android上で特定の文章をgooラボ APIの形態素解析を利用して形態素に分割し、さらにそこから単語だけを抜き出して、配列に代入していくという機能を実装したいと思っています。
上記のサイトでは、「Log.d("OUTPUT",s);」の箇所で解析結果を表示していることから、この「s」に解析結果の文章がString変数として入れられていることがわかりました。この解析結果から、単語、上記の参考にしたサイトで言えば「京都」「は」「めちゃめちゃ」「楽し」「い」だけを抜き出し、それぞれ配列に入れたいと思っています。

発生している問題

しかし、この単語を抜き出す方法というものがわからなくて困っています。形態素解析APIのサイトを見る限り、word_listというパラメータに入っているのではないかと思うのですが、そこからどうやって抜き出すのかがわかりません。
そこで、形態素解析の結果から単語だけを抜き出す方法のアドバイスを教えていただきたいと思います。参考にさせていただいたサイトに書かれたやり方とは別のやり方の形態素解析から単語を抜き出す方法でも何でも構いません。
よろしくお願いします。

該当のソースコード

MainActivity.java

package com.example.ehyai.(プロジェクト名);

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.text.SpannableStringBuilder;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {
    TextView textView;

    final String GOO_URL = "https://labs.goo.ne.jp/api/morph";
    String ID  = "(自分で取得したアプリケーションID)";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);
    }

public void onClickButton1(View view) {
        EditText edit = (EditText)findViewById(R.id.editText);
        SpannableStringBuilder sp = (SpannableStringBuilder)edit.getText();

        String str = sp.toString();//editTextの文章を入れる変数
        URL url = null;

        try{ 
            url = new URL(GOO_URL);
            URLConnection connection =url.openConnection();
            connection.setDoOutput(true);

            //ヘッダ
            connection.setRequestProperty("Content-Type", "application/json");

            OutputStream os = connection.getOutputStream(); //[ここでエラーが起こり、プログラムが終了してしまう]
            String postStr = "{\"app_id\": \"" + ID + "\",\"sentence\": \"" + str + "\"}";
            PrintStream ps = new PrintStream(os);
            ps.print(postStr); //データをPOSTする
            ps.close();
      InputStream is = connection.getInputStream(); //結果を取得
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));

            String s;
            while ((s = reader.readLine()) != null) {
                str += s; //editTextから取った元の文章に結果を加える
            }

            //①このあたりに下記にに示してある、形態素解析の結果から単語だけを抜き出し、配列String[] strsに抜き出した単語を入れるコードを加える
            //②1:2:...と順番に表示させるためのコードを加える
            for (int i = 0 ; i < strs.length ; i++){
                 str += (i + 1) + ":" + strs[i] + "\n";
            }

            reader.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        textView.setText(str); //textViewに表示
    }
}

activity_main.xml

?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.(プロジェクト名)"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:inputType="text|textMultiLine" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_toEndOf="@+id/button"
        android:onClick="onClickButton1"
        android:text="形態素解析" />

    <ScrollView
        android:layout_width="368dp"
        android:layout_height="388dp"
        android:layout_below="@+id/button"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="115dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </LinearLayout>
    </ScrollView>

</RelativeLayout>


このソースコードのアプリケーションを起動し、editTextに文章を入力してからボタンを押すとtextViewに入力した文章に加えて解析後の結果が表示されるようになっています。
この結果に、以下のコードを加えることで抜き出した単語を配列に入れ、1:2:...と順番にそれぞれ表示させたいと思っています。

①ここで形態素解析の結果から単語だけを抜き出し、配列String[] strsに抜き出した単語を入れるコードを書く
1:2:...と順番に表示させるためのコード
for (int i = 0 ; i < strs.length ; i++){
            str += (i + 1) + ":" + strs[i] + "\n";
}


ちなみに、私が過去に出した質問ではこのコードのプログラムはエラーで途中で止まってしまっていたのですが、GitHubからダウンロードしたファイルを上記のコードに書き換えたものでデバッグを試してみた結果、上手く動作を行いました。

調査したこと・試したこと

上記の①(形態素解析の結果から単語だけを抜き出し、配列String[] strsに抜き出した単語を入れるコード)についてですが、他のサイトで調べましたところ、 こちらのサイトを見て分かったこととして、word_listは形態素リストであり、ここに文単位の形態素リストの配列があること、その中の単語は、[form(表記)、pos(形態素)、read(読み)]という入れ子で構成されていることを理解することができ、このうちform(表記)だけを抜き出して配列に入れれば上手くいくのではないかと考えました。
そこで、上記のコードの「//この位置に下記の配列に示した、形態素解析の結果から単語だけを抜き出し配列に入れる」と書いたところに、

        String[] strs = new String[is.word_list.length];
        for (int i = 0 ; i < is.word_list.length ; i++){
          //str += (i + 1) + ":" + strs[i] + "\n";
          strs[i] = is.word_list.form[i];
        }


を書きました。しかし、「word_list」の部分が赤く表示されてしまい、

エラー:シンボルを見つけられません
シンボル:変数word_list
場所:タイプInputStreamの変数is

Exection failed for task
Compilation failed; see the compiler error output for details.


というエラーが出てしまいました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • t_obara

    2017/09/12 18:33

    参考にされたページも記載がありますが、json形式で結果が返却されています。androidで、jsonを扱う方法について調査されて見てはいかがでしょうか。

    キャンセル

  • ehyai

    2017/09/14 10:35

    指摘してくださってありがとうございます。返信が遅れてしまって申し訳ありません。jsonについてまだ理解が足らないためにつまづいてしまっているということですね。もう少しjsonに関して一度勉強して知識をつけてから解決に努め、それでも解決出来なければまた情報を追加したり修正したいと思います。

    キャンセル

  • ehyai

    2017/09/19 01:38

    あれからjson形式に関して調べました。しかし、やはり解決できない点が見つかったため、jsonに重点を置いた質問を一からさせていただくことになりました。URLはこちらとなります。「https://teratail.com/questions/93023?modal=q-comp

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Android

    5851questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • API

    1277questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。