Twitterで最近たま〜に流れてくる「日本人の名前の99%にサ行か濁音が入ってる」という噂。
言われてみれば確かに知ってる人名でそれに当てはまらない人は少ない気がするが、
僕は友達が少ないし、あまりテレビも見ないからちょっと確証が持てない・・・
そんなことを思っていたら、こんな検証を行なっている人を発見→「日本人の名前の99%にサ行か濁音が入ってる」って、本当? - Togetterまとめ
ちょっと面白そうなのとPerlのお勉強も兼ねて検証用のスクリプトを組んでみた。
1.そもそも名前のリストをどっから取ってくるか
さきの検証ではAKBとか内閣の人の名前が対象だったから偏りがある気がするけど、
かと言って一般人の名前をどこから集めてくれば良いだろう?
このご時世、個人情報にもうるさいし・・・と思っていたら、好き好んで自ら人名を登録するサービスが世の中にはありました。
世界のFacebook!
Facebookの友達リストから人名とってくりゃ良いじゃん!ということで下記のスクリプトを作成。
流れとしては
1.→のサイトを参考にFacebookページにログインDeveloper On Line: Using Perl Against Facebook - Part I: Login
2.友達一覧のページのURLより人名を取得
3.2で拾った人名のページにアクセスしてして再度友達一覧のページを表示
のくり返し。
#!/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request;
use Data::Dumper;
my $user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6';
our @header = ('Referer'=>'http://www.facebook.com', 'User-Agent'=>$user_agent);
our $cookie_jar = HTTP::Cookies->new(file=>'fbkCookies.dat',autosave=>1, ignore_discard=>1);
our $response;
our $browser = LWP::UserAgent->new;
$browser->cookie_jar($cookie_jar);
&login;
my $names;
my $name = '***.***.*'; #自分のFacebookページに行くと表示されてるURL末尾の名前(+人によっては数字)を入力
&get_friends($name, 3); #自分から数えて何人分の関係性まで辿るか
foreach my $name (keys %$names){
#名前っぽくなければスキップ
next unless $name =~ /^([a-zA-Z]+\.[a-zA-Z]+)(\.\d+)?$/ ;
print "$1\n"; #名前っぽい部分を出力
}
sub login{
my $email = '***@***';#ログインに使ってるメールアドレスを入力
my $password = '****'; #ログインに使ってるパスワードを入力
my %postLoginData;
$postLoginData{'email'}=$email;
$postLoginData{'pass'}=$password;
$postLoginData{'persistent'}=1;
$postLoginData{'login'}='Login';
$browser->get('http://www.facebook.com/login.php',@header);
$response = $browser->post('https://login.facebook.com/login.php',\%postLoginData,@header);
}
#指定された範囲の友達の名前を拾ってくる
sub get_friends{
my $name = shift;
my $count = shift;
$response = $browser->get("http://www.facebook.com/$name/friends" ,@header);
my $html = $response->content;
my @list;
push @list, $html =~ m{href="http://www\.facebook\.com/([^"?]*)" tabindex="-1"}g;
foreach my $name (@list){
next if defined $names->{$name};
$names->{$name} = 1;
&get_friends($name, $count - 1) if $count > 0;
}
}
※どうも上記スクリプトだと、1ユーザーあたりアクセスした瞬間に表示される友達一覧の16人分だけしか取得できないっぽい。
何かうまいことやって最終的に表示されてるページを取るか、あるいは雑に1ユーザーに対して何回もアクセスすることでもっと取れそうだけど、今回は正確に取ることよりも雑多にたくさん集めることが目的なので妥協。
※どうしてもハンドルネームや外人さんの名前が混入してしまうことについても、うまく弾く方法が思いつかなかったので今回は妥協。
2.拾ってきた人名から割合を算出
漢字表記の人名リストだったりすると難しそうだけど、幸いにして今回の方法ならローマ字表記の人名リストなので、
サ行→sが含まれるか、濁点→gzdbjが含まれるか
だけで判定できる。
そんなわけで下記のスクリプトで集計
ついでにアルファベットの登場回数の累計も出してみた
#!/bin/perl
use strict;
use warnings;
use Data::Dumper;
open my $fh, '<', $ARGV[0];
my $all = 0;
my $count = 0;
my $alp;
while (my $line = <$fh>){
$all++;
$count++ if $line =~ /[sgzdbj]/i;
my @alp_list;
push @alp_list,$line =~ /([^\.\n])/g;
$alp->{$_}++ for @alp_list;
}
print "all : $all\n";
print "count : $count\n";
printf "rate : %f\n", ($count / $all) * 100;
print "$_ : $alp->{$_}\n" foreach sort keys %$alp;
そんなわけで、3人分巡って作った191人分のリストを解析したところが↓
all : 191
count : 157
rate : 82.198953
J : 2
K : 1
S : 2
T : 1
a : 400
b : 21
c : 22
d : 36
e : 96
f : 9
g : 32
h : 136
i : 260
j : 21
k : 188
l : 12
m : 114
n : 109
o : 204
p : 8
r : 90
s : 146
t : 116
u : 157
w : 24
x : 2
y : 75
z : 20
「サ行濁点を含む」人は191人中157人で82%ちょいぐらい。
↓4人分で作った1373人分のリストを解析すると
※さすがに外国人っぽい名前の混入率も上がってきてしまうけど・・・
all : 1373
count : 1119
rate : 81.500364
A : 1
H : 3
I : 5
J : 1
K : 5
L : 1
M : 1
N : 2
O : 1
P : 2
R : 1
S : 7
T : 5
U : 1
V : 1
W : 1
Y : 4
Z : 1
a : 3034
b : 136
c : 179
d : 225
e : 533
f : 70
g : 206
h : 979
i : 2099
j : 127
k : 1340
l : 34
m : 897
n : 622
o : 1430
p : 20
q : 1
r : 590
s : 1064
t : 873
u : 1152
v : 5
w : 188
x : 3
y : 623
z : 161
「サ行濁点を含む」人は1373人中1119人で81%ちょいぐらい。
やっぱり、せいぜい8割ぐらいで「日本人の名前の99%にサ行か濁音が入ってる」の噂はガセなようだ。