4.10月13日~10月19日

<目標>

感情値のバーを移動させたら頻出単語の大きさが頻出度の数字によって変化するようにプログラムを書く

紅華祭で出せるように現在は1つの番組しか結果を反映させていないが3つの番組すべて反映させることができるように努力する

<達成度>

80%

配置の問題がまだ残っているのと、クレヨンしんちゃんの単語には頻出度0もあるのですが文字の最小のサイズを40に設定しているので文字が表示されてしまうので頻出度0の場合は文字を表示しないようにするという問題を解決できていません。

<次週の目標>

文字サイズの問題・・・頻出度0の文字を表示しないようにする

文字の大きさの変化を滑らかにするために線形補間、非線形補間について勉強しながらプログラムを書きたい

<活動時間>

10月13日(木)15:20~19:30@研究室 3時間10分

10月14日(金)14:20~14:50@研究室 30分

10月17日(月)10:00~11:50,15:00~19:00@研究室 5時間30分

10月18日(火)10:20~12:20,13:00~18:30@研究室 7時間30分

10月19日(水)13:45~18:00@研究室 3時間30分

合計:20時間10分


頻出単語のファイルを読込み、1~7の感情値ごとに頻出単語の量がどのくらい変化しているのかを表示するところまでできました。

m0zuk2%e5%ae%9f%e8%a1%8c%e7%b5%90%e6%9e%9c%e6%96%87%e5%ad%97%e3%82%b5%e3%82%a4%e3%82%ba%e5%a4%89%e6%9b%b4%e5%be%8c%e3%83%9d%e3%82%b8%e3%83%86%e3%82%a3%e3%83%96

(ポジティブにバーを動かしたときの実行結果)

mozuk2%e5%ae%9f%e8%a1%8c%e7%b5%90%e6%9e%9c%e6%96%87%e5%ad%97%e3%82%b5%e3%82%a4%e3%82%ba%e5%a4%89%e6%9b%b4%e5%be%8c

(ネガティブの方にバーを動かした実行結果)

文字のサイズが頻出度が最小の値でも見やすい大きさに変更したため餅や走るの単語が見やすくなりました。

同様にクレヨンしんちゃんのツイートも感情値算出途中のものを終わらせて、可視化してみました。

%e3%81%8f%e3%82%8c%e3%81%97%e3%82%93%e5%ae%9f%e8%a1%8c%e7%b5%90%e6%9e%9c

単語の表示の配置を自分で設定しているため、クレヨンしんちゃんの可視化をしたときに単語がかさなってしまいました。

やっぱり配置を自動でするように書くようにしたいと思います。。。

 

 

3.10月6日~10月12日

<目標>

頻出単語の可視化をcsvファイルから読み込んで頻出度の高い順から読み込んで表示するようにプログラムを書く

<達成度>

50%

頻出単語をまとめたファイルから感情値を取り出してMozukの最初の画面に頻出単語を表示させた

超高速参勤交代のツイートから形態素解析を行った結果、上位16単語を表示している

mozuk%e5%ae%9f%e8%a1%8c%e7%b5%90%e6%9e%9c%e5%ae%8c%e6%88%90%e4%bb%ae1

<次週の目標>

感情値のバーを移動させたら頻出単語の大きさが頻出度の数字によって変化するようにプログラムを書く

紅華祭で出せるように現在は1つの番組しか結果を反映させていないが3つの番組すべて反映させることができるように努力する

<活動時間>

10月6日(木)15:30~18:45@研究室 3時間15分

10月7日(金)14:00~14:50,17:30~20:30@研究室 3時間50分

10月11日(火)11:55~12:15,13:00~18:15@研究室 5時間35分

10月12日(水)11:20~12:20,15:00~17:00,17:20~19:10@研究室 4時間50分

合計:17時間30分

 

 

感情値可視化のプログラム(配列)

デスクトップ、卒研、超高速参勤交代の頻出単語のフォルダ内にある頻出単語それぞれの感情値をまとめたファイルを読込むプログラム。

 


