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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Android

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

API

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

Q&A

0回答

317閲覧

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

ehyai

総合スコア43

Android

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

API

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

0グッド

0クリップ

投稿2017/09/11 10:01

編集2017/09/12 09:00

###前提・実現したいこと
私はこちらのサイトを参考にして、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.

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2017/09/11 10:10 編集

現在の質問内容では、丸投げと変わりませんから、現在試されているのソースコードと実行結果や問題箇所を具体的に質問を編集して、質問に追記してください。
ehyai

2017/09/11 11:16

指摘してくださってありがとうございます。丸投げのような内容だと思わせるような質問をしてしまって申し訳ありませんでした。質問に追記致しました。
ehyai

2017/09/12 09:03

質問への追記が足りないものとなってしまっていて、申し訳ありませんでした。自身の調査したこと、試したことを追加いたしました。
t_obara

2017/09/12 09:33

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

2017/09/14 01:35

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

2017/09/18 16:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問