読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

livedoor clipsのデータを少しだけ眺めてみた。

技術メモ データ分析

データ貰うだけもらって、放置していたlivedoor clipsのデータを覗いてみました。
クローリングしてる暇があるなら…論文かいたら? | EDGE Datasets(研究用データセット)
 ダウンロードと一緒に取り扱い説明がついています。そのままだとtagが文字列データとして1カラムに複数件入り使いにくいので、分割するようにしました。

#!/usr/bin/perl

use strict;
use Text::CSV_XS;

my $csv = Text::CSV_XS->new({ binary => 1 });
my $i = 1;
while (<>) {
    if ($csv->parse($_)) {
        my ($user_id, $url, $created_on, $tags) = $csv->fields;
        foreach my $tag (split(/\s/,$tags)) {
           print "\"$i\",\"$user_id\",\"$url\",\"$created_on\",\"$tag\"\n";
           $i++;
        }
   }
}
create table clips (
  id int auto_increment primary key,
  user_id int not null,
  url varchar(255) not null,
  timestamp timestamp not null default CURRENT_TIMESTAMP,
  tag varchar(255)
) DEFAULT CHARSET=utf8;
CREATE INDEX clips_key_tag on clips (
  tag
);

load data infile /vol/project/buzz/data/result.txt ignore
into table clips character set utf8 fields
terminated by ',' enclosed by '"' (id,user_id,url,@var1,tag)
set timestamp = str_to_date(@var1,"%Y-%m-%d %T");

mysql> select tag,count(*) from clips group by tag order by count(*) desc limit 50;
+--------------------+----------+
| tag                | count(*) |
+--------------------+----------+
| javascript         |    32520 | 
| web                |    28946 | 
| google             |    28036 | 
| css                |    24224 | 
| yuiseki            |    20466 | 
| ネタ               |    19685 | 
| tips               |    19265 | 
| Firefox            |    18544 | 
| あとで             |    17582 | 
| キャッシング       |    17498 | 
| 2ch                |    16980 | 
| ローン             |    16452 | 
| blog               |    15340 | 
| tool               |    15297 | 
| あとで読む         |    15111 | 
| まとめ             |    14995 | 
| design             |    14341 | 
| 未カテゴリ         |    13444 | 
| 審査               |    13274 | 
| hatena             |    12877 | 
| 金融               |    11651 | 
| Mac                |    11540 | 
| YouTube            |    11480 | 
| windows            |    11415 | 
| ajax               |    11401 | 
| perl               |    11358 | 
| LDR                |    10655 | 
| mobile             |    10402 | 
| clip               |     9774 | 
| software           |     9617 | 
| flash              |     9578 | 
| ruby               |     9506 | 
| programming        |     9475 | 
| ブラック           |     9326 | 
| PHP                |     9019 | 
| 社会               |     8984 | 
| news               |     8725 | 
| toread             |     8646 | 
| neta               |     8643 | 
| アダルト           |     8516 | 
| web2.0             |     8284 | 
| webdesign          |     8257 | 
| カード             |     8077 | 
| 動画               |     8074 | 
| 融資               |     8063 | 
| エロ               |     7972 | 
| 仕事               |     7954 | 
| Webee              |     7908 | 
| twitter            |     7901 | 
| webサービス        |     7748 | 
+--------------------+----------+

 割とブックマークスパムっぽいのがあります。キャッシング、Webee、融資、金融。ある程度判定出来ないかなと思って考えてみました。コーパスとして使う場合、なるべくスパムをはじいておきたいです。スパムのタグは、タグの数に比べてURLの分散が少ないはずと仮説を立てて試してみました。

まずは、タグ名とカウント数を格納するテーブルを作り、データを流し込みます。

mysql>
CREATE TABLE tags (
  id int auto_increment primary key,
  tag varchar(255),
  cnt int,
  url_cnt int
) DEFAULT CHARSET=utf8;

insert into tags
(tag,cnt)
select tag,count(*) from clips
group by tag
order by count(*) desc
;

perlでタグ付けされたURLの数を抽出して、tagsテーブルのurl_cntを更新するプログラムを書きます。
SQLはこんな感じです。

select count(*) url_cnt from (
              SELECT url,count(*) FROM clips WHERE tag=? 
              GROUP BY url
             ) AS A

結果は、以下の通りです。