if (Character.isDigit(line.charAt(0))) {

// substring で左端の「1:」とかを消す
// System.out.println(line.substring(line.indexOf(":") + 2));
// split で数字をカンマ区切り

String line2;
line2 = line.substring(line.indexOf(":") + 2);
value = line2.split(", ");

// Integer.parseint で文字を数字に変換
num1[index] = Integer.parseInt(value[0]);
System.out.println("num1[0]= " + num1[index]);
num2[index] = Integer.parseInt(value[1]);
System.out.println("num2[1]= " + num2[index]);
num3[index] = Integer.parseInt(value[2]);
System.out.println("num3[2]= " + num3[index]);

sum[0] = num1[index] + num2[index] + num3[index];
System.out.println("sum[0]= " + sum[0]);

// 数字を配列に格納
names[index] = value[0];
index += 1;
}

 

配列について書いてあるサイトもちょいちょい参考にしました。

【Java】 配列と参照型変数

テストの点数を管理するプログラムで説明している。

基本型の一次配列

配列の基礎を上のサイト同様点数管理のプログラムで説明しています。

%e9%85%8d%e5%88%97%e5%9f%ba%e7%a4%8e

このサイトでは実行結果のイメージ図がわかりやすく書いてあり自分的には理解しやすかったです。

 

文字列の一部を取り出す

頻出単語の感情値や出現回数などを反映させた可視化の過程で頻出単語の感情値をまとめたファイルのフォルダを読み込んだりする処理で参考にしたサイトをまとめています。

文字列の一部を取り出す

// 行の始まりが数字かどうかを判定
if (Character.isDigit(line.charAt(0))) {
// substring で左端の「1:」とかを消す
System.out.println(line.substring(line.indexOf(":")+1));
}

「1:つるちゃん」の文章なら実行すると「つるちゃん」と表示される。

 

2.9月29日~10月5日

mecab-ipadic-NEologd』の公式サイトを見ながらMeCabに新しい辞書を追加しようとしました。

しかし、windowsでインストールすることができなかったため番組の頻出単語を可視化するプログラムをするためにバネモデルや位置問題のサイトを調べることをしました。

配置されたコンポーネントの表示位置を設定する

  • 配置されたコンポーネントが貼り付けられているパネルやフレームの中でどの位置に表示されるのかを設定する方法を説明

100

グラフの自動レイアウトに挑戦 #1 ばねモデル

  • 比較的単純な「Eadesのばねモデル」というアルゴリズムを採用

200


個別ゼミでアドバイスを頂いたjavaのライブラリのJungをいじってみました。

JUNG2.0  チュートリアルというサイトを参考にしました。

まずはじめに、マニュアルでレイアウトすることとしてグラフを描く方法をやってみました。

jung%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%82%84%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f

少しプログラムを自分なりにいじってノード間のエッヂを非表示にしたりしてみました。

jung%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%83%90%e3%83%bc%e6%b6%88%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f


<目標>

  • 形態素解析の改善としてMeCab用に作られた新しい辞書を利用して形態素解析を行い
    取得したツイートの形態素解析を完了させる
  • 今まで参考にしたサイトをまとめる作業を進める(土日に1,2個記事が書ければ良しとしたい・・・)

<達成度>

  • 形態素解析の改善としてMeCab用に作られた新しい辞書を利用して形態素解析を行い
    取得したツイートの形態素解析を完了させる →20% windows10のPCでmecab-ipadic-NEologdの辞書を利用した形態素解析を行うところまでしました。まだcsvを読み込んでcsvに結果を書き出すところまではやれていません。
  • 今まで参考にしたサイトをまとめる作業を進める(土日に1,2個記事が書ければ良しとしたい・・・)→0% 土日の活動ができませんでした。

<次週の目標>

  • 頻出単語の可視化をcsvファイルから読み込んで頻出度の高い順から読み込んで表示するようにプログラムを書く
  • バネモデルの勉強

<活動時間>

9月29日(木)15:30~19:30@研究室 4時間

10月3日(月)22:45~23:30@家 45分

10月4日(火)17:00~20:00@家 3時間

10月5日(水)13:30~18:30@研究室 5時間

12時間45分

 

 

1.9月23日~9月28日

可視化合宿が終わり、参加した生徒や先生方からさまざまなアドバイスをもらい、良い刺激をもらうことができました。

今週はさまざまなアドバイスをまとめ、今後の研究活動の計画を立てました。

合宿のまとめ

今後のスケジュール


後期から週報をブログのように書くため自分のホームページの作成をし始めました。

ツイート取得の際に参考にしたサイトや実際に組んだプログラムを

Twitterからテレビ番組の実況ツイートを取得する』にまとめました。


9月28日の個別ゼミで発表した今後のスケジュールを元にMeCabに登録されている辞書を改善するための手法を調べました。

