科目の位置づけ・概要
- 選択科目です。
- 講義および演習の科目で、プログラミングの演習があります。後半に時間かけて作成する課題があります。
- 3年次科目「知的情報システムおよび演習」の前提科目です。
この科目は AI・自然言語処理・情報推薦に興味がある人が履修する科目です。
- 本科目では、データの記述、収集、処理などの技術について学びます。
また、応用として、Web上のデータを取得して組み合わせるマッシュアップの演習があります。
環境
テキスト
- データとその表現
- データの収集と処理
- Web上のデータの取得
- ストリームを用いたファイルの読み込み
- ストリームを用いたWeb上のリソースの取得
- 文字列の処理
- フィード (RSS/Atom)
- XML文書とDOM
- Webサービス (Web API)
- HTML文書とDOM
- 補足
最終課題
- 最終課題: 自分の好きなテーマでマッシュアップ
- 複数のリソースから得られる情報を組み合わせて有益な情報を得る
マッシュアップのプログラムを作成しましょう。
- ここでのリソースとは情報資源のことです。Web経由で取得する情報を基本とします。
- 原則として、Webサービスまたはフィード(RSS または Atom)で得られる情報を利用しましょう。
Webページ(HTML文書)を解析しないと得られない情報を使う場合には、
プログラムが煩雑になること、
取得時にサーバに負荷がかからないよう配慮する必要があることに留意してください。
- Web上の資源とローカルの情報を組み合わる場合には、Web上の資源は1つでよいとすることがあります(相談してください)。
ローカルな情報の例: Webブラウザのキャッシュや履歴、iTunes のライブラリのメタ情報、等。
- 複数のリソースをどう組み合わせ、どのような機能を実現するのか、工夫してみてください。
工夫するほど評価が上がります。
なお、GUI を用意したり Webアプリケーションにしたり、といった UI の工夫は、
この科目の主眼ではありませんのであまり評価は上がりません。
CUI (コンソールでの入出力) で問題ありません。
- 上記プログラムのレポートを書きましょう。詳細...
- 提出先・提出期限はプログラムと同じです。
- レポートの提出が無かったり、レポートの内容がプログラムと整合していない場合には単位が出ません。
- 提出先: 授業フォルダの「最終課題」
- 提出期限: 12月
15日(金) 16日(土) 23:59 (Boxの障害が発生したため)
- 提出先(遅れ提出): 授業フォルダの「最終課題(遅れ提出)」
- 提出期限(遅れ提出): 12月17日(日) 23:59 (減点になりますが受理します)
過去の作品例
2022年度
- キャンプ場を、Webサイト上の人気、現在地からの距離と所要時間、現地の天気を考慮してランキング
- 自分と相手の住所から集合場所とその付近の飲食店を推薦
- レシピを検索すると材料の参考価格を表示
- トレンドワードを集計して求め、それを扱ったニュースを取得して表示
2021年度
- 季節別のアニメに関するTwitterに投稿された画像の収集と表示
- YouTubeチャンネルの各動画の投稿当時のツイートの取得と表示
- 乗りたい電車の時刻から現在地に滞在できる時間と出発すべき時刻を算出
- 駅周辺のスポットを駅の出口ごとに分類して表示
- Qiitaの記事とGithubのレポジトリを横断検索し関連度の高い組み合わせを出力
- 今週末におすすめの観光スポットを、人気、天気予報、距離を考慮してランキング
- 任意のシーズンにおける声優の演じたキャラクター数を集計し、そのランキングおよび関連情報を表示
- 過去の株価の変化に関連ありそうなニュースとその要約を抽出して表示
2020年度
- 録画済みアニメの情報を一括取得
- 指定した期間に晴れている都道府県とそこの観光情報・宿泊情報を表示
- 情報系の資格を人気度・難易度・取得費用を考慮してランキング
- ユーザの感情にマッチしたカクテルを提案し、材料の合計金額を表示
- ゲームアプリのダウンロード数と売り上げを考慮し、注目アプリとその注目の持続性を判定
- 登録した企業の有益な情報を自動で収集し表示
- 英単語の学習支援
2019年度
- ニコニコ動画でランキングにランクインした動画のTwitterでの人気度を調査
- 旅行の目的地を指定すると、候補の宿とその近隣の飲食店情報を表示
- 複数の動画配信サイトの番組を視聴者数順にソートし、動画をウィンドウに表示
- 季節別TVアニメ主題歌のTSUTAYA在庫情報を照会
- ホットペッパーグルメとぐるなびの両サイトで上位の飲食店を駅名から検索
- Spotifyプレイリストをレーベル、ジャンル、リリース年に分類
- 料理のレシピを検索し、その結果のソート基準をその日の天気により変更
- ニコニコ動画のアニメランキングを、それぞれのアニメのまとめサイトの情報と同時に表示
発表会
2023年12月19日(火)に最終課題の発表会を開催します。
- 発表手順
- 学籍番号と名前を述べる。
- プログラムのタイトルを示し、何をするプログラムなのか概要を説明する。
- デモをする。(できない場合は過去の実行結果を提示)
- プログラムの中で、特にアピールしたい工夫点を述べる。
- 質疑を受ける。
- 発表時間: 発表5分、質疑5分程度を想定。
- 発表者: 立候補優先 + 当日指名。
- 楽しんで作成した人は、ぜひ披露しましょう。
- プログラムの完成度が低くても、
結果が面白そうだと指名されることがあります。
指名されるか否かと成績は必ずしも一致しません。
- 評価との関係: 提出物に対する評価点が、発表の内容により見直されます。
発表では工夫点を直接アピールできるため、
レポートよりも成果を認められやすい傾向にあります。
よくある質問
- 実行するとコンソールにエラーが表示される
-
- まずエラーメッセージを読みましょう。
例外が発生している場合、その種類、発生したクラスとメソッド、発生箇所(行)を確認しましょう。
- 解決方法の知られているケースかも知れませんので、エラーメッセージの主要部分でWeb検索してみましょう。
- Webサービスのレスポンスが解析できない
-
- リクエストの URL をコンソールに表示し、その URL が正しいか確認しましょう。
パラメータの区切りの &が抜けていたりしないでしょうか。
日本語は URLエンコードされた形になっているでしょうか。
- その URL をブラウザのアドレスバーに入力し、ブラウザでレスポンスを表示させてみましょう。
エラーのレスポンスが返ってきている場合、正常なレスポンスと構造が異なるため、
正常なレスポンスの構造を想定したプログラムで対応できません。
- XPath を書く際、ツリー内の繰り返し構造に着目しましょう。RSS の item 要素のように、
繰り返して出現する要素を NodeList として取り出すようにすると見通しが良くなります。
- Webページから情報を抽出しようとしたがうまくいかない
-
- Chrome のデベロッパーツール (Ctrl+Shift+I) で要素(element)のツリーを確認することができますが、
これは動的に更新されるもので、プログラムが取得するものと必ずしも一致しません。
ページのソースを表示 (Ctri+U) して、こちらも確認しましょう。
- サイトによっては、ブラウザからのアクセスとプログラムからのアクセスでレスポンスを変えています。
疑われる場合には、プログラムで取得したものをコンソールに出力してみましょう。
- 動的に更新される部分を取得したいのであれば
Selenium の使用を検討してください。
- Chrome のデベロッパーツール (Ctrl+Shift+I) で要素(element)のツリーを確認することができますが、
要素を右クリックすると、その要素の XPath をコピーすることができます。
- 正規表現のパターンを書いてみたが機能しない
-
- たいていはパターンが誤っています。
- 前項のように、サーバから送られてきているものが想定しているものと異なる場合があります。
提出物は Box
の出題回のフォルダの直下に学籍番号(アルファベットは小文字)のフォルダを作成し、
その中にコピーしてください。
なお、他の人と同じファイルを提出すると 0点以下の点数になります。
- 課題12
- 最終課題の情報の組み合わせ(または情報抽出の続き) (3)
すでに複数のリソースからの情報抽出を終えている人は、それらの情報を組み合わせるプログラムを作成しましょう。
取得するリソースが多いなどの理由でまだすべての情報抽出を終えていない人は、
引き続きリソースの取得と情報抽出を進めるのでもかまいません。
- プログラムは一体として動作するようにしましょう。
- マッシュアップの機能は作成途中でかまいません。途中経過を提出してください。
- ファイル名: (指定なし)
- 備考: プログラムが動作していない人も、作成途中のものを提出すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第12回
- 提出期限: 次回の前日 22:00
- 課題11
- 最終課題の情報の組み合わせ(または情報抽出の続き) (2)
すでに複数のリソースからの情報抽出を終えている人は、それらの情報を組み合わせるプログラムを作成しましょう。
取得するリソースが多いなどの理由でまだすべての情報抽出を終えていない人は、
引き続きリソースの取得と情報抽出を進めるのでもかまいません。
- プログラムは一体として動作するようにしましょう。
- マッシュアップの機能は作成途中でかまいません。途中経過を提出してください。
- ファイル名: (指定なし)
- 備考: プログラムが動作していない人も、作成途中のものを提出すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第11回
- 提出期限: 次回の前日 22:00
- 課題10
- 最終課題の情報の組み合わせ(または情報抽出の続き) (1)
すでに複数のリソースからの情報抽出を終えている人は、それらの情報を組み合わせるプログラムを作成しましょう。
取得するリソースが多いなどの理由でまだすべての情報抽出を終えていない人は、
引き続きリソースの取得と情報抽出を進めるのでもかまいません。
- プログラムは一体として動作するようにしましょう。
- マッシュアップの機能は作成途中でかまいません。途中経過を提出してください。
- ファイル名: (指定なし)
- 備考: プログラムが動作していない人も、作成途中のものを提出すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第10回
- 提出期限: 次回の前日 22:00
- 課題9
- 最終課題のリソース取得と情報抽出 (2)
最終課題のプログラムでは複数のリソースを取得します。
2つ目以降のリソースを取得するプログラムを作成しましょう。
- 1つ目を Webサービスかフィード(RSS または Atom) にした場合、
2つ目以降は Webページでもかまいません(推奨はしません)。
- 複数のリソースを取得するプログラムを一体のものとして動作させましょう。
- 先に進んでいる人は、得られた情報を組み合わせたりするプログラムを提出してもかまいません。
- ファイル名: (指定なし)
- 備考: 動作するに至らなかった人は、作成途中のものを提出すること。
その場合、動かなかった機能をファイル先頭にコメントで記述すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第09回
- 提出期限: 次回の前日 22:00
- 課題8
- 最終課題のリソース取得と情報抽出 (1)
最終課題のプログラムでは複数のリソースを取得することになりますが、
まずそのうちの1つを取得するプログラムを作成しましょう。
サーバからのレスポンスを受け取るだけでなく、そこから必要な情報を抽出する部分も考えましょう。
抽出したい情報が要素の一部である場合には、正規表現などによる文字列処理も必要になります。
なお、他のリソースからの情報がないと抽出する情報が定まらない場合には、今回は先送りでかまいません。
- 今回は Webサービスかフィード(RSS または Atom)を利用しましょう。
Webページだけを情報源とすることは避けてください。
- 将来的には、複数のリソースを取得するプログラムを一体のものとして動作させることになります。
なるべく、それを想定したクラスの構成にしておきましょう。
- 先に進んでいる人は、2つ以上のリソースを取得したり、
組み合わせたりするプログラムを提出してもかまいません。
- 課題6で1つ目のリソース取得と情報抽出まで完了している人は、
今回は2つ目に取り組みましょう。
- このプログラムで取得するリソースは、最終課題で用いるリソースの「候補」でかまいません。
つまり、この先の検討により利用しなくなってもかまいません。
- ファイル名: (指定なし)
- 備考: 動作するに至らなかった人は、作成途中のものを提出すること。
その場合、動かなかった機能をファイル先頭にコメントで記述すること。
- プログラムの構想 [更新した人のみ]
プログラムの構想を変更した人は、改訂版のスライドを提出してください。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 提出先: 授業フォルダの第08回
- 提出期限: 次回の前日 22:00
- 課題7
- プログラムの構想
最終課題のプログラムの構想をスライドにまとめましょう。
以下の内容を含めてください。
- 実現する機能の概要
- 使用するリソースごとの概要と形式(以下をリソースの数だけ記述)
- 概要
- 提供元
- ベースURL
- 形式: Webサービス | RSS | Atom | HTML | その他
- システムの概要が分かる図
- システムの入出力と内部のデータの流れがわかるもの。
- 事前にデータを集めておく場合は、それも表現すること。
- ファイル名: システム構想.pptx (PowerPointを使わない人は PDF でも可)
- 備考: 構想は確定ではなく、後での変更も可とします。
- 提出先: 授業フォルダの第07回
- 提出期限: 次回の前日 22:00
- 課題6: フィードからの情報の取得
- 課題6a: item要素の追加情報の取得
item要素の中に title, link, description 要素以外の要素を含むフィードを探し、
その要素からも情報を取り出して表示しましょう。
- pubDate, creator, date, など、いろいろな種類があります。1つ以上を対象としてください。
- 名前空間接頭辞を無視する場合、要素の指定は dc:date ではなく date となります。
- Feed クラス、Item クラスを改造する必要があります。
- ファイル名: FeedItemViewer.java, Feed.java, Item.java
- 課題6b: item要素の絞り込みまたはソート
情報を取り出す item要素を絞り込んだり、item要素から取り出した情報をソートしたりしてみましょう。
絞り込みとソートのどちらかでも、両方でもかまいません。
- item 要素の絞り込みの方法は、XPath 式でも、item要素の子要素から取り出した情報で判断するのでもかまいません。
- 課題6a と同じパッケージにすると、Feed クラス、Item クラスが共通になることに注意しましょう。
別のクラスにしたい場合は、パッケージを別にするか、クラス名を変更しましょう。
- クラス定義の直前の位置のコメントに機能の説明を書いておいてください。
- ファイル名: FeedItemExtractor.java,
Feed.java,
Item.java (Feed, Item クラスは名称変更してもよい)
- 提出先: 授業フォルダの第06回
- 提出期限: 第7回(10/31)の前日 22:00
- 課題5
- 課題5: フィードの発見
自分の興味のある分野の情報が得られるフィードを見つけてください。
よいものがあれば最終課題で扱う情報の1つになるかもしれません。
- 3つ以上見つけ、URL を控えておいてください。
- 仕様 (RSS 1.0 / RSS2.0 / Atom)、文字コード、取得可能な件数(item要素の数)を確認してください。
- リクエスト時にパラメータを与える仕様の場合にはパラメータの仕様も確認しましょう。
- 提出: なし (次の課題で情報の取得対象として使います)
- 期限: 第6回(10/24)の授業前まで
- 課題4
- 課題4: Webページからの情報抽出 (正規表現を使用)
Yahoo! ショッピングの任意の商品のページを取得し、その商品の送料を調べましょう。
正規表現を活用してください。
また、送料の値を整数値として得るようにしましょう。送料無料の場合は 0、送料不明の場合は -1 の値を取るようにしてください。
- 課題3
- 課題3: Webページからの情報抽出 (Stringクラスのメソッドを使用)
Yahoo! ショッピングの任意の商品のページを取得し、その商品の送料を調べましょう。
String クラス
のメソッドを活用してください。
- 送料無料の場合には、その旨表示されるようにしましょう。
- 送料の情報がなかった場合には、その旨表示されるようにしましょう。
- ヒント
- 「YahooShoppingShippingExtractor.java」の内容は、
「ShowFile1.java」をネットワーク接続するよう変更したものをベースにするとよいでしょう。
なお、ShowFile1.java では args[0] に URL が入っていることを前提にしていますが、
URL を直接ソースコードに書いてかまいません。
その場合、main メソッド先頭にある、args.length を確認する if 文は不要になります。
- まずは「送料〇〇円」あるいは「送料無料」と書かれている行だけを表示してみましょう。
- 練習として、「送料」という文字列が含まれている行の行全体を表示するプログラムを作成しましょう。
String クラスの
contains メソッドか indexOf メソッドを使います。
文字列 line に対して、文字列「送料」が含まれているかを尋ねるには
line.contains("送料") とします。戻り値の型は boolean です。
- String クラスの
indexOf メソッドを利用して、指定した文字列の出現する先頭の位置を調べることができます。
文字列 line に対して、文字列「送料」が含まれている位置を尋ねるには
line.indexOf("送料") とします。戻り値の値は、文字列 line に「送料」が現れる場合は「送」の位置、
現れない場合は -1 です。
- 開始位置、終了位置を指定して、文字列の一部を substring メソッドを利用して抜き出すことができます。
文字列 line の beginIndex 文字目から endIndex 文字目の直前までを抜き出すには
line.substring(beginIndex, endIndex) とします。戻り値は抜き出した文字列です。
- 複数の商品ページでテストしましょう。
- ファイル名: YahooShoppingShippingExtractor.java
- 提出先: 授業フォルダの第03回
- 提出期限: 次回の前日 22:00
課題2
- 課題2: 「妥当な」XML文書ファイルの作成
自分が記述したいデータを決め、そのデータを記述するのに適したデータ記述言語を設計し、
実際にデータを記述してください。
記述する対象は、趣味のデータでもなんでもかまいません。
データ記述言語を設計するにあたっては、
意味的に適切な構造を持つようにしてください。
意味的に適切な構造を持つとは、例えば、実世界で階層構造を持つものは、
XMLの構造上も階層構造を持っている、といったことです。
5階層以上の構造を持つようにしてください。
- 提出先: 授業フォルダの第02回
- 提出期限: 次回の前日 22:00
課題1