はじめまして,Twitter id:Taka_Kuniのtakahito kuniyoshiです.
今回の投稿は第三回さくさくテキストマイニングの資料を書きます.
さくさくテキストマイニングの目的に
・テキストマイニングについての学習のスタートアップ
・テキストマイニング技術に関して気軽に参加・議論することができる場の提供
がありましたので,私の知っていることや個人でやっていることをちょろっと書きます.
私の発表の目的としては「テキストマイニングについての学習のスタートアップ」に注目して,
テキストマイニングってなにができるの?ってところから入っていきたいと思います.
しかし,会場等に初心者の方がいないのであれば,ここはすっとばして,やっていることにいきなり入りたいと思います.
ですので,発表用のスライドはすごく多いかと.
(途中終了,またあとで書きます)
このブログを検索
5.21.2011
4.13.2011
最近の動向
おはようございます.
今春から社会人になりまして,現在研修のまっただ中です.
勉強会等に参加したいのですが,社会人生活に馴染めず,まだ行けてない情況です.
学生の頃と違い,土日が完璧に暇になったので行きたいのですが,
思うように都合がつかず,現在は家でいろいろとネタをつくってます.
現在つくっているのは,
前の日記の実験用アプリケーション作成.
と,
検索結果のマップ化アプリケーション
をつくっています.
前者の方は,SOMのライブラリを作成しているので,すぐ作成できるのですが,
Kohonenの文献にもあるように,多くの方が作成されているため,あまりやる気がおきません.
新規性の問題ですね.
後者の方は,うまくいくか前実験の段階です.
実験結果等は,こちらのブログにて,発表させていただきます.
学会発表等でもいいのですが,アイデア勝負なところがあるため,ブログにて公開し,
すぐにウェブアプリケーションをリリースしたいと考えています.
主に携帯端末を対象に考えているので,Android用のアプリケーションも考えていますので,
ご意見等ございましたら,御連絡ください.
今日のところは以上となります.
社会人生活で忙しく,まだ慣れない生活ですが,がんばっていきたいと考えています.
おやすみなさい.
今春から社会人になりまして,現在研修のまっただ中です.
勉強会等に参加したいのですが,社会人生活に馴染めず,まだ行けてない情況です.
学生の頃と違い,土日が完璧に暇になったので行きたいのですが,
思うように都合がつかず,現在は家でいろいろとネタをつくってます.
現在つくっているのは,
前の日記の実験用アプリケーション作成.
と,
検索結果のマップ化アプリケーション
をつくっています.
前者の方は,SOMのライブラリを作成しているので,すぐ作成できるのですが,
Kohonenの文献にもあるように,多くの方が作成されているため,あまりやる気がおきません.
新規性の問題ですね.
後者の方は,うまくいくか前実験の段階です.
実験結果等は,こちらのブログにて,発表させていただきます.
学会発表等でもいいのですが,アイデア勝負なところがあるため,ブログにて公開し,
すぐにウェブアプリケーションをリリースしたいと考えています.
主に携帯端末を対象に考えているので,Android用のアプリケーションも考えていますので,
ご意見等ございましたら,御連絡ください.
今日のところは以上となります.
社会人生活で忙しく,まだ慣れない生活ですが,がんばっていきたいと考えています.
おやすみなさい.
ラベル:
日記
2.01.2011
サービス案1
昼間に考えたサービス案を書き留めます.
事前調査等はしておらず,ただの思いつきなので,研究・ビジネス化等盗む要素があれば,盗んでくださって構いません.
また,既にこういうのがあるよ等の情報があれば,お教え願いたいと思います.
けれど,ビジネス化しにくいかと思うので,なんとも言えないですね.
話を戻して,サービス案1を書きます.
昨日,部屋じまんコミュニティ「リムル」やIn My Bagにて,自室のPC環境や鞄の中身を公開しました.
その際に,持ち物等のタグをつける点があったのですが,In My Bagでは画像中の領域を指定して,タグをつけることができます.
これは,おもしろいなぁなんて思ったりもしましたが,めんどくさい.
持ち物にコメントをつけるには最適だが,この持ち物がなにかの説明を付けるのがめんどくさかった.楽しんでいたけどね.
(この時点でわかるかと思いますが,私はめんどくさがりです)
これを自動化させれば,コメント付ける際にも楽に付けることができるのではないか,また同時にショッピングサイトと連動させ購入ページに飛ばせれば,アフィリエイト等も望める.
まぁ,最後の一言は余分かと思いますが,自動で行ってもらえると楽になるのは確かです.
そこで,自動化させるためのシステムを構築し,鞄だけでなく様々な写真から商品を紹介するサービスを展開させれないかと考えました.
商品を抽出する際には,領域抽出等で可能かと思いますが,
システムの最大の問題点は,商品の外観をある程度システムが知っている必要がある点です.
一点からの画像のみでは,正確に推測するのは難しいと考えます.
複数の画像を用意し,そのデータベースに対しマッチングを行えば,精度もあがるかとおもいます.
あと,問題点としては,画像中に完全に露出している状態でないときの対処法ですね.
そこをクリアすれば,サービスとして提供できるかと思います.
マネタイズの点は提案の時点では考えていません.
そこまで落としこむ必要性も将来性も現段階の知識的に不可能に近いので.
このシステムの要点をまとめると,
・複数視点からみた物体データベースの作成
・ノイズ(障害物)がある状態からの物体抽出
・抽出した物体とデータベースの照合
をクリアする必要があるかと思います.
昼間にパッと思いついただけなので,なんとも言えないのですが,
メモとして扱って,これからもサービス案があれば書いていこうかと思います.
以上
事前調査等はしておらず,ただの思いつきなので,研究・ビジネス化等盗む要素があれば,盗んでくださって構いません.
また,既にこういうのがあるよ等の情報があれば,お教え願いたいと思います.
けれど,ビジネス化しにくいかと思うので,なんとも言えないですね.
話を戻して,サービス案1を書きます.
昨日,部屋じまんコミュニティ「リムル」やIn My Bagにて,自室のPC環境や鞄の中身を公開しました.
その際に,持ち物等のタグをつける点があったのですが,In My Bagでは画像中の領域を指定して,タグをつけることができます.
これは,おもしろいなぁなんて思ったりもしましたが,めんどくさい.
持ち物にコメントをつけるには最適だが,この持ち物がなにかの説明を付けるのがめんどくさかった.楽しんでいたけどね.
(この時点でわかるかと思いますが,私はめんどくさがりです)
これを自動化させれば,コメント付ける際にも楽に付けることができるのではないか,また同時にショッピングサイトと連動させ購入ページに飛ばせれば,アフィリエイト等も望める.
まぁ,最後の一言は余分かと思いますが,自動で行ってもらえると楽になるのは確かです.
そこで,自動化させるためのシステムを構築し,鞄だけでなく様々な写真から商品を紹介するサービスを展開させれないかと考えました.
商品を抽出する際には,領域抽出等で可能かと思いますが,
システムの最大の問題点は,商品の外観をある程度システムが知っている必要がある点です.
一点からの画像のみでは,正確に推測するのは難しいと考えます.
複数の画像を用意し,そのデータベースに対しマッチングを行えば,精度もあがるかとおもいます.
あと,問題点としては,画像中に完全に露出している状態でないときの対処法ですね.
そこをクリアすれば,サービスとして提供できるかと思います.
マネタイズの点は提案の時点では考えていません.
そこまで落としこむ必要性も将来性も現段階の知識的に不可能に近いので.
このシステムの要点をまとめると,
・複数視点からみた物体データベースの作成
・ノイズ(障害物)がある状態からの物体抽出
・抽出した物体とデータベースの照合
をクリアする必要があるかと思います.
昼間にパッと思いついただけなので,なんとも言えないのですが,
メモとして扱って,これからもサービス案があれば書いていこうかと思います.
以上
ラベル:
メモ
10.19.2010
KDDIとSkypeの戦略的包括提携「Skype™ au」の提供について
無断リンクですが,以下のことが発表されました.
au携帯電話でskype
あくまで素人目線の意見ですので,聞き流すくらいでちょうどいいかと思います.
それでも読んでくれる方はどうぞ.
私がPCに触りだしたくらいは2000年くらいだったと思う.
そのころ使っていたメッセンジャーはYahoo!だったかな.
すでにボイスチャットとかはできていたから,現在と考えて表面上ではそこまで技術進歩してない(あくまでユーザからしたらね,転送速度・容量とかは変わったけどさ)
まだ携帯電話ももってなくて,PHSを持ってた気がする.
それくらいのときから,電話を急にするようになって,電話代で何度怒られたことか.
本題に戻ろうか,携帯電話でskypeは,油と水みたいに混ざらないだろうなと思ってました.
skypeID間の通話は無料(パケット料はかかる)みたいなものですからね.
事業の1部として,無線通話を扱っている業者からすれば,いい迷惑だろうと思います.
それをやってのけたauは挑戦者だと思うし,どんな策略があるのだろうと考えました.
考えられるのは,誰もやってないことに挑戦することでの,ユーザの確保.
また,通信技術・端末性能ともに高性能化する中,止めることができないと判断したのか.
今,ぱっと考えられたのはこの2点です.
1点目は,他者との差別化を図るには最大の武器になる点です.
公式には国内の事業者はどこもやってないことをやってのけることで,集客も見込めるうえに,流出も防げる点があります.
2点目はそのままですね.
それにしても,この発表は,驚きでした.
今までにできる端末などは知っていましたが,あまり身近でなかったことから手を出さずにいたのですが,
この発表で少しauもいいなと思いました.
近い将来,音声通信が無料になる日も近いのでは…
だらだらと続けるわけにはいかないので,ここで終わりにします.
なにかおもしろい記事があったら,また感想などを書こうかと思います.
au携帯電話でskype
あくまで素人目線の意見ですので,聞き流すくらいでちょうどいいかと思います.
それでも読んでくれる方はどうぞ.
私がPCに触りだしたくらいは2000年くらいだったと思う.
そのころ使っていたメッセンジャーはYahoo!だったかな.
すでにボイスチャットとかはできていたから,現在と考えて表面上ではそこまで技術進歩してない(あくまでユーザからしたらね,転送速度・容量とかは変わったけどさ)
まだ携帯電話ももってなくて,PHSを持ってた気がする.
それくらいのときから,電話を急にするようになって,電話代で何度怒られたことか.
本題に戻ろうか,携帯電話でskypeは,油と水みたいに混ざらないだろうなと思ってました.
skypeID間の通話は無料(パケット料はかかる)みたいなものですからね.
事業の1部として,無線通話を扱っている業者からすれば,いい迷惑だろうと思います.
それをやってのけたauは挑戦者だと思うし,どんな策略があるのだろうと考えました.
考えられるのは,誰もやってないことに挑戦することでの,ユーザの確保.
また,通信技術・端末性能ともに高性能化する中,止めることができないと判断したのか.
今,ぱっと考えられたのはこの2点です.
1点目は,他者との差別化を図るには最大の武器になる点です.
公式には国内の事業者はどこもやってないことをやってのけることで,集客も見込めるうえに,流出も防げる点があります.
2点目はそのままですね.
それにしても,この発表は,驚きでした.
今までにできる端末などは知っていましたが,あまり身近でなかったことから手を出さずにいたのですが,
この発表で少しauもいいなと思いました.
近い将来,音声通信が無料になる日も近いのでは…
だらだらと続けるわけにはいかないので,ここで終わりにします.
なにかおもしろい記事があったら,また感想などを書こうかと思います.
ラベル:
news
10.03.2010
自己組織化マップの応用1-序章-
自己組織化マップを利用した巡回セールスマン問題の準最適解を導く-序章-
今回のキーワード
「巡回セールスマン問題」
「自己組織化マップ(SOM)」
「準最適解」
今回は序章として,問題定義と解決方法並びにSOMについてを記す.
結果等は次回の投稿にて行います.
まず,巡回セールスマン問題とはなにかから入ります.
巡回セールスマン問題とは,別名が多くありますが,要するに目的地を最短で回るためのルートはどのルートか導くことです.
最近の話でいうと,Google DevQuizの第3問あたりであったかと思います.
あの問題では,距離が問題なのではなく,移動時間に焦点を当てていました.
本題に戻ると,巡回ルートは都市(以降データ点とする)が多くなれば指数的にルートが増えていきます.
数学的知識を使えば,巡回ルートは減らすことができますが,それでも指数的に増えることには変わりありません.
では,どうやって解けばいいか.
コンピュータを使って,解かせるのが一番早いでしょう.
今回私が用いるのは「自己組織化マップ(以降SOM)」です.
SOMの一般的な使用法は,高次元のベクトルを二次元に射影することで可視化などを促すことが,多いかと思います.
この射影することができる点を利用し,巡回セールスマン問題の準最適解を導きます.
具体的にはマップではなく,1次元にして利用するので,「自己組織化リング」とでもいいましょうか.
準最適解しか導くことができないのは,学習系のアルゴリズムであるため,精密な距離計算を行わないことから
必然的に最適解に近い結果しか導くことができないからです.
しかし,データ点が増えても短時間でルートを算出できる点や,膨大な時間や複雑なアルゴリズムが不要である点など,
多くの利点があります.
(まぁ,ほんとのことを言えば,最近SOMばっかり使ってるので,ほかのことにも応用させたいと思っているだけなんですけどね)
早いですけど,今回は問題定義だけ行い,グラフィック化させるシステムができれば,解答編を描きたいと思います.
まとめ
今回の目的:巡回セールスマン問題をSOMを利用して解く(データ点に関しては,乱数なり実際の都市なりを利用)
自己組織化写像wikipedia
巡回セールスマン問題
今回のキーワード
「巡回セールスマン問題」
「自己組織化マップ(SOM)」
「準最適解」
今回は序章として,問題定義と解決方法並びにSOMについてを記す.
結果等は次回の投稿にて行います.
まず,巡回セールスマン問題とはなにかから入ります.
巡回セールスマン問題とは,別名が多くありますが,要するに目的地を最短で回るためのルートはどのルートか導くことです.
最近の話でいうと,Google DevQuizの第3問あたりであったかと思います.
あの問題では,距離が問題なのではなく,移動時間に焦点を当てていました.
本題に戻ると,巡回ルートは都市(以降データ点とする)が多くなれば指数的にルートが増えていきます.
数学的知識を使えば,巡回ルートは減らすことができますが,それでも指数的に増えることには変わりありません.
では,どうやって解けばいいか.
コンピュータを使って,解かせるのが一番早いでしょう.
今回私が用いるのは「自己組織化マップ(以降SOM)」です.
SOMの一般的な使用法は,高次元のベクトルを二次元に射影することで可視化などを促すことが,多いかと思います.
この射影することができる点を利用し,巡回セールスマン問題の準最適解を導きます.
具体的にはマップではなく,1次元にして利用するので,「自己組織化リング」とでもいいましょうか.
準最適解しか導くことができないのは,学習系のアルゴリズムであるため,精密な距離計算を行わないことから
必然的に最適解に近い結果しか導くことができないからです.
しかし,データ点が増えても短時間でルートを算出できる点や,膨大な時間や複雑なアルゴリズムが不要である点など,
多くの利点があります.
(まぁ,ほんとのことを言えば,最近SOMばっかり使ってるので,ほかのことにも応用させたいと思っているだけなんですけどね)
早いですけど,今回は問題定義だけ行い,グラフィック化させるシステムができれば,解答編を描きたいと思います.
まとめ
今回の目的:巡回セールスマン問題をSOMを利用して解く(データ点に関しては,乱数なり実際の都市なりを利用)
自己組織化写像wikipedia
巡回セールスマン問題
ラベル:
SOM
9.23.2010
[Java]Scanner VS BufferedReader
ファイル入力の際にいつもBufferedReaderクラスしか使ったことなかったですが,
ふとしたときにScannerクラスの存在を知ったので,
違いと個々の使い分け法記します.
また,説明する際に使用するテキストファイル内容は
test.txt
・BufferedReaderクラス使用
コード例
・Scannerクラス使用
上記のプログラムを個々に100回繰り返した時の時間を比較したところ,
BufferedReaderクラス : 0.015秒
Scannerクラス : 0.062秒
Scannerクラスのほうが遅いことがわかる.
では,Scannerクラスを利用するメリットはないかといえば,そうではありません.
メリット1 キーボード入力
メリット2 型指定キーボード入力
実行結果(入力:123 456
以上のようにBufferedReaderを使用した場合、よりScannerを利用した方がコードは簡潔にすることが可能です。
暗黙的に2つに分けると決めていたのですが、実際使用する場合は、
また、使用する際はExceptionが発生した場合に対処するためtry文なりthrowなりで対策する必要があります。
参考資料
Scanner
BufferedReader
ふとしたときにScannerクラスの存在を知ったので,
違いと個々の使い分け法記します.
また,説明する際に使用するテキストファイル内容は
test.txt
Hello World 1 2 3 おはよう!を使用します.
・BufferedReaderクラス使用
コード例
try {
BufferedReader in = new BufferedReader(new FileReader(textAd));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
} catch (IOException er) {
System.out.println(er.getMessage());
}
・Scannerクラス使用
try {
File file = new File(textAd);
Scanner ScanFile = new Scanner(file);
while (ScanFile.hasNextLine()) {
System.out.println(ScanFile.nextLine());
}
ScanFile.close();
} catch (IOException er) {
System.out.println(er.getMessage());
}
上記のプログラムを個々に100回繰り返した時の時間を比較したところ,
BufferedReaderクラス : 0.015秒
Scannerクラス : 0.062秒
Scannerクラスのほうが遅いことがわかる.
では,Scannerクラスを利用するメリットはないかといえば,そうではありません.
メリット1 キーボード入力
Scanner scan = new Scanner(System.in); String line = scan.next(); System.out.println(line); line = scan.next(); System.out.println(line);実行結果(入力: hello world)
hello world
メリット2 型指定キーボード入力
int line = scan.nextInt(); System.out.println(line); line = scan.nextInt(); System.out.println(line);
実行結果(入力:123 456
123 456
以上のようにBufferedReaderを使用した場合、よりScannerを利用した方がコードは簡潔にすることが可能です。
暗黙的に2つに分けると決めていたのですが、実際使用する場合は、
while (scan.hasNextInt()) {
int line = scan.nextInt();
System.out.println(line);
}
と、書くといいかもしれません。また、使用する際はExceptionが発生した場合に対処するためtry文なりthrowなりで対策する必要があります。
参考資料
Scanner
BufferedReader
ラベル:
Java
9.21.2010
test
package SGM.main;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import SGM.Data.Data;
/*
Training Set (9,603 docs): LEWISSPLIT="TRAIN"; TOPICS="YES"
Test Set (3,299 docs): LEWISSPLIT="TEST"; TOPICS="YES"
Unused (8,676 docs): LEWISSPLIT="NOT-USED"; TOPICS="YES"
or TOPICS="NO"
*/
public class Main {
private static String FileAd = "D:/TESTDATA/Reuter/file";
private static LinkedList<String> fileList = new LinkedList<String>();
public static void main(String[] args) {
setFileList(FileAd);
SGMReader sgm = new SGMReader(fileList);
String line = "<TITLE>BAHIA COCOA REVIEW</TITLE>";
String key = "TITLE";
System.out.println(getData(line, key));
}
private static void setFileList(String address) {
File file = new File(address);
String[] list = file.list();
for (int i = 0; i < list.length; i++) {
String _ad = new String(address).concat("/" + list[i]);
if (isFile(_ad)) {
fileList.add(_ad);
System.out.println(_ad);
} else {
setFileList(_ad);
}
}
}
private static Boolean isFile(String address) {
File file = new File(address);
if (file.isFile()) {
return true;
}
return false;
}
private static String getData(String line, String key) {
int beginIndex = line.indexOf(key) + key.length() + 1;
int endIndex = line.lastIndexOf(key) - 2;
line = line.substring(beginIndex, endIndex);
return line;
}
}
class SGMReader {
private String fileAd = "./reut2-001.sgm";
private String[] element = { "REUTERS", "DATE", "TOPICS", "PLACES", "D", "PEOPLE", "ORGS",
"EXCHANGES", "COMPANIES", "UNKNOWN", "TEXT", "TITLE", "DATELINE", "BODY", };
private int testNum = 0;
private int trainNum = 0;
private int sum = 0;
public SGMReader(LinkedList<String> fileList) {
for (String ad : fileList) {
this.Reader(ad);
}
System.out.println("test:\t" + testNum + "\ntrainNum:\t" + trainNum + "\nsum:" + sum);
}
public SGMReader() {
this.Reader();
}
private void Reader(String ad) {
ArrayList<String> SGM = new ArrayList<String>();
String title = new String();
Data data;
try {
File fHandle = new File(ad);
Scanner fScan = new Scanner(fHandle);
String Mode = "Unused";
Boolean ReadMode = false;
String ID = new String();
Boolean SaveMode = false;
while (fScan.hasNextLine()) {
String str = fScan.nextLine();
// System.out.println(str);
if (this.haveKey("LEWISSPLIT", str)) {
SGM.clear();
ID = new String();
title = new String();
ReadMode = false;
Mode = "Unused";
SaveMode = false;
if (this.isTrainingSet(str).equals("TRAIN")) {
Mode = "TRAIN";
title = "TRAIN";
ID = this.getNewID(str);
trainNum++;
} else if (this.isTrainingSet(str).equals("TEST")) {
Mode = "TEST";
title = "TEST";
ID = this.getNewID(str);
testNum++;
}
}
if (Mode != "Unused") {
if (this.haveKey("TOPICS>", str)) {
str = str.replace("<D>", "");
str = str.replace("</D>", "_");
String topics = this.getData(str, "TOPICS");
// if (topics.length() != 0) {
title = title.concat("." + topics + "" + ID + ".txt");
sum++;
SaveMode = true;
// }
}
if (this.haveKey("<BODY", str)) {
str = str.substring(str.indexOf("BODY") + new String("BODY").length() + 1);
ReadMode = true;
}
if (this.haveKey("</BODY", str)) {
if (SaveMode == true) {
data = new Data(title, SGM);
}
SGM.clear();
ID = new String();
title = new String();
ReadMode = false;
Mode = "Unused";
SaveMode = false;
}
if (ReadMode == true) {
SGM.add(str);
// System.out.println(str);
}
}
}
System.out.println(SGM.size());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private String getData(String line, String key) {
int beginIndex = line.indexOf(key) + key.length() + 1;
int endIndex = line.lastIndexOf(key) - 2;
line = line.substring(beginIndex, endIndex);
return line;
}
private String getNewID(String line) {
int beginIndex = line.indexOf("NEWID") + new String("NEWID").length() + 2;
int endIndex = line.length() - 2;
return line.substring(beginIndex, endIndex);
}
private String isTrainingSet(String line) {
if (this.haveKey("YES", line)) {
if (this.haveKey("TEST", line)) {
if (!this.haveKey("NOT-USED", line)) {
return "TEST";
} else {
return "Unused";
}
} else if (this.haveKey("TRAIN", line)) {
return "TRAIN";
} else {
return "Unused";
}
} else {
return "Unused";
}
}
private Boolean haveKey(String key, String line) {
if (line.indexOf(key) > 0) {
return true;
} else {
return false;
}
}
}
ラベル:
test
登録:
投稿 (Atom)