mecab-ipadic-NEologd』というWeb上にある言語資源から単語をカスタマイズしてMeCab用に作られた辞書を見つけました。

29日からこの辞書を使用して形態素解析を使用して、取得してある番組の実況ツイートの形態素解析をしていきたいと思います。


<目標>

  • 今後のスケジュールを合宿のまとめを元に作成
  • ホームページの作成をして参考にしたサイトをまとめていく

<達成度>

  • 今後のスケジュールを作成→達成
  • ホームページの作成をして参考にしたサイトをまとめる→Twitterからツイート取得するサイトはまとめられた

<次週の目標>

  • 形態素解析の改善としてMeCab用に作られた新しい辞書を利用して形態素解析を行い
    取得したツイートの形態素解析を完了させる
  • 今まで参考にしたサイトをまとめる作業を進める(土日に1,2個記事が書ければ良しとしたい・・・)

<活動時間>

15時間

今週は、正確に時間を覚えていないため確実に活動した時間にしました(すみません)

 

Twitterからテレビ番組の実況ツイートを取得する

Twitterから特定のテレビ番組の実況ツイートを取得する方法とプログラムをまとめます。

開発言語はjavaとし、Twitterからツイートを取得するためにTwitter4Jを使用しました。

<参考サイト>

Twitterからつぶやきを取得する。 -放浪するエンジニアの覚え書き

Twitter4JでTweetを取得してみる


<プログラム>

  • 取得したツイートをcsvファイルに書き込む
  • RT、@、URL、ハッシュタグの削除
  • 投稿日時、ユーザ名、本文を取得し、csvファイルには本文だけ書き込む
// 初期化
Twitter twitter = new TwitterFactory().getInstance();
Query query = new Query();

try {
    File file = new File("C:\\csv\\Tweet21.csv");
    PrintWriter pw = new PrintWriter(file, "Shift-JIS");
    //追記で書き込む
//				pw = new PrintWriter(new BufferedWriter(new FileWriter(file,true)));

    DefaultTableModel tableModel = new DefaultTableModel(new String[]{"日付", "名前", "本文"}, 0);
    // 検索ワードをセット
    //query.setQuery("#" + txtSearchText.getText());
    query.setQuery("#" +txtSearchText.getText());
    // 1度のリクエストで取得するTweetの数(100が最大)
    query.setCount(100);
    query.setSince("2016-09-01");
    query.setUntil("2016-09-10");

    // 1500件(15ページ)最大数
    for (int i = 1; i <= 15; i++) {
        // 検索実行
        QueryResult result = twitter.search(query);
        System.out.println("ヒット数 : " + result.getTweets().size());
        System.out.println("ページ数 : " + new Integer(i).toString());

        // 検索結果を見てみる
        for (Status tweet : result.getTweets()) {
            // 本文
//						String s = tweet.

            // Dateクラスとユーザ名
            String date = tweet.getCreatedAt().toString();
            String user = tweet.getUser().getName();
            String str = tweet.getText();

            // 特定の文字の削除
            str = str.replaceAll("RT", "");
//                    str = str.replaceAll("@", "");

            if (str.charAt(1) == '@') {
                int index = str.indexOf(":");
//                        str = str.substring(index + 1, str.length());
                str = str.substring(index + 1);
            }

            // httpから始まるURLの削除
            if (str.contains("http")) {
                int index = str.indexOf("http");
                str = str.substring(0, index);
//                        System.out.println(index + ", total = " + str.length());
            }
            if(str.contains("#")){
                int index =str.indexOf("#");
                str =str.substring(0,index);
            }
            if(str.contains("#")){
                int index =str.indexOf("#");
                str =str.substring(0,index);
            }



//                    pw.println(date + "," + user + ",");
            pw.println(str);


            tableModel.addRow(new String[]{date, user, str});

            // リツイート
            int ret = tweet.getRetweetCount();

            // ハッシュタグとURLの削除	
            StringTokenizer sta = new StringTokenizer(str, " ");

            //トークンの出力
/*                    while (sta.hasMoreTokens()) {
                String wk = sta.nextToken();
               // if (wk.contains("http")
                       // && wk.contains("RT") && wk.contains("@")) {
                    pw.print(", ," + wk);

               // }
            }
*/
        }

        if (result.hasNext()) {
            query = result.nextQuery();
        } else {
            break;
        }
    }
    pw.close();

    tableTweets.setModel(tableModel);

} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}