mysql> select id,tag,cnt,url_cnt,url_cnt/cnt*100 rate  from tags order by cnt desc limit 50;
+----+--------------------+-------+---------+---------+
| id | tag                | cnt   | url_cnt | rate    |
+----+--------------------+-------+---------+---------+
|  1 | javascript         | 32520 |    7277 | 22.3770 | 
|  2 | web                | 28946 |   16843 | 58.1877 | 
|  3 | google             | 28036 |    7948 | 28.3493 | 
|  4 | css                | 24224 |    4424 | 18.2629 | 
|  5 | yuiseki            | 20466 |   19721 | 96.3598 | 
|  6 | ネタ               | 19685 |   11920 | 60.5537 | 
|  7 | tips               | 19265 |   10031 | 52.0685 | 
|  8 | Firefox            | 18544 |    4341 | 23.4092 | 
|  9 | あとで             | 17582 |   15024 | 85.4510 | 
| 10 | キャッシング       | 17498 |    1829 | 10.4526 | 
| 11 | 2ch                | 16980 |    7106 | 41.8492 | 
| 12 | ローン             | 16452 |    1764 | 10.7221 | 
| 13 | blog               | 15340 |    8151 | 53.1356 | 
| 14 | tool               | 15297 |    8404 | 54.9389 | 
| 15 | あとで読む         | 15111 |   10971 | 72.6027 | 
| 16 | まとめ             | 14995 |    5551 | 37.0190 | 
| 17 | design             | 14341 |    6363 | 44.3693 | 
| 18 | 未カテゴリ         | 13444 |    4990 | 37.1169 | 
| 19 | 審査               | 13274 |    1335 | 10.0573 | 
| 20 | hatena             | 12877 |    3351 | 26.0231 | 
| 21 | 金融               | 11651 |    1413 | 12.1277 | 
| 22 | Mac                | 11540 |    3817 | 33.0763 | 
| 23 | YouTube            | 11480 |    4056 | 35.3310 | 
| 24 | windows            | 11415 |    4375 | 38.3268 | 
| 25 | ajax               | 11401 |    3350 | 29.3834 | 
| 26 | perl               | 11358 |    3325 | 29.2745 | 
| 27 | LDR                | 10655 |    8874 | 83.2848 | 
| 28 | mobile             | 10402 |    4628 | 44.4914 | 
| 29 | clip               |  9774 |    9364 | 95.8052 | 
| 30 | software           |  9617 |    5395 | 56.0986 | 
| 31 | flash              |  9578 |    3266 | 34.0990 | 
| 32 | ruby               |  9506 |    2645 | 27.8245 | 
| 33 | programming        |  9475 |    5095 | 53.7731 | 
| 34 | ブラック           |  9326 |     930 |  9.9721 | 
| 35 | PHP                |  9019 |    2406 | 26.6770 | 
| 36 | 社会               |  8984 |    5361 | 59.6728 | 
| 37 | news               |  8725 |    6029 | 69.1003 | 
| 38 | toread             |  8646 |    8371 | 96.8193 | 
| 39 | neta               |  8643 |    6824 | 78.9541 | 
| 40 | アダルト           |  8516 |     626 |  7.3509 | 
| 41 | web2.0             |  8284 |    4187 | 50.5432 | 
| 42 | webdesign          |  8257 |    4184 | 50.6722 | 
| 43 | カード             |  8077 |     767 |  9.4961 | 
| 44 | 動画               |  8074 |    3793 | 46.9780 | 
| 45 | 融資               |  8063 |    1034 | 12.8240 | 
| 46 | エロ               |  7972 |     510 |  6.3974 | 
| 47 | 仕事               |  7954 |    4053 | 50.9555 | 
| 48 | Webee              |  7908 |     110 |  1.3910 | 
| 49 | twitter            |  7901 |    1914 | 24.2248 | 
| 50 | webサービス        |  7748 |    4752 | 61.3320 | 
+----+--------------------+-------+---------+---------+

 ほぼスパムオンリーのWebeeなんかは、1.39%。カードやキャッシング、ローン等も10%程度。仮説が割とあってそうです。率が低いタグのURL先のコンテンツを教師データに使って、ブログスパムのスパムフィルターとか作れそうですね。後で試してみようと思います。後は、グルーピングやカテゴライズ等にも使えそうです。
 集合知プログラミングに書いていることが色々試せますね。ありがたい。



こんなに有益なデータを公開してくれたlivedoorには感謝感謝です。ただ一つだけ謝らないといけないことがあります。私は、livedoor clips使ったことありません。


See Also:
集合知プログラミングが凄すぎる件について

集合知プログラミング
Toby Segaran
オライリージャパン
売り上げランキング: 1799